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: CODEGOLFCO;DEGO;L;Fo BALLOONB;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.

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.