Inserisci una parola in una griglia alfabetica


55

Ispirato a un meme che ho visto prima oggi.

Descrizione della sfida

Considera una griglia alfabetica infinita:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
...

Prendi una parola ( CODEGOLFin questo esempio) e rendila una sottosequenza della griglia, sostituendo le lettere inutilizzate con uno spazio e rimuovendo del tutto le lettere alla fine della griglia infinita:

  C           O           
   DE G       O           
           L              
     F

Esempi

STACKEXCHANGE

                  ST      
A C       K               
    E                  X  
  C    H                  
A            N            
      G                   
    E

ZYXWVUTSRQPONMLKJIHGFEDCBA

                         Z
                        Y 
                       X  
                      W   
                     V    
                    U     
                   T      
                  S       
                 R        
                Q         
               P          
              O           
             N            
            M             
           L              
          K               
         J                
        I                 
       H                  
      G                   
     F                    
    E                     
   D                      
  C                       
 B                        
A

F

     F

ANTIDISESTABLISHMENTARIANISM

A            N     T      
        I                 
   D    I         S       
    E             ST      
AB         L              
        I         S       
       H    M             
    E        N     T      
A                R        
        I                 
A            N            
        I         S       
            M

Appunti

  • Gli spazi bianchi finali sono consentiti.
  • Non è necessario riempire l'ultima riga con spazi. Ad esempio, se l'input è ABC, è possibile produrre solo ABCsenza 23 spazi finali.
  • Puoi supporre che l'input corrisponda a [A-Z]+regex.
  • In alternativa, è possibile utilizzare l'alfabeto minuscolo, nel qual caso l'output corrisponderà [a-z]+.
  • È necessario utilizzare un ritorno a capo ( \n, \r\no equivalente) per linee separate, che è una lista di stringhe non è un formato di output corretto.
  • Questa è una sfida di , quindi rendi il tuo codice il più breve possibile!

Sono consentite le nuove linee principali?
— Erik the Outgolfer,

@EriktheOutgolfer Certo, purché non rovini la struttura della griglia.
— shooqie,

Va bene se un errore non fatale arresta il programma?
— Zacharý,

@ Zacharý Anche se riesco a vedere come ciò potrebbe salvare alcuni byte, penso che sia brutto e produca output superflui indesiderati. Quindi no. EDIT: A meno che non sia possibile far uscire il programma in modo non fatale tramite un codice di uscita o qualcosa che non stampi la traccia dello stack delle eccezioni o qualcosa di simile a stderr.
— shooqie,

7
Caso di prova suggerito: BALLOON(due caratteri adiacenti uguali).
— Kevin Cruijssen,

Risposte:


10

Buccia , 15 byte

TṪS`?' €…"AZ"ġ>

Provalo online!

Spiegazione

TṪS`?' €…"AZ"ġ>  Implicit input, e.g. "HELLO"
             ġ>  Split into strictly increasing substrings: x = ["H","EL","LO"]
        …"AZ"    The uppercase alphabet (technically, the string "AZ" rangified).
 Ṫ               Outer product of the alphabet and x
  S`?' €         using this function:
                   Arguments: character, say c = 'L', and string, say s = "EL".
       €           1-based index of c in s, or 0 if not found: 2
  S`?'             If this is truthy, then c, else a space: 'L'
                 This gives, for each letter c of the alphabet,
                 a string of the same length as x,
                 containing c for those substrings that contain c,
                 and a space for others.
T                Transpose, implicitly print separated by newlines.

7

Java 10, 161 159 152 byte

s->{var x="";int p=0;for(var c:s)x+=p<(p=c)?c:";"+c;for(var y:x.split(";"))System.out.println("ABCDEFGHIJKLMNOPQRSTUVWXYZ".replaceAll("[^"+y+"]"," "));}

-2 byte grazie a @Nevay .
-7 byte stampa direttamente invece di restituire una stringa e conversione in Java 10.

Spiegazione: "

Provalo qui.

s->{                      // Method with String parameter and no return-type
  var x="";               //  Temp-String
  int p=0;                //  Previous character (as integer), starting at 0
  for(var c:s)            //  Loop (1) over the characters of the input
    x+=p<(p=c)?           //   If the current character is later in the alphabet
                          //   (replace previous `p` with current `c` afterwards)
        c                 //    Append the current character to Temp-String `x`
       :                  //   Else:
        ";"+c;            //    Append a delimiter ";" + this character to Temp-String `x`
  for(var y:x.split(";")) //  Loop (2) over the String-parts
    System.out.println(   //   Print, with trailing new-line:
     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                          //    Take the alphabet,
        .replaceAll("[^"+y+"]"," "));}
                          //    and replace all letters not in the String-part with a space

