Dada uma lista de pelo menos duas palavras (feitas apenas com letras minúsculas), construa e exiba uma escada ASCII das palavras alternando a direção da escrita primeiro para a direita e depois para a esquerda, relativamente à direção inicial da esquerda para a direita .
Quando terminar de escrever uma palavra, mude a direção e só então comece a escrever a próxima palavra.
Se o seu idioma não suportar listas de palavras ou for mais conveniente para você, você pode inserir a entrada como uma sequência de palavras, separadas por um único espaço.
Espaços em branco à esquerda e à direita são permitidos.
["hello", "world"]
ou "hello world"
hello
w
o
r
l
d
Aqui começamos escrevendo hello
e quando chegamos à próxima palavra (ou no caso da entrada como uma string - é encontrado um espaço), alteramos a direção relativa para a direita e continuamos a escreverworld
Casos de teste:
["another", "test", "string"] or "another test string" ->
another
t
e
s
tstring
["programming", "puzzles", "and", "code", "golf"] or "programming puzzles and code golf" ->
programming
p
u
z
z
l
e
sand
c
o
d
egolf
["a", "single", "a"] or "a single a" ->
a
s
i
n
g
l
ea
Critérios de vencimento
O código mais curto em bytes em todos os idiomas vence. Não se deixe desencorajar pelas línguas do golfe!
Respostas:
Carvão , 9 bytes
Experimente online! Link é a versão detalhada do código. Explicação: Funciona desenhando o texto para trás, transpondo a tela após cada palavra. 10 bytes para entrada de sequência:
Experimente online! Link é a versão detalhada do código. Explicação: Desenha o texto para trás, transpondo a tela para espaços.
fonte
C (gcc) ,
947874 bytes-4 de Johan du Toit
Experimente online!
Imprime a escada, um caractere (da entrada) por vez. Usa uma sequência de palavras separada por espaço.
fonte
*s==32
para*s<33
salvar um byte.05AB1E ,
1916 bytes-3 bytes graças a @Emigna .
Experimente online.
Explicação geral:
Assim como @Emigna resposta 05AB1E 's (certifique-se de upvote-lo btw !!), eu uso o builtin lona
Λ
.As opções que eu uso são diferentes (no entanto, é por isso que minha resposta é mais longa ..):
b
(as strings a serem impressas): deixo a primeira string da lista inalterada e adiciono o caractere final a cada próxima string da lista. Por exemplo,["abc","def","ghi","jklmno"]
se tornaria["abc","cdef","fghi","ijklmno"]
.a
(os tamanhos das linhas): isso seria igual a essas strings,[3,4,4,7]
como no exemplo acima.c
(a direção para imprimir):,[2,4]
que mapearia para[→,↓,→,↓,→,↓,...]
Portanto, o exemplo acima faria o seguinte passo a passo:
abc
na direção2
/→
.cdef
na direção4
/↓
(onde o primeiro caractere se sobrepõe ao último caractere, e é por isso que tivemos que modificar a lista dessa maneira)fghi
na direção2
/→
novamente (também com sobreposição de caracteres iniciais / finais)ijklmno
na direção4
/↓
novamente (também com sobreposição)Explicação do código:
fonte
€θ¨õšsøJ
.€θ¨õšsøJ
sãoõIvy«¤})
,õUεXì¤U}
eε¯Jθ줈}
(as duas últimas exigem--no-lazy
). Infelizmente, esses são todos do mesmo tamanho. Isso seria muito mais fácil se uma das variáveis assumisse o padrão""
...""
... " Você está procurandoõ
ou quer dizer seX
/Y
/®
teria sido""
? Btw, agradável 13 byter no comentário da resposta de Emigna. Muito diferente do que o meu e o dele, com as instruções[→,↙,↓,↗]
que você usou.õ
não é uma variável. Sim, quero dizer uma variável com o padrão""
. Eu literalmente façoõU
no início de um dos trechos, portanto, se o X (ou qualquer outra variável)""
fosse o padrão , ele economizaria trivialmente dois bytes. Obrigado! Sim, ↙↗ é um pouco novo, mas eu tive a idéia de intercalar as gravações verdadeiras com gravações dummy de comprimento 2 da resposta de Emigna.05AB1E ,
1413 bytesGuardado 1 byte graças a Grimy
Experimente online!
Explicação
fonte
€Y¦
poderia ser2.ý
(não que ele salvasse quaisquer bytes aqui). E é a primeira vez que vejo o novo comportamento€
em comparação com o mapa regular sendo útil..ý
usado antes, mas nunca me usei, então não pensei nisso.€
é o mapa regular para mim e eu o uso com frequência, o outro é o mapa "novo";)Tela ,
17121110 bytesExperimente aqui!
Explicação:
fonte
JavaScript (ES8),
91 7977 bytesRecebe a entrada como uma matriz de palavras.
Experimente online!
Comentado
fonte
p
para acompanhar as terminações de linha é muito inteligente +1Python 2 , 82 bytes
Experimente online!
fonte
cérebro , 57 bytes
Experimente online!
Recebe entrada como strings separadas por NUL. Observe que isso está usando EOF como 0 e parará de funcionar quando a escada exceder 256 espaços.
Explicação:
fonte
.
caracteres na linha 3 (da versão comentada)? Eu estava tentando jogar com a entrada no TIO. No Mac, mudei o teclado para a entrada de texto Unicode e tentei criar novos limites de palavras digitando,option+0000
mas não funcionou. Alguma idéia por que não?-
vez de.
para a explicação. Para adicionar bytes NUL no TIO, recomendo usar o console e executar um comando como$('#input').value = $('#input').value.replace(/\s/g,"\0");
. Não sei por que o seu caminho não funcionouJavaScript, 62 bytes
Experimente online!
Obrigado Rick Hitchcock , 2 bytes salvos.
JavaScript, 65 bytes
Experimente online!
fonte
t
pora
e removendot=
Aheui (esótopo) ,
490458455 bytesExperimente online!
Golpeou ligeiramente usando caracteres de largura total (2 bytes) em vez de coreano (3 bytes).
Explicação
Aheui é esolang parecido com um befunge. Aqui está o código com a cor: 1 parte verifica se o caractere atual é espaço ou não.
2 partes verificam se as palavras foram escritas da direita para a esquerda ou de cima para baixo.
? 3 parte é a condição de quebra do loop que digita espaços.
? 4 partes verificam se o caractere atual é o fim da linha (-1).
A parte vermelha é a inicialização da pilha. Aheui usa pilhas (a partir
Nothing
deㅎ
: 28 pilhas) para armazenar o valor.A parte laranja pega input (
뱋
) e verifica se é espaço, subtraindo com32
(código de espaço ascii).Peça verde adicione 1 à pilha, que armazena o valor do espaço, se estiver escrevendo da direita para a esquerda.
A parte roxa é um loop para espaços de impressão, se for escrita de cima para baixo.
Peça cinza verifique se o caractere atual é
-1
, adicionando um ao caractere atual.A parte azul imprime o caractere atual e se prepara para o próximo caractere.
fonte
Japonês
-P
, 15 bytesTente
fonte
bash, 119 caracteres
Isso usa seqüências de controle ANSI para mover o cursor - aqui estou usando apenas salvar
\e7
e restaurar\e8
; mas a restauração deve ser prefixada\n
para rolar a saída, se ela já estiver na parte inferior do terminal. Por alguma razão, não funcionará se você ainda não estiver na parte inferior do terminal. * dar de ombros *O caractere atual
$c
é isolado como uma substring de caractere único da sequência de entrada$w
, usando ofor
índice do loop$i
como o índice da sequência.O único truque real que estou usando aqui é o
[ -z $c ]
que retornarátrue
, ou seja, a cadeia está em branco, quando$c
é um espaço, porque não está entre aspas. No uso correto do bash, você citaria a string que está sendo testada-z
para evitar exatamente essa situação. Isso nos permite alternar o sinalizador de direção$d
entre1
e0
, que é usado como um índice na matriz de seqüência de controle ANSI,X
no próximo valor não espacial de$c
.Eu estaria interessado em ver algo que usa
printf "%${x}s" $c
.Oh Deus, vamos adicionar um espaço em branco. Não consigo ver onde estou ...
fonte
Perl 6 , 65 bytes
Experimente online!
Bloco de código anônimo que pega uma lista de palavras e imprime diretamente no STDOUT.
Explicação
fonte
Carvão , 19 bytes
Entrada como uma lista de strings
Experimente online (detalhado) ou online (puro)
Explicação:
Loop no intervalo
[0, input-length)
:Se o índice for ímpar:
Imprima a sequência no índice
i
em uma direção descendente:E então mova o cursor uma vez para o canto superior direito:
Senão (o índice é par):
Imprima a string no índice
i
na direção correta regular:E então mova o cursor uma vez para o canto inferior esquerdo:
fonte
Python 2 ,
8988 bytesExperimente online!
fonte
C # (compilador interativo do Visual C #) , 122 bytes
Experimente online!
fonte
J ,
474543 bytesExperimente online!
Eu encontrei uma abordagem divertida e diferente ...
Comecei a mexer com as almofadas esquerdas e zíperes com gerúndios cíclicos e assim por diante, mas então percebi que seria mais fácil calcular a posição de cada letra (isso se resume a uma soma de varredura da matriz escolhida corretamente) e aplicar alterar
}
em branco lona na entrada arrasada.A solução é tratada quase inteiramente pela Amend
}
:; ( single verb that does all the work ) ]
garfo geral;
A parte esquerda arrasa a entrada, ou seja, coloca todas as letras em uma sequência contígua]
parte certa é a própria entrada(stuff)}
usamos a forma gerundial de alterar}
, que consiste em três partesv0`v1`v2
.v0
nos fornece os "novos valores", que são o raze (ou seja, todos os caracteres da entrada como uma string), então usamos[
.v2
nos dá o valor inicial, que estamos transformando. simplesmente queremos uma tela em branco de espaços com as dimensões necessárias.([ ' '"0/ [)
nos dá um tamanho(all chars)x(all chars)
.v1
seleciona em quais posições colocaremos nossos caracteres substitutos. Esse é o ponto crucial da lógica ...0 0
no canto superior esquerdo, notamos que cada novo personagem está 1 à direita da posição anterior (ou sejaprev + 0 1
) ou um abaixo (ou sejaprev + 1 0
). De fato, fazemos o primeiro "len da palavra 1" vezes, depois o último "len da palavra 2" vezes, e assim por diante, alternando. Então, apenas criaremos a sequência correta desses movimentos, depois digitalizaremos a soma deles, e teremos nossas posições, que serão colocadas em caixa, porque é assim que Amend funciona. O que segue é apenas a mecânica dessa idéia ...([: <@(+/)\ #&> # # $ 1 - e.@0 1)
#:@1 2
cria a matriz constante0 1;1 0
.# $
depois o estende para que tenha tantas linhas quanto a entrada. por exemplo, se a entrada contiver 3 palavras, ela produzirá0 1;1 0;0 1
.#&> #
a parte esquerda é uma matriz dos comprimentos das palavras de entrada e#
é copiada; portanto, copia0 1
"len da palavra 1" vezes, depois1 0
"len da palavra 2 vezes" etc.[: <@(+/)\
faz a soma e a caixa da digitalização.fonte
T-SQL, 185 bytes
Experimente online
fonte
Retina , 51 bytes
Experimente online!
Uma abordagem bastante direta que marca todas as outras palavras e aplica a transformação diretamente.
Explicação
Marcamos todas as outras palavras com ponto-e-vírgula, correspondendo a cada palavra, mas aplicando apenas a substituição às correspondências (que são zero indexadas) começando na correspondência 1 e depois 3 e assim por diante.
+(m
define algumas propriedades para os seguintes estágios. O sinal de adição inicia um loop "enquanto este grupo de estágios muda alguma coisa" e o colchete aberto indica que o sinal de mais deve ser aplicado a todos os estágios seguintes até que haja um colchete próximo à frente de um backtick (que é todos os estágios em este caso). Om
just diz ao regex para tratar^
como também correspondente do início das linhas, em vez de apenas do início da string.O regex real é bastante simples. Simplesmente combinamos a quantidade apropriada de material antes do primeiro ponto e vírgula e usamos a
*
sintaxe de substituição de Retina para inserir o número correto de espaços.Esta etapa é aplicada após a última para remover ponto e vírgula e espaços no final das palavras que mudamos para vertical.
fonte
Retina 0.8.2 , 58 bytes
Experimente online! O link inclui casos de teste. Solução alternativa, também 58 bytes:
Experimente online! O link inclui casos de teste.
Deliberadamente, não estou usando o Retina 1 aqui, para não obter operações com palavras alternativas de graça; em vez disso, tenho duas abordagens. A primeira abordagem divide todas as letras em palavras alternativas, contando os espaços anteriores, enquanto a segunda abordagem substitui espaços alternativos por novas linhas e, em seguida, usa os espaços restantes para ajudá-lo a dividir as palavras alternativas em letras. Cada abordagem deve então unir a última letra vertical à próxima palavra horizontal, embora o código seja diferente porque elas dividem as palavras de maneiras diferentes. O estágio final de ambas as abordagens preenche cada linha até que seu primeiro caractere não espacial seja alinhado sob o último caractere da linha anterior.
Note que não presumo que as palavras sejam apenas letras porque não preciso.
fonte
PowerShell ,
101 8983 bytes-12 bytes graças ao mazzy .
Experimente online!
fonte
& $b @p
(cada palavra como um argumento), 3) usar uma forma mais curta paranew line
constante. veja 3,4 linha neste exemplofoo
. veja o código .Given a list of at least two words...
PowerShell ,
7465 bytesExperimente online!
fonte
R , 126 bytes
Experimente online!
fonte
T-SQL, 289 bytes
Isso é executado no SQL Server 2016 e outras versões.
@ mantém a lista delimitada por espaço. @I rastreia a posição do índice na string. @S rastreia o número total de espaços a serem recuados a partir da esquerda. @B rastreia com qual eixo a corda está alinhada no ponto @I.
A contagem de bytes inclui a lista de exemplos mínimos. O script percorre a lista, caractere por caractere, e altera a cadeia de caracteres para que seja exibida de acordo com os requisitos. Quando o final da sequência é atingido, a sequência é impressa.
fonte
JavaScript (Node.js) , 75 bytes
Experimente online!
Explicação e ungolfed
fonte
Stax , 12 bytes
Execute e depure
fonte
Gelatina , 21 bytes
Experimente online!
Um programa completo que toma a entrada como uma lista de strings e gera implicitamente para stdout a palavra ladder.
fonte
C (gcc) ,
9387 bytesObrigado ao gastropner pelas sugestões.
Esta versão utiliza uma matriz de seqüências terminadas por um ponteiro NULL.
Experimente online!
fonte
Brain-Flak , 152 bytes
Experimente online!
Eu suspeito que isso possa ser mais curto combinando os dois loops para palavras ímpares e pares.
fonte
J,
3533 bytesEste é um verbo que recebe a entrada como uma única sequência de caracteres com as palavras separadas por espaços. Por exemplo, você poderia chamar assim:
A saída é uma matriz de letras e espaços, que o intérprete gera com novas linhas, conforme necessário. Cada linha será preenchida com espaços para que eles tenham exatamente o mesmo comprimento.
Há um pequeno problema com o código: ele não funcionará se a entrada tiver mais de 98 palavras. Se você deseja permitir uma entrada mais longa, substitua o
_98
no código por_998
para permitir até 998 palavras etc.Deixe-me explicar como isso funciona através de alguns exemplos.
Suponha que tenhamos uma matriz de letras e espaços que imaginamos ser uma saída parcial para algumas palavras, começando com uma palavra horizontal.
Como poderíamos acrescentar uma nova palavra antes disso verticalmente? Não é difícil: basta transformar a nova palavra em uma matriz de letras de coluna única com o verbo
,.
e anexar a saída à matriz de coluna única. (O verbo,.
é conveniente porque se comporta como uma função de identidade se você o aplicar a uma matriz, que usamos no golfe.)Agora não podemos simplesmente iterar essa maneira de acrescentar uma palavra como está, porque só teríamos palavras verticais. Mas se transpormos a matriz de saída entre cada etapa, todas as outras palavras serão horizontais.
Portanto, nossa primeira tentativa de solução é colocar cada palavra em uma matriz de coluna única e depois dobrá-las anexando e transpondo entre elas.
Mas há um grande problema com isso. Isso coloca a primeira letra da próxima palavra antes de virar um ângulo reto, mas a especificação requer que seja girada antes de colocar a primeira letra, portanto a saída deve ser algo como isto:
A maneira como conseguimos isso é reverter toda a cadeia de entrada, como em
use o procedimento acima para criar o zig-zag, mas girando somente após a primeira letra de cada palavra:
Em seguida, vire a saída:
Mas agora temos outro problema. Se a entrada tiver um número ímpar de palavras, a saída terá a primeira palavra na vertical, enquanto a especificação diz que a primeira palavra deve ser horizontal. Para corrigir isso, minha solução preenche a lista de palavras com exatamente 98 palavras, acrescentando palavras vazias, pois isso não altera a saída.
fonte