Helloellolloloo Worldorldrldldd

50

Faça um programa que use a palavra que você digitou e adicione essa palavra à parte de trás de si menos sua primeira letra e depois repita até que todas as letras se esgotem. Por exemplo, catse tornaria catatt, e hellose tornaria helloellolloloo.

Insira
qualquer uma das 26 letras do alfabeto inglês. Pode haver várias palavras separadas por espaços, e a alteração deve ser aplicada a cada palavra.

Saída
A (s) palavra (s) inserida (s), com cada palavra colocada depois de si mesma com a primeira letra faltando e, em seguida, com a segunda letra faltando, e assim por diante até que não haja mais letras a serem adicionadas.

Mais exemplos:

ill eel saídas illlll eelell

laser bat saídas laserasersererr batatt

darth vader saídas dartharthrththh vaderaderdererr

Isso é código de golfe, então o código mais curto vence.

Esclarecimento:
Você pode tratar a entrada ou saída como uma lista. Você pode separar palavras usando nova linha em vez de espaço. Você pode adicionar um espaço à direita na entrada.

qazwsx
fonte
22
honestamente, a coisa de várias palavras é meio chata. Tudo o que faz é exigir uma divisão, aplicar a função em cada palavra e depois ingressar novamente. É também bastante debilitante para os lotes de esolangs que têm de verificar a existência de um espaço manualmente
Jo rei
4
Podemos considerar a entrada como uma lista de palavras e a saída como tal?
Quintec 18/09/18
4
Com que comprimento você precisa lidar com as palavras?
MickyT 19/09/19
5
É possível que as palavras sejam separadas por uma nova linha na saída (em vez de um espaço)?
jayce
10
1.Atualize as especificações com as novas permissões (E / S da matriz, espaço à esquerda, etc.). 2.Informe as soluções existentes, caso alguém possa salvar bytes aproveitando-as.
Shaggy

Respostas:

34

Japonês -m, 6 3 bytes

Entrada e saída são matrizes de palavras.

£sY

Tente


Explicação

        :For each word in the input array
£       :Map each letter at index Y
 sY     :  Slice the current word from index Y
Shaggy
fonte
11
Isso é realmente compacto. Agradável!
Qazwsx
9
@qazwsx: Agora 50% mais compacto!
Shaggy
11
Não há £dois bytes em UTF-8?
Vi.
7
@ Vi, não estou usando UTF-8 aqui.
Shaggy
36

brainfuck , 60 56 bytes

,[>++++++++[-<----<++++>>]<[>>]<[[<]>.[[-]>[.>]<[<]>]],]

Experimente online!

Requer um espaço à direita e imprime um espaço à esquerda. Ambos podem ser contornados, mas isso acaba em 112 bytes .

Explicação

,[  Loop over each byte of input
  Tape: 32 w o r-32 d'
  >++++++++[-<----<++++>>]   Subtract 32 from the character and add 32 to the previous char
  Tape: 32 w o r d-32 0'
  <[>>]<   If the last character was a space
  Tape: 32 w o r d-32 0'
  or
  Tape: 32 w o r d' space-32
  [
    [<]>.   Move to the end of the word and print out the space
    [   Loop over each letter
      [-]    Remove the first letter (initially space)
      >[.>]  Print the rest of the word
      <[<]>  Move back to the first letter
    ]
    Tape: clear
  ]
,]  Get the next byte of input
Brincadeira
fonte
21

Haskell, 36 21 bytes

map$concat.scanr(:)""

Experimente online!

Editar: -15 bytes, devido ao novo formato IO (lista de palavras em vez de palavras separadas por espaço)

nimi
fonte
Você pode cortar 5 caracteres substituindo scanr (:) ""por tails.
Frerich Raabe
11
@FrichichRaabe: sim, mas isso exigiria um import Data.Listque adicionasse 17 bytes à pontuação.
nimi
18

Perl -p, 36 25 23 bytes

s!\b|\S!$'=~s/ .*//r!eg

Experimente online!

Este é um único regsub. Primeiro, ele corresponde a todos os limites de palavras ou caracteres não espaciais:

