Colocar uma palavra em uma grade do alfabeto

55

Inspirado por um meme que vi hoje mais cedo.

Descrição do Desafio

Considere uma grade de alfabeto infinita:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
...

Pegue uma palavra ( CODEGOLFneste exemplo) e faça dela uma subsequência da grade, substituindo letras não usadas por um espaço e removendo as letras no final da grade infinita:

  C           O           
   DE G       O           
           L              
     F

Exemplos

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

Notas

  • Espaços em branco à direita são permitidos.
  • Você não precisa preencher a última linha com espaços. Por exemplo, se a entrada for ABC, você poderá gerar apenas ABCsem 23 espaços à direita.
  • Você pode assumir que a entrada corresponderá a [A-Z]+regex.
  • Como alternativa, você pode usar o alfabeto em letras minúsculas; nesse caso, a saída corresponderá [a-z]+.
  • Você deve usar uma nova linha ( \n, \r\nou equivalente) para separar linhas, que é uma lista de strings não é um formato de saída adequada.
  • Este é um desafio do , portanto, faça o seu código o mais curto possível!
shooqie
fonte
As novas linhas principais são permitidas?
Erik the Outgolfer
@EriktheOutgolfer Claro, desde que não atrapalhe a estrutura da grade.
Shooqie #
Tudo bem se um erro não fatal interromper o programa?
Zacharý
@ Zacharý Embora eu possa ver como isso pode economizar alguns bytes, acho que é feio e produz resultados indesejados e supérfluos. Então não. EDIT: A menos que você possa fazer seu programa sair fatalmente através de um código de saída ou algo que não imprima o rastreamento da pilha de exceção ou algo semelhante ao stderr.
Shooqie 02/09
7
Caso de teste sugerido: BALLOON(dois caracteres adjacentes iguais).
Kevin Cruijssen

Respostas:

10

Casca , 15 bytes

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

Experimente online!

Explicação

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.
Zgarb
fonte
7

Java 10, 161 159 152 bytes

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 bytes graças a @Nevay .
Impressão de -7 bytes diretamente em vez de retornar uma String e converter em Java 10.

Explicação: "

Experimente aqui.

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

A primeira parte do método divide a palavra de entrada em partes com um delimitador.
Por exemplo: CODEGOLFCO;DEGO;L;Fou BALLOONB;AL;LO;O;N.

A segunda parte faz um loop sobre essas partes e usa o regex [^...]para substituir tudo que não corresponde a um espaço.
Por exemplo, .replaceAll("[^CO]"," ")deixa o C, e O, e substitui todo o resto por um espaço.

Kevin Cruijssen
fonte
11
Não seria B;AL;LO;O;N?
NieDzejkob 04/04
11
-2 bytes: for(char c:s)x+=p<(p=c)?c:";"+c;.
Nevay 04/04
4

Perl 5 , 44 bytes

Código de 40 bytes + 4 para -lF.

print map/$F[0]/?shift@F:$",A..Z while@F

Experimente online!

Dom Hastings
fonte
O link que você postou é da versão de 46 bytes.
@ThePirateBay Thanks !! Eu sabia que não tinha atualizado alguma coisa!
Dom Hastings
4

JavaScript (ES6), 79

Editar Como uma nova linha principal é aceita, eu posso salvar 2 bytes

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

Por mais 1 byte, posso aceitar entrada em minúsculas ou maiúsculas:

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

Menos golfe

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
}  

Teste

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>

edc65
fonte
Você pode substituir \npor uma nova linha literal dentro dos backticks por -1 byte.
Justin Mariner
@JustinMariner não, eu não posso, não dentro da aspas duplas em eval
edc65
Oh, certo, isso é uma pena. Minha culpa.
Justin Mariner
4

MATL , 24 23 bytes

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

Usa letras minúsculas.

Experimente no MATL Online!

Explicação

''     % 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
Luis Mendo
fonte
4

Japonês , 18 16 bytes

-2 bytes graças a @Shaggy

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

Somente entrada em maiúsculas.

Experimente online!

Explicação

;

Alterne para variáveis ​​alternativas, onde Bestá o alfabeto maiúsculo.

ò¨

Divida a sequência de caracteres de entrada entre os caracteres em que o primeiro é maior ou igual a ( ¨) o segundo.

£

Mapeie cada partição pela função, onde Xestá a partição atual.

Mapeie cada caractere no alfabeto maiúsculo para o seguinte, com Za letra atual.

kX

Remova todas as letras da partição atual da letra atual. Se a letra atual estiver contida na partição atual, isso resultará em uma sequência vazia.

?S:Z

Se for verdade (não uma sequência vazia), retorne um espaço ( S), caso contrário, retorne a letra atual.

·

