Dada uma string, você deve mover cada letra (a partir da primeira letra) pela sua posição no alfabeto. Se você chegar ao final da corda, você deve enrolar. Não letras não precisam ser movidas.
Exemplo:
Dog
D
é a quarta letra do alfabeto, então movemos quatro pontos para a direita. Depois de envolver, isso muda a string para oDg
. o
é a 15ª letra, (15 mod 3) = 0, para que não se mova. g
é a sétima letra - (7 mod 3) = 1, então a string se torna goD
.
hi*bye
h
é a 8ª letra, mova 8 pontos -hi*bye
=>i*hbye
i
é a 9ª letra, mova-a 9 pontos -i*hbye
=>*hbiye
b
é a 2ª letra, mova-a 2 pontos -*hbiye
=>*hiybe
y
é a 25ª letra, mova-a 25 pontos -*hiybe
=>*hibye
e
é a quinta letra, mova-a 5 pontos -*hibye
=>*hibey
As não letras não precisam ser movidas, mas ainda ocupam espaço.
cat
=>tca
F.U.N
=>.F.NU
mississippi
=>msiisppssii
Respostas:
CJam,
444240 bytesA saída contém um avanço de linha à direita.
Teste aqui.
Explicação
Em vez de mover as letras pela sequência, removo repetidamente uma letra, giro a sequência de acordo e reinsiro a letra. Há um problema para fazer isso: precisamos ser capazes de distinguir o início da string do final da string (o que não podemos após uma simples rotação). É por isso que inserimos um avanço de linha no final como um guarda (letra antes do avanço de linha é o fim da string, letra depois do início). O bônus é que isso retorna automaticamente a sequência final para a rotação correta, onde o avanço de linha realmente está no final da sequência.
Para ver por que isso acaba na posição correta, considere a última iteração do
hi*bye
exemplo. Depois de processarmos oe
, a sequência enumerada fica nesta posição:Primeiro, dividimos o avanço de linha e concatenamos as peças na ordem inversa:
O avanço de linha agora seria no início ou no final dessa sequência. Mas como o avanço de linha é apenas uma proteção que marca o final da sequência, isso significa que os caracteres estão na ordem correta. Agora, o avanço de linha não é uma letra, de modo que a matriz não é rotacionada. Assim, quando anexamos o avanço de linha, ele vai para onde ele pertence e tudo está na ordem que procuramos:
Alguns resultados adicionais se alguém quiser comparar casos de teste mais longos:
Eu gosto desse último. :)
fonte
Ruby 125
130 132 139bytesDemonstração on-line com testes: http://ideone.com/GYJm2u
A inicial (versão ungolfed): http://ideone.com/gTNvWY
Edit: Muito obrigado a manatwork por suas sugestões!
Edição 2 : contagem fixa de caracteres (eu estava inicialmente contando as terminações de linha CRLF.)
fonte
c.upcase.ord-64
→c.ord%32
.a.join
??? Quem é você e o que você fez com o w0lf? Ele certamente escreveria comoa*''
.while ... end
no meu código que esqueci de fazer isso. Obrigado por perceber!while ... end
em(...)while ...
?Python 3,
278275273270260258249248243238 bytesEu realmente deveria jogar isso melhor, mas aqui está a minha solução, graças a katenkyo por sua ajuda na lógica e a Cyoce e Mego por sua ajuda no golfe.
Edit: Finalmente, eu tenho isso para uma declaração de comparação. WOO! (E sim, eu poderia mudar isso
z=-z
paraa,m=m,a
bit, mas isso não salva bytes e atrapalhava o código mais do que eu pensava ser necessário)Editar: a contagem de bytes estava desativada.
Ungolfed:
fonte
p[j][0]
pode ser reduzido definindoJ=p[j];
no início e substituindo instâncias dep[j][0]
por #P[0]
p
diretamente, e não uma variável que tenha sidop[j]
atribuída a ela. Além disso, se você olhar para o meu histórico de revisões, eu tinha uma variávelk = p[j][0]
paraa<=k<=m
comparações, mas verificou-se que a quedak
era melhor porque salvei mais bytes nos recuos da linha extra para definirk
do que salvei usandok
.