O título diz tudo. Seu objetivo é escrever um programa que forme um retângulo de caracteres × × h que possa ser girado e execute novamente para gerar o número de rotações 90 ° no sentido anti-horário (CCW) que foram feitas.
Por exemplo, se o programa 3 × 2
abc
def
resolvido o problema, inicialmente produziria 0 e rotações sucessivas de 90 ° CCW
cf fed da
be cba eb
ad fc
produziria 1, 2 e 3, respectivamente.
O uso de comentários faz desta uma tarefa trivial a maioria dos idiomas. Em Ruby, por exemplo, isso pode ser feito em um retângulo 7 × 7:
###p###
### ###
###1###
p 0#2 p
###3###
### ###
###p###
O desafio é fazer isso sem nenhum tipo de comentário.
Pontuação
Sua pontuação é w * h, a área do seu retângulo. Novas linhas são excluídas. Em outras palavras, code-golf, novas linhas não são contadas.
A pontuação para o exemplo do Ruby é 49 (embora, é claro, seja inválida, pois possui comentários).
Notas
- Seu código deve ser realmente retangular, sem caracteres ausentes no final das linhas.
- Se você desejar, pode gerar outros valores legais de "mod 90 °" em vez de 0 1 2 3. Portanto, 8 é bom em vez de 0 e -1 é bom em vez de 3, etc.
- A saída pode ir para o console ou para um arquivo.
- Aplicam-se brechas padrão.
Espero que isso, minha primeira pergunta, realmente intrigue algumas pessoas. Desfrutar!
fonte
echo 0;exit;e
no bash é permitido?Respostas:
APL (1x3 = 3)
Esta solução usa a regra extra de que qualquer saída que esteja correta no mod 4 funcione.
No APL,
x!y
é o número de maneiras de escolherx
elementosy
, comumente conhecido comobinom(y,x)
ouchoose(y,x)
. Vamos verificar se cada rotação dá a resposta certa.0 rotações
Não há como escolher 5 elementos de 3, então obtemos 0, que é impresso automaticamente.
1 rotação no sentido anti-horário
A APL avalia felizmente cada linha, obtendo o número
3
, o operador!
e o número5
, imprimindo apenas o último destes (5
), que é 1 mod 4.2 rotações no sentido anti-horário
Isto é
binom(5,3)
, qual é(5*4*3*2*1)/(3*2*1)/(2*1) = 10
, que é 2 mod 4.3 rotações no sentido anti-horário
Como antes, apenas o último valor avaliado de
3
é impressora.Na verdade, eu não conheço o APL, então, por favor, me diga se tenho alguma explicação errada. Encontrei por tentativa e erro como o primeiro idioma neste site que:
Em (5), desci a lista de funções diádicas da APL . Minha primeira operação candidata foi a divisão inteira
/
de C e Python 2, mas a divisão APL÷
fornece flutuadores. Exponenciação é tentador, mas falha porquea
ea^b
têm a mesma paridade, mas são obtidas por rotações consecutivas (a não serb=0
, mas entãob^a=0
). Operadores booleanos como<
doação0
e1
180 graus de diferença, o que não funciona. Finalmente, encontrei o operador binomial!
e tentei números até conseguir alguns que funcionassem.Agradecemos a Quincunx por sua confiança de que existe uma solução menor que 2x2.
fonte
Rubi, 7 × 9 (63)
Um pouco mais do que a outra solução, mas pelo menos essa solução não depende de qualquer impressão implícita ou abuso de regras. Para todas as quatro rotações, o código completo é analisado e, com exceção de um curto-circuito, tudo é executado. Surpreendentemente, não há absolutamente nenhuma simetria no código
Esta solução depende do fato de que ainda é possível chamar a
p
função (que é usada para imprimir os números), mesmo que uma variável com o mesmo nome já tenha sido definida. Por exemplo, algo comop p
chama a funçãop
com a variávelp
como argumento (assim, imprimindo o valor dep
).Explicação para algumas das expressões comuns usadas no código:
p
: Como mencionado acima, isso é uma chamada de função ou uma variável. Quando a variável não está definida, isso chama a funçãop
sem argumentos, que não faz nada e retornanil
.p p
: Imprime a variávelp
.p|x
: Quandop
é a função, isso é idêntico anil|x
, que retorna verdadeiro / falso, dependendo do valor dex
. Sep
é um número inteiro, é bit a bit ou. De qualquer forma, esta afirmação não tem efeito colateral.p=p||x
: Efetivamente o mesmo quep||=x
(atribuição condicional) com a vantagem de ser sintaticamente válido e não-op quando revertido.Versão simétrica (9 × 10 = 90)
Esta é a solução simétrica mais curta (C 2 ao ignorar os números a serem impressos) que eu poderia apresentar.
Script de teste
Aqui está um script de teste para verificar o código acima (o
#
final da linha foi adicionado para que o espaço em branco não seja removido e seja removido antes da execução):fonte
GolfScript, 4 (2x2)
Imprime
4312
qual é0
(mod 4). As rotações são impressas3241
(1 mod 4),2134
(2 mod 4) e1423
(3 mod 4).Solicitado por:
Na verdade, existem muitos conjuntos de números para os quais isso funciona. Eu os encontrei com este programa Python:
Embora o programa produza
0
s (o que provavelmente não funcionaria), as soluções válidas são da formaOnde
a∈{4,8}
,b∈{3,7}
,c∈{1,5,9}
,d∈{2,6}
. IE,(a,b,c,d)∈{4,8}×{3,7}×{1,5,9}×{2,6}
que são 24 soluções.fonte
Your score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
n
. Isso ocorre porque a paridade do número inteiro é igual à paridade do dígito mais à direita, mas as rotações separadas por 90 graus devem produzir paridades diferentes. Portanto,2*2
é o mínimo para essa abordagem.Python - 23 x 23 = 529
Ok, esta pergunta já foi vencedora, mas ainda não existe uma solução Python. Então eu pensei sobre isso - fortemente! - e encontrou uma maneira de fazer com que o
print
comando volumoso funcionasse em qualquer direção sem gerar erros quando analisado de uma das outras direções.O avanço foi a seguinte linha:
Enquanto o
forward_code
é executado, obackward_code
faz parte de uma sequência e, portanto, não é impresso. É exatamente o contrário ao ler para trás.Então, combinada com mais duas direções e ajustada para obter todas as cotações correspondentes corretamente, acabo com a seguinte solução:
Edit: Encontrei uma maneira de lidar com todo esse espaço em branco. ;)
fonte
p=print
no arquivo, já que você tem tanto espaço em branco atualmente? (Python 3, é claro)p=print
também é longa. E mais importante: você não pode reutilizarp
depois de girar o código!BASIC, 64
Não vai ganhar, mas aqui está assim mesmo. (Testado no Chipmunk Basic )
Nota:
?
é uma abreviação paraPRINT
vários dialetos do BASIC. Embora existam muitos erros de sintaxe no código, aEND
instrução na primeira linha impede que eles sejam vistos pelo intérprete.fonte
END
:) :) #Pitão , 9 caracteres (3x3)
Em pyth, tudo é impresso por padrão, a menos que seja precedido por um espaço. Linhas após a primeira linha são para entrada do usuário e não são avaliadas neste programa.
Outra maneira de obter 9 caracteres:
Pyth 1.0.5 , 4 caracteres
Embora alterações recentes no pyth tenham tornado mais difícil a geração de números de 2 dígitos (uma alteração que estou pensando em reverter), as versões mais antigas do Pyth têm uma geração fácil de números de dois dígitos, que, combinada com a impressão implícita e o fato de que todas as linhas, exceto a primeira são ignorados, fornece a seguinte solução:
Imprime 32,21,14,43.
fonte
Befunge, 16
Explicação: Dígitos de
0
para9
empurrar o número correspondente na pilha,.
exibe um valor da pilha e o imprime como um número inteiro e@
finaliza o programa.(testado aqui )
fonte
Piet, 49
Fiz questão apenas de usar as cores amarela e vermelha e tentar torná-la mais ou menos simétrica. Quando girado, imprime 0, 1, 2 ou 3. Sair do programa em Piet é difícil e ocupa, infelizmente, metade do espaço da imagem.
fonte
GNU dc , 6 (3x2)
Eu acho que esta é a resposta mais curta para não exigir o relaxamento da regra "mod 90 °":
Saídas
0
,1
,2
ou3
para cada rotação.Para as rotações
0
,2
e3
,p
simplesmente aparece e imprime o último número literal que foi enviado à pilha. Para a1
rotação,z
empurra a profundidade atual da pilha (1) para a pilha, depois ap
popa e a imprime.fonte
311\n0p2
, onde\n
é um personagem de nova linha. Caso contrário, não teria sentido no contexto de dc.GolfScript, 9 (3x3)
Meio que abusando das regras. O
}
acontece para terminar o programa, se não houver correspondência{
, e o conteúdo da pilha são impressos no final do programa.fonte
Your score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
}
pode ser desequilibrado. Bom truque.JavaScript, 4
Quando você executa este programa (ou uma rotação deste programa) em um console javaScript, apenas a última linha é avaliada e ecoada no console.
Assim:
Aqui estão todos os programas 2x2 semelhantes que também funcionam:
Em outros termos,
onde a está em [0,4,8], b está em [3,7], c está em [1,5,9] e d está em [2,6]
fonte
CJam / GolfScript - 3 * 3
O ponto e vírgula exibe o número anterior, portanto, apenas o canto inferior direito é impresso.
fonte
Aheui , 8
Como Aheui não possui uma letra que empurre 1 na pilha, decidi imprimir 0, 5, 2 e 3.
Explicação: 바 e 반 pressionam 0 e 2, respectivamente, na pilha e movem o cursor para a direita por um caractere. 뷷 e 뷷 pressionam 5 e 3, respectivamente, na pilha e move o cursor para baixo em dois caracteres. 몽 aparece e imprime o número na pilha e move o cursor para cima em um caractere. 희 finaliza o programa.
fonte
Javascript
(Introduzido no console do navegador, shell ou outro REPL, para que o resultado seja impresso)
Deve funcionar para qualquer outro idioma com expressões, novas linhas não significativas e impressão automática do resultado.
fonte
'2,3\n,0,\n1,0'
.Matlab / Oitava -
144100Golfe: 10 x 10 = 100
Solução alternativa: 15 x 15 = 225
fonte
...d....
...i....
...s2...
disp 1..
..3 psid
...4s...
....i...
....d...
..3 psid
. Você precisa de pelo menos três pontos no início de cada linha para indicar uma quebra de linha e ignorar os caracteres restantes.Perl 5x7 (35)
Um pouco atrasado para a festa. O solitário
-
determina qual número é impresso.fonte
JavaScript, 3
Funciona ... na base 7.
Versão base 9:
Explicação
Quando executado interativamente, por exemplo, a partir de um console de depuração, o valor da última instrução / expressão será gerado.
4 7 = 4 10 ≣ 0 (mod 4 )
412 7 = 205 10 ≣ 1 (mod 4 )
2 7 = 2 10 ≣ 2 (mod 4 )
214 7 = 109 10 ≣ 3 (mod 4 )
Soluções semelhantes podem ser encontradas para qualquer base ímpar.
fonte
Befunge, 12 (6x2)
Consegui apresentar uma pequena melhoria na resposta existente do Befunge, aproveitando ao máximo a natureza bidimensional do Befunge e fazendo com que o caminho do código fosse executado verticalmente em duas das orientações.
Experimente online: Início 0 , Rotação 1 , Rotação 2 , Rotação 3 .
fonte
Marbelous, 7 * 14 = 98
fonte
Argh! / Aargh! (4 * 4 = 16)
O que houve com o uso da ferramenta certa para o trabalho? Não há comentários (no idioma em geral).
Toda a família de programas (gerada em J:
((|.@:|:) ^: (i. 4)) >'hpqh';'q01p';'p32q';'hqph'
ou((|.@:|:) ^: (i. 4)) 4 4 $ 'hpqhq01pp32qhqph'
)girado uma vez:
girado duas vezes:
girado três vezes:
Para explicar isso, talvez seja melhor consultar uma versão "recuada" (que também funciona em todas as rotações):
Esta versão mostra que o programa consiste em 4 partes separadas, uma para cada rotação individual.
h
- ajuste o fluxo de controle para a esquerdap
- imprime item na varredura de dados / código abaixo deleq
- saia do programafonte
Flutuador - 9 × 5 = 45
Imprime 4, 1, 2 ou 3 no console.
Observe que 'Black' é uma instrução válida (NOP) e é sintática. Sem ele, ele não consegue encontrar a posição inicial. Assim, todas as posições no retângulo são ocupadas.
fonte
Elemento, 2x3 = 6
Esta é uma melhoria em relação à solução ingênua 3x3, que possui uma
`
no meio com um número em cada lado. O caso 0, mostrado acima, é o mais interessante, já que o*
é usado para multiplicar os 3 por nada para obter 0. Fora isso, não é tão complicado.Se você achar o espaço estranho, poderá substituí-lo por praticamente qualquer outro caractere, exceto
[]{}`_
.Para referência, aqui estão as outras três rotações:
fonte
Chip, (2x5) 10
*
ativa todos os elementos vizinhos: norte, leste, sul e oeste (origem)~
se não for ativado a partir do oeste, ativa o vizinho leste (NOT-gate) (nunca ativado aqui)t
finaliza a execução após a impressão do byte atuala
definir o bit0x01
dosb
conjuntos de saída o bit0x02
da saídae
define o bit0x10
da saídaf
define o bit0x20
da saída,+
se ativado por qualquer vizinho, ative todos os outros vizinhos (fio)O chip requer o
-w
sinalizador (para permitir a execução sem entrada) ou alguma entrada para ser executado.Prints
0
,1
,2
, ou3
em ASCII. Se os pontos de código0x00
para0x03
se desejado, remover oe
ef
, em seguida, deslocar o espaço até preencher a lacuna.fonte
Japt , 3 * 1 = 3 bytes
Experimente on-line: como está , girado uma vez , duas vezes , três vezes .
Saídas 0, 5, 2, 11 respectivamente.
A variável
B
possui o valor 11 eNumber.z(other)
é a divisão do piso (todos procuraram aparentemente: p). Para código de várias linhas, a última linha é passada para a saída, o que é simplesmente uma constante aqui.2 * 2 = 4 bytes
Experimente on-line: como está , girado uma vez , duas vezes , três vezes .
Saídas 0, 21, 2, -1 respectivamente.
T
detém 0 eJ
detém -1.O truque é que, se dois literais ou variáveis forem colocados lado a lado, uma vírgula será inserida e a saída será apenas a última.
A solução 2 * 2 JS também funciona em Japt.
fonte