[][H][e][l][l][o] [][W][o][r][l][d]

Observe que cada uma dessas correspondências deve ser substituída pelo restante da palavra:

[→Hello][Hello][ello][llo][lo][o→] (...)

Podemos fazer isso com a variável especial $', que armazena a parte da sequência após a partida. No entanto, precisamos aplicar o regsub aninhado s/ .*//a ele, que remove tudo após o primeiro espaço $', para se livrar das palavras restantes na entrada.

Obrigado a @nwellnhof por 2 bytes.

Maçaneta da porta
fonte
Você pode substituir [^ ]por \S.
Nwellnhof 19/09/19
17

Python 3 , 49 bytes

d=lambda s:' '.join(n+d(n[1:])for n in s.split())

Experimente Online!

Isso tira proveito do fato de que "".split()retorna uma matriz vazia para que atue como a verificação do caso base na recursão.

Cameron Aavik
fonte
17

Geléia , 3 bytes

ḊƬ€

Experimente online!

Não Ké mais necessário s, já que a entrada / saída da matriz agora é permitida.

ḊƬ€
  €   For each word:
Ḋ       Remove the first letter
 Ƭ      until there are none left.
dylnan
fonte
Eu acho que você precisa ḊƬẎ)(ou ḊƬF), se preferir).
Erik the Outgolfer
@EriktheOutgolfer Acho que não. Cada palavra é representado por uma matriz separada na saída
dylnan
11
Não tenho certeza se você pode afirmar isso, já que as matrizes estão aninhadas e nada é especificado na pergunta para permitir isso.
Erik the Outgolfer
15

APL (Dyalog), 19 9 bytes

{⌽∊,\⌽⍵}¨

graças a @ H.PWiz por movimentar meu cérebro

Isso funciona porque todas as seqüências de caracteres no APL são matrizes de caracteres.

{⌽∊,\⌽⍵}¨ 
        ¨ - for each string
      ⍵} - string argument - ex. "hello"
     ⌽ - reverse - "olleh"
   ,\ - scan magic - "o" "ol" "oll" "olle" "olleh"
  ∊ - enlist(join together) "oolollolleolleh"
{⌽ - reverse - "helloellolloloo"

TIO

Quintec
fonte
15

JavaScript (ES6), 33 bytes

Guardado 1 byte graças a @ShieruAsakoto

Formato de E / S: matriz de palavras.

a=>a.map(g=w=>w&&w+g(w.slice(1)))

Experimente online!


JavaScript (ES6), 35 bytes

Formato de E / S: matriz de palavras.

a=>a.map(w=>w.replace(/./g,"$&$'"))

Experimente online!

Arnauld
fonte
2
44:s=>s.replace(/\S+/g,g=s=>s&&s+g(s.slice(1)))
Shieru Asakoto
11
Obrigado pelo meu "algo novo" por hoje; nunca soube sobre $'(ou $<backtick>).
Shaggy
13

R , 82 75 67 bytes

write(sapply(x<-scan(,""),substring,1:(y=max(nchar(x))),y),1,y,,"")

Experimente online!

Vários bytes salvos graças ao JayCe

Separa a saída com novas linhas.

A sapply(...)expressão gera um vetor de matriz / coluna das substrings apropriadas, preenchendo ""conforme necessário. writedepois imprime os elementos da matriz, ypor linha, separando-os com "".

Giuseppe
fonte
4
Jogou golfe de uma maneira diferente enquanto segurava um bebê sonolento; adicionará uma explicação mais tarde.
Giuseppe
2
Se o comprimento das palavras são restritas, por exemplo, 99 caracteres ou ~ 1E6 então você pode bater de um monte de bytes com ...substring,1:1e6,1e6)...ou similar
MickyT
2
Se você pode separar as palavras por uma nova linha: tio . Eu perguntei isso em um comentário. Pode trabalhar com o comentário de @ MickyT
JayCe 19/09/18
Olhares @JayCe como essa poderia ser 67 bytes antes de incorporar a sugestão de MickyT
Giuseppe
8

brainfuck , 94 93 bytes