Associe o resultado da linha anterior com novas linhas e imprima o resultado.

Justin Mariner
fonte
10 bytes para r"[^{Z}]"Sparece um pouco ridículo, mas eu não consigo encontrar nenhuma maneira melhor ou ...
ETHproductions
17 bytes
Shaggy
16 bytes
Shaggy
@ Shaggy Bom pensamento com kX!
Justin Mariner
Na verdade eu acho que você pode mudar kX ?S:Zpara oX ªSsalvar dois bytes
ETHproductions
3

Pitão, 18 bytes

#pbVGp?JqhzNNd=>zJ

Experimente aqui.

Nova linha principal na saída, alfabeto em minúsculas.

Erik, o Outgolfer
fonte
3

Geléia , 19 bytes

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

Experimente online!

Erik, o Outgolfer
fonte
OI<1®;-> >2\0;para salvar um byte (Eu realmente fiz >2\0;œṗµØAf€ȯ€⁶µ€Ypara 18 também, que eu pessoalmente acho mais fácil de analisar)
Jonathan Allan
@ JonathanAllan Eu acho que isso falharia BALLOONou algo assim.
Erik the Outgolfer
Você está correto, sim - portanto, seria necessário outro byte com algo como <2\1;¬; Ah bem.
Jonathan Allan
@ JonathanAllan De qualquer forma, implementarei sua ideia na minha resposta ... pronto.
Erik the Outgolfer
3

C (gcc), 91 63 bytes

-28 graças ao ASCII-only

_;f(char*s){for(_=64;*s;)putchar(++_>90?_=64,10:*s^_?32:*s++);}

Experimente online!


Anterior:

i,j;f(char*s){while(s[i]){for(j=65;j<91;j++)s[i]==j?putchar(s[i++]):printf(" ");puts("");}}

Sim, há uma solução mais curta, mas notei depois que escrevi esta ... Experimente online!

MD XF
fonte
82 bytes , 80 se a nova linha inicial for permitida
somente ASCII
73
Somente ASCII
63
Somente ASCII
3

Mathematica, 101 bytes

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

Splita entrada em seqüências de letras estritamente crescentes, comparando letras adjacentes com Order. Se Order[x,y] == 1, então, xprecede yno alfabeto e, portanto, pode aparecer na mesma linha.

Para cada sequência de letras, crie um padrão para corresponder as strings Exceptdessas letras; #|##é uma abreviação de Alternatives. Substitua as letras Alphabetque correspondem ao padrão por espaços.


Ilustração das etapas intermediárias:

"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"," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "}}
hftf
fonte
2

Golfscript, 22 21 bytes

Experimente online!

-1 byte graças à redefinição final cuidadosa do nbuilt-in.

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

Explicação (com uma versão ligeiramente diferente):