La prima parte del metodo divide la parola di input in parti con un delimitatore.
Ad esempio: CODEGOLF→ CO;DEGO;L;Fo BALLOON→ B;AL;LO;O;N.

La seconda parte scorre su queste parti e usa la regex [^...]per sostituire tutto ciò che non corrisponde a uno spazio.
Ad esempio .replaceAll("[^CO]"," ")lascia C, e O, e sostituisce tutto il resto con uno spazio.


1
Non sarebbe B;AL;LO;O;N?
— NieDzejkob,

1
-2 byte: for(char c:s)x+=p<(p=c)?c:";"+c;.
— Nevay,




4

JavaScript (ES6), 79

Modifica Quando viene accettata una nuova riga iniziale, posso salvare 2 byte

s=>eval("for(o='',v=i=0;c=s.charCodeAt(i);v%=27)o+=v++?c-63-v?' ':s[i++]:`\n`")

Per 1 byte in più, posso accettare input in minuscolo o maiuscolo:

s=>eval("for(o='',v=i=0;c=s[i];v%=27)o+=v++?parseInt(c,36)-8-v?' ':s[i++]:`\n`")

Meno golf

s=>{
  var i,o,c,v
  for(o = '', v = 1, i = 0; c = s.charCodeAt(i); v %= 27)
    o += v++ ? c-63-v ? ' ' : s[i++] : '\n'
  return o
}  

Test

f=s=>eval("for(o='',v=i=0;c=s.charCodeAt(i);v%=27)o+=v++?c-63-v?' ':s[i++]:`\n`")

function update() {
  var i=I.value
  i=i.replace(/[^A-Z]/gi,'').toUpperCase()
  O.textContent=f(i)
}

update()
<input id=I value='BALLOON' oninput='update()' >
<pre id=O></pre>


È possibile sostituire il \ncon una nuova riga letterale all'interno dei backtick per -1 byte.
— Justin Mariner,

@JustinMariner no Non posso, non all'interno della doppia citazione in eval
— edc65

Oh giusto, è un peccato. Colpa mia.
— Justin Mariner,

4

MATL , 24 23 byte