-[-[-<]>>+<]>-<<+[[[-]<,[->+>+<<]>[-<+>]>>[-<->>+<]<]<<[>>+<<[-]]<[<]>[[.>]<[<]>[-]>]>>>>.<<]

Experimente online!

  • Salvo um byte graças ao Nitrodon - golfe .[-]>[.>]<[<]>para [.>]<[<]>[-]>.

Explicação

[[[ (dynamic) tape layout: ... NUL STR ... STR CHR FLG BUF SPC NUL ... ]]]

load a 32 into SPC
-[-[-<]>>+<]>-

while FLG
<<+[

 read a word
 [
  clear FLG; read CHR
  [-]<,
  copy CHR to BUF (using FLG as a temporary)
  [->+>+<<]>[-<+>]
  subtract SPC from BUF and save SPC
  >>[-<->>+<]
  move tape layout one to the right
  <
 ]

 strip trailing space; set FLG to true
 << [>>+<<[-]]
 to STR's first character
 <[<]>
 print word in all reduced forms
 [
  [.>]<[<]>[-]>
 ]

 print SPC; move to FLG
 >>>>.<<
]

Experimente online!

Atribuição

A coleção constante do cérebro de Esolang foi usada para a carga espacial inicial.

Jonathan Frech
fonte
Isso não parece terminar. Isso é pretendido?
Jo rei
11
@JoKing Yes. Em certas implementações, excederia o limite da fita, saindo por erro.
Jonathan Frech
6

05AB1E , 5 bytes

€.síJ

Experimente online!

Explicação

€.s        # push suffixes of each
   í       # reverse each
    J      # join suffixes
Emigna
fonte
11
Alternativa chata de 5 bytes: í€ηJí(como o prefixo é um byte embutido em vez de 2 bytes como sufixos; ainda requer um reverso adicional cada no entanto no início, portanto, a contagem de bytes permanece 5).
Kevin Cruijssen
6

Vim , 47 bytes (38 pressionamentos de tecla)

Comece com sua entrada como a única linha em um buffer do Vim.

:s/<Space>/\r/g<CR>ggqaywPlxqqb99@aj0q99@bgg99J

Explicação

Isso coloca cada palavra em sua própria linha, itera sobre cada linha e depois se junta a todas. Quebra se as palavras tiverem mais de 99 caracteres ou se sua entrada tiver mais de 99 palavras.

  1. :s/<Space>/\r/g<CR> substitui espaços por novas linhas ( \r)
  2. gg posiciona o cursor no início da primeira linha
  3. qacomeça a gravar a macro a :
    • yw puxa o resto da palavra
    • P coloca atrás do cursor
    • lx remove a primeira letra da última palavra
    • qpára de gravar a macro a
  4. qbcomeça a gravar a macro b :
    • 99@aexecuta macro um noventa e nove vezes (introduz o limite de caracteres)
    • j0 posiciona o cursor no início da próxima linha
    • qpara de gravar a macro b
  5. 99@bexecuta a macro b noventa e nove vezes (introduz o limite de palavras)
  6. gg posiciona o cursor na primeira linha
  7. 99J une as seguintes noventa e nove linhas com espaços (limite de palavras novamente)

Por mais 2 bytes (2 pressionamentos de tecla), você pode estender o limite de palavras para 999. Outros 4 bytes, 9999, etc.

chambln
fonte
6

Casca , 6 4 bytes

-2 bytes graças a Jonathan Allan (tomando a entrada como uma lista)!

moΣṫ

Experimente online!

Explicação

Recebe a entrada como uma lista de cadeias e mapeia a seguinte função:

Σṫ  -- example argument: "abc"
 ṫ  -- tails: ["abc","bc","c"]
Σ   -- concat: "abcbcc"
ბიმო
fonte
A divisão e junção possivelmente não são mais necessárias, atualmente essas especificações estão em um comentário.
Jonathan Allan
5

Retina 0.8.2 , 15 bytes

 
¶
.
$&$%'
¶
 

Experimente online! Nota: espaços à direita. Explicação:

Dividir em espaços.

.
$&$%'

