Como as cordas são torcidas
O algoritmo de torção é muito simples. Cada coluna é deslocada para baixo pelo seu índice (col 0 desce 0, col 1 move 1, ...). A mudança de coluna envolve o topo. Funciona assim:
aaaa
bbbb
cccc
Torna-se:
a
ba
cba
----
cba
cb
c
Com tudo sob a linha de embalagem para o topo. Exemplo real:
Original:
\\\\\\\\\\\\
............
............
............
Twisted:
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\
Entrada
A entrada é uma matriz de cadeias ou uma cadeia de linhas múltiplas. Todas as linhas têm o mesmo comprimento.
Saída
A corda torcida, saída de várias linhas para saída padrão (ou alternativa mais próxima).
Exemplos:
( >
indica entrada, o espaço à direita é importante)
>Hello, world!
>I am another
>string to be
>twisted!
Hwrmoe oo br!
Ieii ,dttr e
s lsna !ohl
ttaltgnw ed
>\\\\\\\\\\\\
>............
>............
>............
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\
>abcdefg
>.......
a.c.e.g
.b.d.f.
>abcdefghij
>..........
>..........
a..d..g..j
.b..e..h..
..c..f..i.
>\\\\.....././
>...../.......
>........././.
>..../.^\\....
\.........../
.\....^..../.
..\../.\../..
...\/...\/...
>cdeab
>deabc
>eabcd
>abcde
cbbbb
ddccc
eeedd
aaaae
>aeimquy37
>bfjnrvz48
>cgkosw159
>dhlptx260
ahknqx147
beloru258
cfipsvy69
dgjmtwz30
>abcdefghi
>jklmnopqr
>stuvwxyz1
>234567890
a3ume7yqi
jb4vnf8zr
skc5wog91
2tld6xph0
Respostas:
Braquilog , 5 bytes
Experimente online!
Obtém entrada como uma matriz de colunas (que parece estar dentro das especificações da pergunta).
iᵇ
- Para cada elemento da matriz, emparelhe-o com seu índice (com base em 0)ᵐ
- mapeie esse predicado para cada elemento do resultado:↻₎
- permita (a coluna) circularmente pela quantidade especificada como o último elemento (o índice)Facilmente estendido para uma versão que aceita uma única sequência de múltiplas linhas:
13 bytes
Experimente online!
fonte
Pyth, 11
Experimente aqui
fonte
APL (Dyalog) , 7 bytes
Requer
⎕io←0
Experimente online!
⍬⍋⍉
obtém o intervalo de 0 ao número de colunas⊖
invertidas,⊖⊖⍨⍬⍋⍉
gira verticalmente (verticalmente) a entrada (verticalmente) invertida e0,1..
⊖
inverte isso e retorna-a.fonte
Retina ,
1111019287 bytesA contagem de bytes assume a codificação ISO 8859-1.
Woo, resolveu-o em uma única substituição de regex. :) (As chances são de que haja uma solução mais curta usando várias, mas onde está a graça nisso ...)
Experimente online!
Explicação
Isso requer algum conhecimento básico de grupos de equilíbrio . Em resumo, o sabor regex do .NET permite capturar várias vezes com um único grupo, colocando todas as capturas em uma pilha. Essa pilha também pode ser removida, o que nos permite usá-la para contar coisas dentro do regex.
Isso envia uma captura para os dois grupos
1
e2
para cada personagem na frente da partida (na linha atual). Ou seja, conta a posição horizontal da partida.O resto está em um lookahead:
Combinamos cada linha e também a empurramos para o grupo
1
, de modo que o grupo1
agora é a soma da posição horizontal e vertical (onde a última é contada a partir da parte inferior ). Basicamente, isso rotula as diagonais da grade com valores crescentes começando no canto inferior esquerdo. Isso.*
apenas move o cursor do mecanismo para o final da string.Agora, passamos a um lookbehind, que corresponde da direita para a esquerda no .NET:
Isso irá aparecer repetidamente exatamente
H
capturas do grupo1
(ondeH
está a altura da entrada). O objetivo disso é pegar o módulo do grupoH
. Posteriormente, o grupo1
contém a linha (contada na parte inferior) a partir da qual escolher o novo caractere na coluna atual.Outro olhar para trás, novamente a partir da direita.
(?<-1>.+¶)*.+
agora usa group1
para encontrar a linha na qual escolher o novo caractere e, em seguida, o lookahead encontra a coluna correta usando group2
.O caractere desejado é capturado em grupo
3
e gravado de volta pela substituição.fonte
$+
parece útil ... especialmente se você só quer fazer uma substituição: ^)$+
é realmente muito inútil ... a sua inscrição no MSDN soa muito mais útil do que é porque isso implica que(a)|(b)
->$+$+
dobraria todos osa
s eb
s mas em vez disso ele remove todosa
s, porque ele só se refere ao sintaticamente último grupo . Isso significa que é apenas uma maneira de evitar contar todos os grupos se você for muito preguiçoso (como eu). Para jogar golfe, ele salva apenas bytes quando você tem mais de 9 grupos, o que provavelmente é bastante raro para começar.Regex.Replace
para o Retina, mas ainda não consegui implementá-lo).CJam, 13 bytes
Teste aqui.
Explicação
fonte
TeaScript, 10 bytes
Graças à sintaxe extremamente concisa do TeaScript 3, isso é realmente curto: D
Seria 1 byte mais curto se o loop Sigma não estivesse com erros
Experimente online
Explicação
fonte
Python 3, 164 bytes
Não é a melhor resposta, mas a primeira em Python ...
fonte
)
ou]
na maioria dos casos, por exemplo,''.join(l)for l in....
é perfeitamente válidoMATLAB,
9236 bytesSupondo que a sequência de entrada
s
já esteja na forma de uma matriz / matriz de caracteres 2D, por exemploExplicação: itere pelas colunas da matriz. Para cada coluna, execute um deslocamento circular de seus elementos pelo número de caracteres que é igual ao índice da coluna (-1 devido à indexação do MATLAB).
fonte
Braquilog , 96 bytes
Isso espera uma lista de cadeias de códigos de caracteres como entrada e sem saída, por exemplo
brachylog_main([`aaaa`,`bbbb`,`cccc`],_).
Essa é uma resposta ridiculamente longa e provavelmente existe uma maneira muito mais curta de fazer isso.
Explicação
fonte
JavaScript,
9289 bytes3 bytes de desconto, graças à @ Neil .
Mostrar snippet de código
fonte
replace
:m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j])
.[...m].map(
todo o caminho até e incluindo o primeiro.join
.Python 2, 115 bytes
Graças à maravilha de
zip
conseguir reduzir isso a uma linha. Veja em ação aqui .fonte
MATL , 18
21bytesA entrada é do formato
Experimente online!
Como funciona :
fonte
F #, 105 bytes
Minha primeira tentativa (apenas um
\n
personagem é necessário):Uso:
fonte
JavaScript (ES6), 73 bytes
Explicação
Teste
Mostrar snippet de código
fonte
Japonês, 29 bytes
Teste online!
Como funciona
fonte
Haskell, 81 bytes
reimplementação do exemplo CJam, embora o reverso, o mapa e a enumeração façam parte do mapAccumR, o snd remove o acumulador, pois não precisamos mais dele, a reversão é apenas um efeito colateral da dobra direita.
fonte
Haskell, 65 bytes
Exemplo de uso:
g ["1111","2222","3333"]
->["1321","2132","3213"]
.fonte
MATL , 9 bytes
Experimente online!
Bastante similar ao núcleo da resposta MATL existente de Luis Mendo , mas mais curto usando recursos que provavelmente não estavam na linguagem naquele momento: 1.
"
itera através das colunas de uma matriz automaticamente agora, portanto, nenhum negócio caro de construir índices de coluna e indexá-los ( este é o biggie), 2.&h
como uma maneira abreviada de dizerN$h
, e 3. fim implícito do loop, se]
não for especificado.Como alternativa, pelo mesmo número de conta:
Experimente no MATL Online
fonte
C (clang) , 114 bytes
Trabalha no GCC sob MinGW. O GCC do TIO fica confuso ao usar
strlen
na expressão init do primeiro loop for.Experimente online!
fonte