{.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
Josiah Winslow
fonte
2

Retina , 80 bytes

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

Experimente online!

Sempre há exatamente uma nova linha principal. O código acrescenta um pouco de maneira desajeitada a palavra ao alfabeto, juntamente com um marcador (ponto e vírgula). Em seguida, move o marcador até a primeira letra da palavra, enquanto altera todas as outras letras que passa para os espaços. Também remove a primeira letra da palavra. Repete isso até que a primeira letra da palavra não esteja mais atrás do marcador. Em seguida, ele limpa esse marcador e o restante do alfabeto e o substitui por uma nova linha e o alfabeto por um marcador novamente. Ele continua repetindo isso até que a palavra de entrada esteja vazia e depois limpa o último alfabeto e marcador, deixando a saída desejada.

FryAmTheEggman
fonte
2

05AB1E , 18 bytes

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

Experimente online!

Ocorreu um problema com 05AB1E ć(extração 1) deixando uma lista / sequência vazia na pilha após a extração do último elemento. Essa solução seria 1-2 bytes mais curta se não fosse por isso.

ć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
escoteiro
fonte
Na verdade, ð,significa "imprimir um espaço e uma nova linha".
Erik the Outgolfer
Você está certo. Corrigido o código para realmente imprimir uma nova linha.
scottinet
2

Retina , 130 126 bytes

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

Experimente online! Editar: salvou 4 bytes usando o gerador de alfabeto do @ MartinEnder. Explicação:

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

Acrescente o alfabeto.

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

Alinhe o maior número possível de letras com sua posição no alfabeto.

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

Inicie uma nova linha antes da primeira letra que não pôde ser alinhada.

}`¶.*$

Exclua o alfabeto, mas faça tudo novamente até que não haja letras desalinhadas.

Neil
fonte
Isso parece imprimir apenas uma linha, não alinhando letras nas linhas subseqüentes.
Justin Mariner
@JustinMariner Meu erro, cometi um erro de digitação no meu último golfe e não o verifiquei corretamente.
Neil
2

q / kdb + , 48 45 bytes

Solução:

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

Experimente online!

Nota: O link é para uma porta K (oK) desta solução, pois não há TIO para q / kdb +.

Exemplos:

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

Explicação:

Q é interpretado da direita para a esquerda. A solução é dividida em duas partes. Primeiro, divida a sequência em que o próximo caractere é menor ou igual ao atual:

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

Em seguida, pegue uma sequência de 26 espaços em branco e aplique a entrada nos índices em que a entrada aparece no alfabeto e imprima em stdout.

"__________________________" -> __________________ST______

Demolir:

-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

Notas:

  • -3 bytes, substituindo prev pela versão K4
rua
fonte
2

Powershell, 70 63 bytes

-7 bytes obrigado @Veskah

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

Experimente online!

Explicação:

Para cada caractere no argumento dividido:

  • Seqüência de saída $xe $xvalor limpo ( rvé alias para Remove-Variable ), se um código do caractere atual for menor ou equivalente ( -le) a um código do caractere anterior.
  • Acrescente espaços e o caractere atual a $x, armazene-o $x. Também atualiza um valor de caractere anterior.

Última saída $x.

confuso
fonte
11
63 bytes usando splatting . Tentei usar |% *htpara salvar alguns bytes, mas parece que ele quebrou mesmo.
Veskah
1

Geléia , 24 21 bytes

3 bytes graças a Erik, o Outgolfer.

O64;I%26’⁶ẋЀ;"⁸Ẏs26Y

Experimente online!

Freira Furada
fonte
8
Acredito que isso falhe na entrada "BALLOON" - os caracteres repetidos estão na mesma linha.
Justin Mariner
1

JavaScript (ES6), 87 bytes

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

Aceita entrada em maiúsculas ou minúsculas. A saída corresponde ao caso da entrada.

Testes

Justin Mariner
fonte
1

Haskell, 81 74 73 bytes

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

Guardado 1 byte graças a Laikoni !

Experimente online.

Otimizações de Haskell Hugs

  1. O intérprete do Hugs me permite salvar mais um byte ao (!cycle$['A'..'Z']++"\n")invés de :,(!cycle(['A'..'Z']++"\n")) mas o GHC não gosta do primeiro . (Isso agora está obsoleto; Laikoni já reescreveu essa linha de uma maneira que economizou 1 byte.)

  2. Aparentemente, o Hugs também não requer parênteses ao redor do correspondente de padrão de lista, para que eu pudesse salvar mais dois bytes indo de: q@(w:y)!(x:z)para q@(w:y)!x:z.

Cristian Lupascu
fonte
Você pode salvar um byte com a=['A'..'Z']++'\n':a;(!a). Interessante agora que o Hugs parece ter regras um tanto frouxas.
Laikoni
@Laikoni Estou olhando Haskell há meses e não deixa de me surpreender. Eu amo o a=...:atruque. Obrigado!
Cristian Lupascu
Não sei se você está ciente disso, mas acho que vale a pena mencionar. A razão pela qual o Hugs é diferente aqui é que há menor precedência do operador para operadores definidos pelo usuário do que no ghc.
Assistente de trigo
@WheatWizard Eu não estava ciente. Isso faz todo o sentido, dado o erro que recebi no GHC.
Cristian Lupascu
1

Carvão , 15 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

 θ              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
Neil
fonte
1

K (ngn / k) , 29 28 bytes

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

Experimente online!

{ } função com argumento x

>':x para cada caractere, é maior que o caractere anterior?

~ negar

& onde (em que índices) temos verdadeiros

( )_xcortar xnesses índices, retornar uma lista de strings

{ }' para cada uma dessas cordas

`c$65+!26

o alfabeto inglês

x?encontre o índice da primeira ocorrência de cada letra em x, use 0N(um valor "nulo" especial) se não for encontrado

x@indexe xcom isso; indexando com 0Nretornos " ", então obtemos uma string de comprimento 26 na qual as letras xestão em suas posições alfabéticas e todo o resto é espaços

ngn
fonte
1

R , 129 117 bytes

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,,"")}

Experimente online!

Explicação (não destruída):

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.
Giuseppe
fonte
1

R , 95 bytes

Basta percorrer o alfabeto maiúsculo repetidamente enquanto avança um contador por 1 se encontrar a letra na posição contrária da palavra e imprimir a letra, um espaço caso contrário.

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

Experimente online!

J.Doe
fonte
1

GolfScript , 37 bytes

64:a;{.a>{}{'
'\64:a;}if.a-(' '*\:a}%

Experimente online!

Eu fiz um Golfscript com um nome diferente, mas tinha saída incorreta.

JosiahRyanW
fonte