Anexe seu sufixo a cada letra. Os %meios que obtemos apenas o sufixo da palavra.

Junte-se a espaços.

Neil
fonte
5

Pepe , 167 153 bytes

REEerEeeEeeeeeRrEEEEerEEEEEeerEErEEeerreErEEeErreEREEEEEEEreereErEerEEEErEEeerrEEreRRErEEEEreREEreeereReeRerEEEEEErEEEeerreEerEEeerEEEEerEEeEreereErEeree

Experimente online!

Indefinido
fonte
5

Código de montagem x86 de 16 bits, 24 bytes

     47             inc    di
     B020           mov    al,20h
l1:  3806           cmp    [si],al
     7212           jb     l5 ;less means end of string
     7401           je     l2  ;equal means space was seen
     4F             dec    di ;overwrite extra space
l2:  E80300         call   l3
     46             inc    si ;move to next character in word
     75F1           jne    l1
l3:  56             push   si
l4:  3806           cmp    [si],al
     A4             movsb      ;copy character
     77FB           ja     l4  ;until either zero or space is seen
     5E             pop    si
l5:  C3             ret

Chame com si = ponteiro para a string de origem, di = ponteiro para o buffer de saída.
A cadeia de origem requer um byte zero para finalizá-la.
O código é o mesmo em 16 ou 32 ou 64 bits (si / di se torna esi / edi ou rsi / rdi).
O código de 32 bits é dois bytes maior por causa da chamada expandida.
O código de 64 bits ainda é três bytes maior porque o inc / dec de rsi / rdi atrai um prefixo (mas se for sabido que eles estão no espaço de memória de 32 bits, eles podem ser esi / edi novamente para evitar essa penalidade) .

Peter Ferrie
fonte
4

MATL , 18 16 bytes

"@gXH"HX@Jh)]0&h

Entrada é uma matriz de células de palavras. Experimente online!

Explicação

"         % Implicit input: cell array of strings. For each cell
  @g      %   Push content of current cell, that is, a word
  XH      %   Copy into clipboard H
  "       %   For each letter
    H     %     Push word
    X@    %     Push iteration index
    Jh)   %     Index from that until the end into current word
  ]       %   End
  0       %   Push 0. Will be cast to char. Char(0) is displayed as space
  &h      %   Concatenate horizontally all elements so far. Implicit display
Luis Mendo
fonte
4

K4 / K (oK) , 9 bytes

Solução:

,/'(1_)\'

Experimente online!

Explicação:

,/'(1_)\' / the solution
        ' / apply to each
       \  / scan
   (  )   / do this together
    1_    / drop first
,/'       / flatten (,/) each (')
rua
fonte
4

C ++ (clang) , 174 bytes

#include<map>
#include<string.h>
std::string r(std::string w){while(auto x=strchr(w.c_str(),32))return r(w.substr(0,x-w.c_str()))+" "+r(x+1);return w!=""?w+r(w.substr(1)):w;}

Experimente online!

É a minha primeira submissão, e eu não sabia se retornar a string em vez de imprimir está ok :)

QJot
fonte
2
Bem-vindo ao PPCG! Sim, retornar uma string é bom. Espero que você fique por aqui!
Jo rei
Você pode usar a simetria do operador de desigualdade para remover um espaço e, assim, salvar um byte - return w!=""?pode ser return""!=w?.
Jonathan Frech 21/09
3

Carvão , 14 bytes

⪫E⪪S ⭆ι✂ιμLι¹ 

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

   S            Input string
  ⪪             Split on spaces
 E              Map over each word
      ι         Current word
     ⭆          Map over each character and join
        ι       Current word
         μ      Current index
           ι    Current word
          L     Length
            ¹   Literal 1
       ✂        Slice
⪫               Join with spaces
                Implicitly print
Neil
fonte
3

C (gcc) , 79 bytes

f(s,t)char*s,*t;{for(;*s;printf("%.*s",*s^32?t?t-s:~0:1,s),s++)t=strchr(s,32);}

Experimente online!

gastropner
fonte
3

Pip -s , 11 bytes

J_@>,#_Mq^s

