Uma forma é quiral se nenhuma quantidade de rotação puder parecer com a imagem no espelho. Neste quebra-cabeça, estaremos escrevendo programas de computador quirais.
Para este quebra-cabeça, pensaremos em um programa como uma matriz retangular de caracteres. Como tal, todas as soluções para esse desafio devem ser retangulares (ou seja, todas as linhas devem ter o mesmo comprimento). Podemos rotacionar esses programas em incrementos de um quarto de volta. Por exemplo, o programa
The quickish fish
lept deftly
rightwards
Quando girado um quarto de volta no sentido horário, parece
T
h
r e
i
glq
heu
tpi
wtc
a k
rdi
des
sfh
t
lf
yi
s
h
Também podemos refletir esses programas. Aqui está o mesmo programa refletido em um eixo vertical:
hsif hsikciuq ehT
yltfed tpel
sdrawthgir
Um programa quiral é um programa que, quando girado qualquer número de vezes, sempre gera " left
". No entanto, quando refletido, produz um programa que " right
" produz, não importa quantas vezes ele é rotacionado.
Sua tarefa é escrever um programa quiral no menor número de bytes possível.
Regras adicionais
A saída não diferencia maiúsculas de minúsculas, mas deve ser consistente. (por exemplo, você pode imprimir "
LEFT
" e "rIgHt
", mas esta caixa deve ser consistente em rotações)As linhas devem ser divididas em uma nova linha ou em uma nova linha e em um avanço de linha.
Seu programa deve ser um retângulo, você pode preenchê-lo com espaços ou comentários, mas cada linha deve ter o mesmo comprimento.
Opcionalmente, você pode ter uma nova linha à direita (ou nova linha e avanço de linha) em todos os seus programas, se desejar.
fonte
:set virtualedit=all
modo de bloco do Vim . ABool
saída inicial verifica se a entrada é igual à sua própria rotação, o que simplifica as coisas. Removendo o{-
faz imprimir a entrada refletida.Respostas:
Pascal (FPC) ,
2161755349 bytesTente à esquerda
Tente direito
@tsh me motivou a tentar novamente quando vi seu programa (no comentário) e aqui está ele!
Anterior com 755 bytes:
Tente à esquerda
Tente direito
Se você viu meu envio anterior, esqueça: :)
Todas as rotações para os programas esquerdo e direito são iguais.
fonte
Klein (000) ,
10987 bytesExperimente online!
Deve ser possível obter uma versão mais curta desta resposta, então boa sorte!
Esta resposta é inspirada em espirais. Em particular, a ideia são duas espirais entrelaçadas, uma para a esquerda e outra para a direita. Tem simetria dupla, para que possamos verificar os seguintes programas para saber se funciona:
Quarto de volta
Experimente online!
Espelhado
Experimente online!
Espelhado e quarto de volta
Experimente online!
fonte
Klein (000) ,
2725 bytesExperimente online! Rodado uma vez! Rodado duas vezes! Rodado três vezes!
E virou: Experimente online! Rodado uma vez! Rodado duas vezes! Rodado três vezes!
O único que me deu um pouco de dificuldade foi o inverter e girar uma vez, que se parece com:
Esta é a única razão para os dois conjuntos de
((
.fonte
Klein (211) , 37 bytes
Isso tem um programa diferente para cada rotação.
Explicação
Observe que cada um desses programas é preenchido com um quadrado sem ops antes da execução
Sem alteração
Experimente online!
!
faz a execução saltar sobre\
e"left"@
carregar a string"left"
na pilha e finaliza o programa imprimindo a pilhaQuarto de volta
Experimente online!
A execução sai do canto superior direito do quadrado, continua no canto inferior esquerdo e mais uma vez é
!\"left"@
impressa"left
.Meia volta
Experimente online!
Aqui, o caminho de execução sai do lado norte, entra novamente no lado oeste e sai novamente do leste. Antes de entrar no sul.
\
salta o caminho"left"@
para imprimi-lo.Volta de três quartos
Experimente online
A execução sai do canto superior direito e depois entra novamente no canto inferior esquerdo. Mais uma vez, os espelhos
/\
redirecionam o caminho"left"@
para imprimi-lo.Reflexão
É essencialmente o mesmo que para a esquerda em todas as rotações.
fonte
JavaScript (Node.js) ,
1481599505461341305271 bytesEspelhado
Experimente online!
(Consulte o link TIO para todos os casos de teste, incluindo a versão espelhada)
Apesar de ainda
22x22 -> 21x21
jogar golfe , o tamanho do crédito da @JoKing!Tamanho
38x3824x2422x2221x2118x1817x1716x16, simetria 4 vezes.Aí vem uma pergunta - é possível ter 15x15 ou menor para JS? Parece que o que eu preciso no mínimo é o separador de comentários entre dois sub-blocos e na borda, então pelo menos 7 + 2 + 2 + 5 = 16 linhas?
fonte
Tela ,
1098971 bytesExperimente aqui | Tente invertido! Esses são os únicos dois programas possíveis, pois o programa é rotacionalmente simétrico.
Feito nisso .
fonte
Gol> <> , 23 bytes
Experimente online!
Esse é o mesmo formato da minha resposta Klein , mas 2 bytes mais curto. Talvez exista outra linguagem 2D por aí que possa tirar os últimos 2 bytes de folga ... Mas, por enquanto, isso é o mais curto possível.
fonte
Alice , 25 bytes
Esquerda: Normal , 1/4 de volta no sentido horário , 1/2 de volta , 1/4 de volta no sentido anti-horário
Direita: refletir em toda eixo horizontal , diagonal para baixo com o botão direito , eixo vertical , diagonal-se com o botão direito
Explicação
Este programa tem três partes. A primeira parte são os três se
{
um}
nos cantos. A{
volta do IP para a esquerda até atingir o}
ponto em que ele vira à direita. Na versão refletida, o IP percorre a linha superior do programa original. Na versão original, virar à direita atingirá imediatamente o adjacente{
, apontando o IP ao longo da linha inferior no programa original.A seguir, estão as duas barras na segunda coluna. Se o programa for orientado horizontalmente, qualquer tipo de barra simplesmente mudaria para o modo ordinal, enviando o IP na mesma direção esquerda / direita que ele já estava seguindo. Se o programa é orientado verticalmente, o IP salta um pouco mais, mas torná-los os dois barras dá o mesmo resultado. (Duas barras invertidas dariam o resultado oposto e uma de cada uma criaria um loop infinito.)
O restante do programa é direto. O IP no modo ordinal salta na diagonal, portanto,
"left"o@
ou"right"o@
será executado dependendo de como esta seção foi inserida.fonte
Hexagonia , 98 bytes
Experimente online! | Girado 90 ° | Girado 180 ° | Girado 270 °
Invertido | Girado 90 ° e invertido | Girado 180 ° e invertido | Girado 270 ° e invertido
A hexagonia foi divertida para esse desafio, porque uma rotação ou reversão pode mudar drasticamente o programa atual. Cada rotação / reversão é seu próprio programa. Alguns dos caminhos de execução do programa são muito mais interessantes que outros.
Eu admito que chegar a isso levou mais tempo do que provavelmente deveria. Tenho certeza de que uma resposta mais curta pode ser feita no Hexagony, então boa sorte!
fonte
Ruby , 131 bytes
Experimente online!
fonte
APL (dzaima / APL) , 181 bytes
O programa possui simetria rotacional, portanto, apenas dois casos precisam ser verificados
Esquerda
Experimente online!
Direito
Experimente online!
Explicação
Este é o meu primeiro programa APL, por isso é bastante simples. Ele usa apenas um truque que eu acho interessante.
Se começarmos a retirar todos os comentários, obteremos os seguintes programas
Esquerda
Direito
A partir do programa esquerdo, fazemos três coisas.
Atribuir
'lef'
à variávelt
Imprimir a variável
t
e a letra't'
Atribuir
'righ'
à variávelt
Agora, porque é o espelho, o programa certo executa essas três etapas, mas na ordem oposta. Isso significa que imprimimos
'left'
para o programa da esquerda e'right'
para o programa da direita.O único truque aqui é que na
't'
verdade vem de uma cópia girada do código. Se você olhar para a terceira coluna do nosso código, verá que é't'
. Reutilizamos isso't'
nas versões rotacionadas para acrescentar ot
que é necessário.fonte
Haskell ,
461379 bytes82 bytes salvos por Ørjan Johansen
Experimente online!
Como este possui simetria 4 vezes, você só precisa testar o espelho:
Experimente online!
Isso é um começo. Está longe do ideal, mas há algumas coisas interessantes acontecendo aqui. Haskell é certamente uma linguagem interessante para esse desafio. Estou ansioso por uma resposta que supere esta seja minha ou de outra pessoa.
fonte
Prolog (SWI) ,
649188 bytesUnflipped, Unrotated
Experimente online!
Não girado, girado
Experimente online!
Invertida, não rotacionada
Experimente online!
Virado, girado
Experimente online!
fonte
Prolog (SWI) ,
239223209181 bytesExperimente online!
Como o programa tem simetria em quatro dobras, você só precisa verificar o espelho:
Experimente online!
fonte
Python 2 , 209 bytes (14 x 14)
Normal (esquerda):
Experimente online!
Refletido (à direita):
Experimente online!
fonte
Limpo ,
13311055 bytes-276 bytes graças a Ørjan Johansen
Experimente "esquerda" online!
Tente "certo" online!
Isso foi difícil por vários motivos:
module <filename>
esteja presente no início e somente no início do arquivo. Infelizmente, isso significa que, para que as rotações do programa espelhado sejam válidas, ele também deve aparecer na parte inferior do arquivo. Para fazer esta pior,module ..
é inválido para globais,let .. in
,where ..
ewith ..
definições; e o token quemodule
aparece se não tiver sido definido causa um erro./* /* */
deixa em aberto um nível de comentário, e o mesmo acontece/* // */
(além de comentar o restante da linha).Felizmente, nós podemos definir
module
como algo em um#..
(deixe-before) expressão, que é toda a necessidade que nós. Como o Clean não verifica alternativas que nunca são usadas (e várias outras coisas igualmente não utilizadas), a segunda definição necessáriaStart
pode ser um lixo completo. Isso nos permite usar o segundoStart
para consumir o cabeçalho do módulo na parte inferior do arquivo, porque trata limpasm module m
como chamar a funçãom
demodule
em
(que desde que nós definidomodule
em
, não causa um erro). Não importa sem
é uma string e não uma função, porque aStart
alternativa nunca é verificada.É mais fácil ver se você olha através dos olhos do compilador:
fonte
m
es
.Braquilog , 341 bytes
Experimente online!
! enilno ti yrT
Aproveita que o Brachylog adote o predicado principal como aquele na primeira linha e não se preocupe muito com as outras linhas além de exigir que elas possam compilar. Não refletida, ela imprime uma sequência vazia seguida de "esquerda" na mesma linha e refletida exibe uma sequência vazia seguida de "direita" na mesma linha. Fico tentado a pensar que pode haver uma maneira de criar uma versão não quadrada (útil)
ṇ
, mas isso pode ser bastante complicado sem tentar fazê-la funcionar de maneira diferente sob reflexão.fonte
Ruby , 181 bytes
Experimente online!
Este é um porto da resposta Python de Curtis Bechtel para Ruby, jogou um pouco mais.
Na verdade, seu programa Python é um poliglota e roda em Ruby também, então minha primeira resposta foi uma cópia e pasta, mas parecia injusto. Então, eu escrevi um script que gera uma nova resposta a partir de um script base. Você pode tentar aqui:
Construa o seu próprio
fonte
Lote,
438321 bytesExplicação: A
:
é usado para indicar um rótulo, que é tão bom quanto um comentário, portanto, como o programa tem simetria rotacional, a única diferença entre as duas versões é qual das@
linhas é a primeira, e nesse caso umaleft
ouright
é emitida antes do script saídas.Tentei sobrepor criativamente as linhas giradas, mas minha tentativa acabou com uma grade maior.
Editar: salvou 117 bytes graças a @ ØrjanJohansen.
fonte
&rem
por&:
.test.bat
no prompt de comando do Win10.CMD.EXE
ou algo assim.05AB1E (legado) ,
8955 bytesAbordagem muito básica. Saídas em minúsculas.
Experimente on-line ou on -line refletido (cada rotação é a mesma).
Explicação:
Invertida:
Veja esta dica 05AB1E (seção Como usar o dicionário? ) Para entender por que
'…¸
é"left"
e'ĩ
é"right"
.fonte
q
?(legacy)
versão do 05AB1E.Stax , 131 bytes
Execute e depure
Essa é a variante "correta".
fonte
Encantos Rúnicos , 116 bytes
Experimente online!
E invertido
Não é exatamente uma porta, mas utilizou a resposta Klein 000 de Post Left Garf Hunter como ponto de partida, dada a quase compatibilidade típica dos dois idiomas (a maioria dos comandos é a mesma e o empacotamento de borda no Runic é idêntico ao Klein 000). O único problema era que os IPs Klein sempre começam do canto superior esquerdo e os da Runic não. Como tal,
.
todos fazem parte do código original e ainda são tratados como NOP pela Runic, enquanto ossão NOPs que tive que adicionar como parte do controle do fluxo.
Imprime
"left"
nas 4 rotações e"right"
quando espelhado (e nas quatro rotações). Duas colunas do meio ficaram completamente sem uso após minhas modificações, então pude removê-las.Em teoria, uma rotação com muito espaço em branco à direita poderia ser usada para uma contagem de bytes mais baixa (por exemplo, essa variante ), no entanto, os espaços são necessários para girar corretamente a estrutura usando ferramentas externas e, portanto, eu as incluí.
As variantes abaixo contêm os pedaços não utilizados que foram removidos, mas são idênticos:
Todas as quatro esquerdas . Saídas
leftleftleftleft
(o fato de que todas as quatro podem ser executadas dessa maneira é coincidência).Direito 1 , Direito 2 , Direito 3 , Direito 4
fonte
Gol> <> , 342 bytes
Uau! Isso levou mais tempo do que eu esperava, no meio do caminho, percebi que o reflexo era vertical , não horizontal como eu estava codificando! Tenho certeza de que isso funciona, mas se eu cometer um erro, entre em contato. Provavelmente isso pode ser jogado muito mais, apenas tomei um método de força bruta extrema para fazer isso. A forma em si é na verdade um quadrado, é tecnicamente simétrica, exceto no eixo x, portanto, quando ela vira, retorna "DIREITA"!
O personagem que tornou esse programa possível é o 'A', que permite o teletransporte para o início de uma determinada linha!
Experimente online!
fonte