O peixe amado que nada através do código de > <> (uma linguagem de programação esotérica) foi retirado de seu ambiente natural. Essa mudança o tornou incapaz de se movimentar da maneira que costumava: o que costumava ser um movimento toroidal foi restrito ao simples movimento da esquerda para a direita. Mas os programas ainda são escritos como se os peixes fossem capazes de se mover através deles. É sua tarefa, prezado programador, escrever um programa para linearizar um programa> <>. E faça isso no menor número de bytes possível; peixes não têm memórias muito grandes.
Movimento em> <>
Em> <>, o movimento é toroidal e um caractere de cada vez. Isso significa que o peixe (o ponteiro) pode "enrolar" do final de uma linha até o início. Em> <>, o peixe também é capaz de se mover de cima para baixo, de baixo para cima e da direita para a esquerda, em contraste com a maneira como a maioria dos ponteiros se move. Portanto, esse padrão de movimento seria válido:
>>>^ >>>v
>>>^ v
e terminaria em um loop infinito (retornando à linha superior assim que ultrapassar o fundo infinitamente).
O peixe se move em uma grade de comprimento igual a max (comprimento da linha) e altura igual ao número de linhas.
Como você descobre para onde o peixe se move? Estes comandos alteram o vetor de direção do movimento (por exemplo, (-1,0)
significa da direita para a esquerda):
Command | Direction Change
---------------------------
> | (1,0) (default)
< | (-1,0)
^ | (0,1)
v | (0,-1)
/ | (x,y) -> (y,x)
\ | (x,y) -> (-y,-x)
| | (x,y) -> (-x,y)
_ | (x,y) -> (x,-y)
# | (x,y) -> (-x,-y)
; | (0,0)
Como observado, o peixe começa a se mover da esquerda para a direita, ou seja, com o vetor de direção (1,0)
. O peixe começa a analisar os comandos começando com o primeiro comando que vê e muda de direção se um comando corresponder a um dos alteradores de direção acima mencionados.
O peixe para de se mover quando vê um ;
e termina o programa.
Entrada
A entrada será um programa válido (por exemplo, não em loop infinito) fornecido através do STDIN. Você também pode ler um arquivo, se desejar. As linhas de cada programa não terão necessariamente o mesmo comprimento.
A entrada é fornecida como uma sequência, com novas linhas separando cada linha do programa.
Os programas não serão repetidos, o que também significa que sempre terminarão com a ;
.
Saída
A saída será o programa linearizado. Ou seja, você deve retornar todos os caracteres (incluindo trocadores de direção) que o peixe veria se executasse o programa "normalmente". Este é todos os caracteres em seu caminho para o ;
.
Se a entrada possui linhas de comprimento desigual e o peixe acaba se movendo ao longo de uma linha menor que o comprimento da linha mais longa, você deve tratá-lo como se o peixe estivesse se movendo sobre um espaço (consulte os casos de teste).
Os familiarizados com> <> saberão que os trocadores de direção não são a única maneira de fazer movimento, mas, por uma questão de simplicidade, trate a entrada como se fosse a única maneira de afetar o movimento.
Regras
- Aplicam-se brechas padrão
- Você pode escrever um programa ou função completo
- A entrada é fornecida através de STDIN ou um arquivo como uma sequência que contém as linhas do programa separadas por novas linhas (
\n
)- Você pode entender a entrada de maneira diferente, dentro do razoável (fique à vontade para me perguntar se você tem um tipo específico de entrada em mente). Você não pode preencher a entrada com espaços para que os comprimentos da linha correspondam.
- Consulte esta meta post sobre entrada flexível. No que se refere à publicação, o consenso geral deve ser o mais flexível possível dentro do razoável.
- A saída é uma sequência única através de STDOUT ou retornada pela função (dependendo do que você escolher, consulte a Regra 2)
Casos de teste
v >v
>abcv//;
gfed<^ih
v>abcv<defghi^//>v;
v >v
>abcv//;
gfed<^
v>abcv<defg ^//>v;
abcdef;
abcdef;
abcd|;
abcd|dcba;
abcd#;
abcd#dcba;
abcd\;
_
abcd\_\dcba;
^;
>abcde/
^jihg<
^ >abcde/ <ghij^a;
;
;
Respostas:
Röda ,
405393392391371366361236234232230223200 bytesExperimente online!
Verifique as saídas!
Explicação (desatualizada)
Edições
%
vez de verificar se x ou y está além dos limites, o que abriu caminho para mais 2!`\`
vez de"\\"
c=""
para a segunda linha e, em seguida, removeu a nova linha após elawhile
colchete de (obrigado a @fergusq por detectar isso)a=X
declarações if+1
no finalindexOf
e reestruturado para salvar 2 bytesuntil[c=";"]
vez dewhile[c!=";"]
l.=[" "]*L
fonte
x=((x+X)%#l)
vez dex+=X
. Infelizmente,(-1)%#l
ainda retorna-1
.y
muito:y=y%#f
.key
vez decmp
e use em{...}while[...]
vez dewhile[...]do ... done
.Python 2,
262243237235234233231221219218217 bytesAceita entrada como
['<line_1>', '<line_2>', ...]
Experimente Online!
-19 bytes graças a @math_junkie
-6 bytes graças a @ThisGuy
-2 bytes extraindo
max(map(L,i))
para uma variável (porque teoricamente é usada duas vezes).-1 byte, reduzindo o número de vezes que
i[y][x]
aparece.-1 byte usando
'\x00'
para que eu não precise fazer a[1:]
parte dao[1:]
saída-2 bytes usando em
\0
vez de\x00
-10 bytes, graças ao @KritixiLithos por perceber que eu posso preencher o quanto quiser do lado direito, porque o extra será ignorado
(não mudança byte) bug fixo porque variável extraído estava fora de lacete
-2 bytes porque agora só uso
len
2 vezes de modo a reatribuição leva 2 bytes adicionais-2 byte, usando
while';'not in o
em vez dewhile o[-1]!=';'
e usando emo=''
vez deo='\0'
. Isso não apenas salva 2 bytes, mas também elimina o byte nulo principal, que tecnicamente não era realmente válido.Explicação
fonte
try
desde se não for encontrado: TIOfind
-1
len
a uma variável, por exemplo,L
para salvar 3 bytes e outros 4, alterando a atribuição de0
múltiplas linhas para 1 linhax=y=k=0
.Ruby,
274200187183Raspou apenas mais alguns caracteres soltando a matriz de momento
d
,.Estou muito orgulhoso deste. Isso foi divertido! Ele pega uma matriz de strings e retorna a string apropriada.
Comentado abaixo.
fonte
PHP 7,
291260 bytesfonte
JavaScript,
242236235231220 bytesExperimente online!
fonte