''jt8+t1)wdh26X\Ys(26e!

Usa lettere minuscole.

Provalo su MATL Online!

Spiegazione

''     % Push empty string
jt     % Push input string. Duplicate
8+     % Add 8 to each char (ASCII code). This transforms 'a' 105,
       % 'b' into 106, which modulo 26 correspond to 1, 2 etc
t1)    % Duplicate. Get first entry
wd     % Swap. COnsecutive differences.
h      % Concatenate horizontally
26X\   % 1-based modulo 26. This gives a result from 1 to 26
Ys     % Cumulative sum
(      % Write values (converted into chars) at specified positions
       % of the initially empty string
26e    % Reshape into a 26-row char matrix, padding with char 0
!      % Transpose. Implicitly display. Char 0 is shown as space

4

Japt , 18 16 byte

-2 byte grazie a @Shaggy

;ò¨ £B®kX ?S:Z
·

Solo input maiuscoli.

Provalo online!

Spiegazione

;

Passa a variabili alternative, dove si Btrova l'alfabeto maiuscolo.

ò¨

Dividi la stringa di input tra caratteri in cui il primo è maggiore o uguale a ( ¨) il secondo.

£

Mappa ogni partizione con la funzione, dove si Xtrova la partizione corrente.

B®

Mappa ogni carattere dell'alfabeto maiuscolo al seguente, con Zla lettera corrente.

kX

Rimuovi tutte le lettere nella partizione corrente dalla lettera corrente. Se la lettera corrente è contenuta nella partizione corrente, si ottiene una stringa vuota.

?S:Z

Se ciò è vero (non una stringa vuota), restituisce uno spazio ( S), altrimenti restituisce la lettera corrente.

·

Unisci il risultato della riga precedente con le nuove righe e stampa il risultato.


10 byte per r"[^{Z}]"Ssembra un po 'ridicolo, ma non riesco nemmeno a trovare un modo migliore ...
— ETHproductions



@Shaggy Buon pensiero con kX!
— Justin Mariner,

In realtà penso che tu possa cambiare kX ?S:Zper oX ªSsalvare due byte
— ETHproductions,


3

Gelatina , 19 byte

<2\¬0;œṗfȯ⁶$¥€@€ØAY

Provalo online!


OI<1®;-> >2\0;per salvare un byte (in realtà l'ho fatto anche >2\0;œṗµØAf€ȯ€⁶µ€Yper 18, che trovo personalmente più facile da analizzare)
— Jonathan Allan,

@JonathanAllan Penso che fallirebbe BALLOONo qualcosa del genere.
— Erik the Outgolfer,

Hai ragione, sì - quindi richiederebbe un altro byte con qualcosa del genere <2\1;¬; Oh bene.
— Jonathan Allan,

@JonathanAllan Comunque, implementerò la tua idea nella mia risposta ... fatto.
— Erik the Outgolfer,


3

Mathematica, 101 byte

StringRiffle[
  Alphabet[]/.#->" "&/@
   (Except[#|##,_String]&@@@
     Split[Characters@#,#==1&@*Order]),"
",""]&

Splitl'input in sequenze di lettere strettamente crescenti, confrontando le lettere adiacenti con Order. Se Order[x,y] == 1, quindi xprecede yl'alfabeto e quindi può apparire sulla stessa riga.

Per ogni sequenza di lettere, crea un modello per abbinare le stringhe Exceptper quelle lettere; #|##è una scorciatoia per Alternatives. Sostituisci le lettere Alphabetche corrispondono al modello con spazi.


Illustrazione delle fasi intermedie:

"codegolf";
Split[Characters@#,#==1&@*Order]  &@%
Except[#|##,_String]&@@@         #&@%
Alphabet[]/.#->" "&/@               %
{{"c", "o"}, {"d", "e", "g", "o"}, {"l"}, {"f"}}

{Except["c" | "c" | "o", _String], 
 Except["d" | "d" | "e" | "g" | "o", _String], 
 Except["l" | "l", _String],
 Except["f" | "f", _String]}

{{" "," ","c"," "," "," "," "," "," "," "," "," "," "," ","o"," "," "," "," "," "," "," "," "," "," "," "},
 {" "," "," ","d","e"," ","g"," "," "," "," "," "," "," ","o"," "," "," "," "," "," "," "," "," "," "," "},
 {" "," "," "," "," "," "," "," "," "," "," ","l"," "," "," "," "," "," "," "," "," "," "," "," "," "," "},
 {" "," "," "," "," ","f"," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "}}

2

Golfscript, 22 21 byte

Provalo online!

-1 byte grazie all'attenta ridefinizione finale dell'integrato n.

{.n>{}{'
'\}if:n}%:n;

Spiegazione (con una versione leggermente diversa):

{.n>{}{"\n"\}if:n}%:n; # Full program
{                }%    # Go through every character in the string
 .n>         if        # If ASCII code is greater than previous...
                       # (n means newline by default, so 1st char guaranteed to fit)
    {}                 # Do nothing
      {"\n"\}          # Else, put newline before character
               :n      # Redefine n as the last used character
                   :n; # The stack contents are printed at end of execution
                       # Literally followed by the variable n, usually newline
                       # So because n is by now an ASCII code...
                       # ...redefine n as the new string, and empty the stack

2

Retina , 80 byte

^
;¶
{`;.*
¶;ABCDEFGHIJKLMNOPQRSTUVWXYZ
¶¶
¶
)+`;(.*)(.)(.*¶)\2
$.1$* $2;$3
;.*

Provalo online!

C'è sempre esattamente una nuova riga principale. Il codice in qualche modo antepone clandestinamente la parola con l'alfabeto insieme a un marcatore (punto e virgola). Quindi sposta l'indicatore fino alla prima lettera della parola, mentre cambia tutte le altre lettere che passa negli spazi. Rimuove anche la prima lettera della parola. Lo ripete fino a quando la prima lettera della parola non segue più il marcatore. Quindi cancella quel marcatore e il resto dell'alfabeto e lo sostituisce con una nuova linea e l'alfabeto di nuovo con un marcatore. Continua a ripetere questo fino a quando la parola di input è vuota, quindi pulisce l'ultimo alfabeto e marcatore, lasciando l'output desiderato.


2

05AB1E , 18 byte

ćIgµ¶?AvDyÊið?ë¼?ć

Provalo online!

Si è verificato un problema con 05AB1E ć(estratto 1) che ha lasciato una stringa / elenco vuota nello stack dopo aver estratto l'ultimo elemento. Questa soluzione sarebbe più corta di 1-2 byte se non fosse per quello.

ćIgµ¶?AvDyÊið?ë¼?ć  Implicit input 
ć                   Extract the 1st char from the string
 Igµ                While counter != length of the string
    ¶?              Print a newline
      Av            For each letter of the lowercased alphabet
        DyÊ         Is the examined character different from the current letter?
           ið?      If true, then print a space

              ë¼?ć  Else increment the counter, print the letter and push
                    the next character of the string on the stack

In realtà, ð,significa "stampare uno spazio e una nuova riga".
— Erik the Outgolfer,

Hai ragione. Risolto il problema con il codice per stampare effettivamente una nuova riga.
— scottinet,

2

Retina , 130 126 byte

$
¶A
{-2=`
$'
}T`RL`_o`.$
+`(?<=(.)*)((.).*¶(?<-1>.)*(?(1)(?!)).+\3.*$)
 $2
(?<=(.)*)((.).*¶(?<-1>.)*(?<-1>\3.*$))
¶$2
}`¶.*$

Provalo online! Modifica: salvato 4 byte utilizzando il generatore alfabetico di @ MartinEnder. Spiegazione:

$
¶A
{-2=`
$'
}T`RL`_o`.$

Aggiungi l'alfabeto.

+`(?<=(.)*)((.).*¶(?<-1>.)*(?(1)(?!)).+\3.*$)
 $2

Allinea il maggior numero possibile di lettere con la loro posizione nell'alfabeto.

(?<=(.)*)((.).*¶(?<-1>.)*(?<-1>\3.*$))
¶$2

Inizia una nuova riga prima della prima lettera che non può essere allineata.

}`¶.*$

Elimina l'alfabeto, ma ripeti tutto fino a quando non ci sono lettere disallineate.


Questo sembra stampare solo una riga, non allineare le lettere sulle righe successive.
— Justin Mariner,

@JustinMariner Mio male, ho fatto un refuso nel mio ultimo golf e non sono riuscito a controllarlo correttamente.
— Neil,

2

q / kdb + , 48 45 byte

Soluzione:

-1{@[26#" ";.Q.A?x;:;x]}@/:(0,(&)(<=':)x)_x:;

Provalo online!

Nota: il collegamento è a una porta K (oK) di questa soluzione in quanto non esiste un TIO per q / kdb +.

Esempi:

q)-1{@[26#" ";.Q.A?x;:;x]}@/:(0,(&)(<=':)x)_x:"STACKEXCHANGE";
                  ST
A C       K
    E                  X
  C    H
A            N
      G
    E

q)-1{@[26#" ";.Q.A?x;:;x]}@/:(0,(&)(<=':)x)_x:"BALLOON";
 B
A          L
           L  O
              O
             N

Spiegazione:

Q viene interpretato da destra a sinistra. La soluzione è divisa in due parti. Dividi innanzitutto la stringa in cui il carattere successivo è inferiore o uguale alla corrente:

"STACKEXCHANGE" -> "ST","ACK","EX","CH","AN","G","E"

Quindi prendi una stringa di 26 spazi vuoti e applica l'input ad esso negli indici in cui l'input appare nell'alfabeto e stampa su stdout.

"__________________________" -> __________________ST______

Abbattersi:

-1{@[26#" ";.Q.A?x;:;x]}each(0,where (<=':)x) cut x:; / ungolfed solution
-1                                                  ; / print to stdout, swallow return value
                                                  x:  / store input as variable x
                                              cut     / cut slices x at these indices
                            (               )         / do this together
                                     (<=':)x          / is current char less-or-equal (<=) than each previous (':)?
                               where                  / indices where this is true
                             0,                       / prepended with 0
                        each                          / take each item and apply function to it
  {                    }                              / lambda function with x as implicit input
   @[      ;      ; ; ]                               / apply[variable;indices;function;arguments]
     26#" "                                           / 26 take " " is "      "...
            .Q.A?x                                    / lookup x in the uppercase alphabet, returns indice(s)
                   :                                  / assignment
                     x                                / the input to apply to these indices

Appunti:

  • -3 byte sostituendo prev con la versione K4

2

Powershell, 70 63 byte

-7 byte grazie @Veskah

$args|%{if($_-le$p){$x;rv x}
$x=("$x"|% *ht($_-65))+($p=$_)}
$x

Provalo online!

Spiegazione:

Per ogni personaggio nell'argomento splatted:

  • Stringa di output $xe $xvalore chiaro ( rvè alias per Remove-Variable ), se un codice del carattere corrente è inferiore o equivalente ( -le) a un codice del carattere precedente.
  • Aggiungi spazi e il personaggio corrente a $x, memorizzalo in $x. Inoltre, aggiorna un valore di carattere precedente.

Uscita ultima $x.


1
63 byte usando splatting . Ho provato a usare |% *htper salvare alcuni byte ma sembra che si sia rotto anche.
— Veskah,



1

JavaScript (ES6), 87 byte

f=([...s])=>s[0]?(g=i=>i>35?`
`+f(s):(i-parseInt(s[0],36)?" ":s.shift())+g(i+1))(10):""

Accetta input maiuscoli o minuscoli. L'output corrisponde al caso dell'input.

test


1

Haskell, 81 74 73 byte

q@(w:y)!(x:z)|w==x=x:y!z|1<2=min ' 'x:q!z
x!_=x
a=['A'..'Z']++'\n':a
(!a)

Salvato 1 byte grazie a Laikoni !

Provalo online.

Ottimizzazioni di Haskell Hugs

  1. L'interprete Hugs mi permette di salvare un altro byte facendo (!cycle$['A'..'Z']++"\n")invece di :,(!cycle(['A'..'Z']++"\n")) ma a GHC non piace il primo . (Questo è ormai obsoleto; Laikoni ha già riscritto quella linea in un modo che ha salvato 1 byte.)

  2. Apparentemente, anche Hugs non richiede parentesi attorno al matcher pattern list, quindi potrei salvare altri due byte andando da: q@(w:y)!(x:z)a q@(w:y)!x:z.


È possibile salvare un byte con a=['A'..'Z']++'\n':a;(!a). Interessante ora che Hugs sembra avere regole un po 'più lassiste.
— Laikoni,

@Laikoni Sto guardando Haskell da mesi ormai e non smette di stupirmi. Adoro il a=...:atrucco. Grazie!
— Cristian Lupascu,

Non so se tu ne sia consapevole, ma penso che valga la pena menzionarlo. Il motivo per cui Hugs è diverso qui è che esiste una precedenza inferiore per gli operatori definiti dall'utente rispetto a ghc.
— Wheat Wizard

@WheatWizard non ne ero a conoscenza. Questo ha perfettamente senso, dato l'errore che ho riscontrato in GHC.
— Cristian Lupascu,



1

Carbone , 15 byte

Fθ«J⌕αι⁺ⅉ‹⌕αιⅈι

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

 θ              Input string
F «             Loop over characters
     α     α    Uppercase letters predefined variable
      ι     ι   Current character
    ⌕     ⌕     Find index
             ⅈ  Current X co-ordinate
         ‹      Compare
        ⅉ       Current Y co-ordinate
       ⁺        Sum
   J            Jump to aboslute position
              ι Print current character


1

K (ngn / k) , 29 28 byte

{{x@x?`c$65+!26}'(&~>':x)_x}

Provalo online!

{ } funzione con argomento x

>':x per ogni carattere, è maggiore del carattere precedente?

~ negare

& dove (a quali indici) abbiamo vero

( )_xtagliare xa quegli indici, restituire un elenco di stringhe

{ }' per ognuna di quelle stringhe

`c$65+!26

l'alfabeto inglese

x?trova l'indice della prima occorrenza di ogni lettera in x, usa0N (uno speciale valore "null") se non trovato

x@indicizzalo xcon quello; indicizzazione con 0Nritorni " ", quindi otteniamo una stringa di lunghezza 26 in cui le lettere xsono nelle loro posizioni alfabetiche e tutto il resto sono spazi


1

R , 129 117 byte

function(s){z={}
y=diff(x<-utf8ToInt(s)-64)
z[diffinv(y+26*(y<0))+x[1]]=LETTERS[x]
z[is.na(z)]=" "
write(z,1,26,,"")}

Provalo online!

Spiegazione (non golfizzato):

function(s){
 z <- c()                  # initialize an empty vector
 x <- utf8ToInt(s)-64      # map to char code, map to range 1:26
 y <- diff(x)              # successive differences of x
 idx <- cumsum(c(          # indices into z: cumulative sum of:
    x[1],                  # first element of x
    ifelse(y<=0,y+26,y)))  # vectorized if: maps non-positive values to themselves + 26, positives to themselves
 z[idx] <- LETTERS[x]      # put letters at indices
 z[is.na(z)] <- " "        # replace NA with space
 write(z,"",26,,"")        # write z as a matrix to STDOUT ("") with 26 columns and empty separator.

1

R , 95 byte

Basta scorrere ripetutamente l'alfabeto maiuscolo mentre si fa avanzare un contatore di 1 se si incontra la lettera nella posizione del contatore della parola e si stampa la lettera, uno spazio altrimenti.

function(s)while(F>""){for(l in LETTERS)cat("if"((F=substr(s,T,T))==l,{T=T+1;l}," "));cat("
")}

Provalo online!


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.