Retorna a lista de palavras separadas por espaço de stdin. Experimente online!

Explicação

             s is space (implicit)
        q    Read a line of stdin
         ^s  Split it on spaces
       M     Map this lambda function to each word:
 _            The word...
  @>          sliced starting at index...
    ,#_       range(len(word))
              This creates len(word) slices ["word" "ord" "rd" "d"]
J             Join those into a single string
             The resulting list of modified words is printed; the -s flag uses space
             as the separator
DLosc
fonte
3

Python 2 , 63 bytes

lambda s:' '.join(map(g,s.split()))
g=lambda s:s and s+g(s[1:])

Experimente online!

TFeld
fonte
São 64 bytes no meu computador, Mac OS.
aydinugur 21/09
3

C #, 111 90 bytes

b=>string.Join(" ",(b.Split(' ').Select(x=>string.Concat(x.Select((y, i)=>x.Substring(i))))))

Experimente Online!

Alterando entrada e saída para matrizes, salvei alguns bytes:

b=>b.Select(x=>string.Concat(x.Select((y,i)=>x.Substring(i)))).ToArray()

Experimente Online!

LiefdeWen
fonte
3

K (oK) , 17 13 bytes

{,/|:'|,\|x}'

Experimente online!

Prefixar função anônima; A entrada é tomada como uma lista de cadeias, que por sua vez são listas de caracteres.

Obrigado @streetster por 4 bytes.

Como:

{,/|:'|,\|x}' //Main function, argument x → ("ill";"eel")
            ' // For each element of the argument
         |x}  // Flip it. x → ("lli";"lee")
       ,\     // Concatenate each element, keeping intermediates. x → (("l";"ll";"lli");("l";"le";"lee")
      |       // Flip it again. x → (("lli";"ll";"l");("lee";"le";"l"))
   |:'        // Now flip each element. x → (("ill";"ll";"l");("eel";"el";"l"))
{,/           // Concatenation scan. x → ("illlll";"eelell")
J. Sallé
fonte
Você pode retornar uma lista, também dar uma olhada no meu oK solução
streetster
@ streetster oh, bom. Ainda estou aprendendo K, então minhas soluções não serão tão curtas nem elegantes quanto eu gostaria. Obrigado pela atenção!
J. Sallé
Achatar antes permite inverter-lhe omitir o "reverso-cada", trazendo-o para baixo para 10 bytes: {|,/,\|x}'
hoosierEE
3

Lisp comum , 179 bytes

(defun r(s)(cond((endp s)nil)((eql(first s)#\Space)(princ " ")(r(rest s)))(t(q s)(r(rest s)))))(defun q (l)(cond((eql(first l)#\Space)t)((endp l)t)(t(princ(first l))(q(rest l)))))

Experimente online!

Esta é a minha primeira tentativa de jogar golfe.

JRowan
fonte
Olá e bem-vindo ao PPCG. Remover espaços em branco pode economizar 29 bytes .
Jonathan Frech
@Johnathan Frech graças i acaba de atualizar sem espaços
JRowan
Acho que você perdeu quatro espaços supérfluos.
Jonathan Frech 21/09
Provavelmente, você também pode usar em carvez de firste em cdrvez de restaumentar ainda mais sua submissão.
Jonathan Frech
Na, eu estou bem com isso agora haha, talvez eu volte e mexa com isso mais tarde. Im apenas aprender lisp agora meu professor disse para nunca usar carro e cdr então eles estavam fora da minha cabeça enquanto eu estava fazendo isso
JRowan
3

Lua , 70 bytes

for i=1,#arg do x=arg[i]for i=1,#x do io.write(x:sub(i))end print()end

Experimente online!

Explicação

Os argumentos em Lua são armazenados na tabela arginiciando no índice 1. O operador unário #retorna o tamanho da tabela e a função s:sub(a,b)retorna uma substring baseada na sequência sdelimitada por números inteiros ae b, se b não for passado, retornará o restante da sequência.

Eu tive que usar em io.write()vez de print()evitar quebras de linha e adicionei print()no final pelo motivo oposto.

Marcio Medeiros
fonte