fundo
Você está trabalhando para algum fabricante de jogos de tabuleiro e precisa produzir ladrilhos de madeira com os números de 0 a n gravados neles para algum jogo. No entanto, sem mais delongas, alguns ladrilhos se tornariam indistinguíveis, por exemplo, 6e 9. Para evitar isso, você deve equipar números que possam ser confundidos com outros (e somente aqueles) com um ponto não ambíguo; por exemplo, você teria peças como 9.ou 6089..
Infelizmente, é necessário usar um dispositivo de gravação em madeira antigo e programável para isso, cuja interface é tão quebrada que é necessário codificar todos os caracteres do programa manualmente, em um processo indescritivelmente tedioso. Felizmente, o dispositivo entende todas as linguagens de programação existentes. Assim, você está procurando o programa mais curto que imprime esses ladrilhos.
Tarefa real
Escreva o programa mais curto que:
- Toma um número inteiro positivo n como entrada. Você decide como a entrada é lida.
- Imprime cada um dos números de 0 a n (0 e n incluso) exatamente uma vez na ordem de sua escolha, separados por um único caractere de espaço em branco (incluindo nova linha). Os números devem ser impressos sem zeros à esquerda.
- Anexa um ponto (.) A cada número que se transforma em outro número válido após a rotação por π (180 °), mesmo que esse número seja maior que n. O 0 e 8 do seu tipo de letra são simétricos à rotação e o 9 é um 6. girado 6. Os 2 e 5 são distintos após a rotação; o 1 não é simétrico à rotação. Números com zeros à esquerda não são válidos.
Exemplos
Cada um dos seguintes números deve ser impresso exatamente desta maneira:
2
4
5
6.
8
9.
16
60
66.
68.
69
906
909.
8088.
9806.
9886
9889.
60
ser60.
?8088.
em seus exemplos como um número de rotação-inseguro que não tem um 6 ou 9.Respostas:
Pitão - 34
38Devo agradecer ao @ Sp3000 por me ajudar a remover 4 bytes. Originalmente, eu tinha uma verificação adicional
&@JK
que assegurava que houvesse 6 ou 9 no número, mas depois de ler as respostas antes de postar, li a resposta e notei que minha tradução e reversão idênticas já cuidavam disso.Agradeço também ao @isaacg por apontar que as strings são iteráveis, e você pode usar operações definidas nelas. Também para criar o código atual;)
Explicação:
fonte
K
eJ
- cordas Basta usar em seu lugar. MudarK
para <backtick> 69 eJ
<backtick> N salva alguns caracteres, assim como inliningK
no programa resultante. O menor que eu pude usar nessa técnica foiVhQJ``N+J*\.&nJX_J``69``96&eN!-J"0689
34 caracteres. (Dois backticks são realmente um.)hell`o wo`rld
_
antes do`96
.CJam,
46444342 bytesEu acho que há espaço para melhorias.
Teste aqui.
Explicação
fonte
n
em Entrada.CJam,
46 45 4342 bytesEu acho que pode ser jogado um pouco mais.
Toma
n
de STDIN.Experimente online aqui
fonte
APL 66
Explicação:
Experimente em tryapl.org
Observe que no intérprete online a função doesn't não funciona, então eu tive que substituí-lo por 2⊃⎕VFI, que faz o mesmo nesse caso, executa e retorna o número, dada uma string.
fonte
⊃,/
ou,/
você pode usar um∊
na frente.Perl 5, 53 bytes
Demonstração online.
Usa o
say
recurso Perl 5.10+ , portanto, ele deve ser executado comperl -M5.010
(ouperl -E
) para ativá-lo. (Consulte este meta thread. ) Lê a entrada de stdin, imprime em stdout.fonte
Python 2,
130116113 bytesDefine uma função
f
que imprime os números em STDOUT, em ordem crescente.Desta vez, pensei em tirar uma folha do livro de @ feersum com
.translate
:)Expandido:
Solução anterior:
Obrigado a @xnor por me mostrar o
.replace
truque há algum tempo.fonte
(u''+S[::-1])
vez deunicode(S[::-1])
. Além disso, se você trocar aprint
chamada e a recursiva, os números serão exibidos em ordem crescente.u""+
que funcionaria realmente #C #,
343309 caracteresMuito tempo, mas de qualquer maneira:
Como funciona? Para adicionar um período ao número, ele deve corresponder aos seguintes requisitos:
0
,8
,6
e9
.6
s e9
s, ec
= o número com todos os6
s substitui com9
s,c
==c
,Os números são separados por um espaço.
Código com recuo:
fonte
M (MUMPS) -
7270A maioria dos comandos e funções internos do M possui versões abreviadas. Eu usei os nomes completos abaixo.
READ n
- Leia uma string do teclado e guarde-an
.FOR i=0:1:n
- Faça um loop de zero an
, incrementandoi
1 a cada vez. (O restante da linha constitui o corpo do loop.)WRITE !,i
- Imprima uma nova linha seguida pelo valor dei
.SET r=$TRANSLATE($REVERSE(i),69,96))
- Invertai
, substitua noves por seis e seis por noves e armazene-o emr
.WRITE:r=+r*r'=i*'$TRANSLATE(i,0689) "."
:
- Denota uma expressão pós-condicional, portanto, oWRITE
comando é executado apenas se forr=+r*r'=i*'$TRANSLATE(i,0689)
avaliado como um valor verdadeiro.r=+r
- Verifiquer
se não tem um zero inicial. O+
operador unário converte uma string em um número, que remove os zeros à esquerda, se houver algum.*
- Operador de multiplicação. M não tem ordem de operações; todos os operadores binários são avaliados na ordem em que aparecem da esquerda para a direita.r'=i
- Verifiquei
se não é o mesmo que a versão invertidar
.'$TRANSLATE(i,0689)
- Remova todos os zeros, seis, oito e nove dei
e verifique se não há mais nada. ('
é o operador de negação lógica.)"."
- Finalmente o argumento para oWRITE
comando (uma string literal).Edit: Tornou um pouco mais curto abusando do operador de multiplicação. Versão anterior:
fonte
APL, 53 caracteres
∊{⍵,'. '↓⍨∨/(3≡⊃i)(5∊i),⍵≡'9608x'[i←⌽'6908'⍳⍵]}∘⍕¨0,⍳
fonte
C # 205
209C # não precisa ser tão longo ...
mais ou menos, uma porta da minha resposta JavaScript
Ungolfed
fonte
Ruby, 81
A entrada é retirada da linha de comando.
Gera uma lista de
String
s de0
paran
. Ele passa por eles e os imprime. Acrescenta um ponto se todas as condições forem atendidas:6
s por9
s não produz o original0
,6
,8
e9
0
fonte
JavaScript (ES6) 101
104 106 109Uma função com n como argumento, saída via console.log
Edite usando% 10 para testar a reorganização inicial 0
Edit 2
for
, não preciso da compreensão do array, afinal oEdit 3 modificou (novamente) a verificação da entrada 0
Ungolfed e mais fácil de testar
Saída
fonte
[]
? Estou procurando uma documentação, porque só sabia disso em python até agora.Bash + coreutils, 105
Teste:
fonte
sed, 467
Mais longo que C # ...
Eu praticamente concluí isso quando @ edc65 apontou que as respostas precisam processar os números 0-n e não apenas n. A adição do código sed ao incremento de 0-n adiciona muito mais código, pois essa tarefa não é adequada para sed aritmético e menos.
De acordo com o OP, o pedido não importa, então trabalhamos para baixo de n a 0.
Saída:
fonte
AWK: 120
Leia o valor n de stdin.
Teste:
fonte
Rebol - 195
Ungolfed + algumas anotações:
fonte
bc, 158
Depois de fazer isso puramente no sed usando todas as operações de string e regex sem aritmética nativa, fiquei curioso para ver como isso seria o contrário, ou seja, todas as operações aritméticas e lógicas e sem string / regex:
A saída é classificada em ordem decrescente.
Saída:
fonte
Python - 152
fonte
"."if a[i]else"" -> "."*a[i]
,int(raw_input()) -> input()
(que é realmente apenaseval(raw_input())
)str(i)
por`i`
. (2) Você usaa
apenas uma vez; portanto, por que atribuí-lo a uma variável.str(i)
várias vezes. Qual deles posso substituiri
?i
, masi
com backticks, que é sinônimo derepr(i)
. Você pode usá-lo em vez de emstr(i)
qualquer lugar, embora se você tiverstr(i)
muitas vezes, pode ser mais curto atribuí-lo a uma variável e usá-lo, além de usar backticks. (iex=`i`; (do stuff with x)
)JavaScript -
168 129 119 113 111108Ou versão legível:
Eu não estou muito feliz com o regex, alguma idéia?
Edit : Aprendeu truque com
~
efor (... of ...)
com @ edc65Edit2 : Condições reorganizadas
Edit3 : sugestões aplicadas por @ edc65
fonte
i=n+"";for(c of i)
=>for(c of i=n+"")
salvar 2 bytes #c==6?A:B
=>c!=6=>B:A
=>c-6?B:A
for(c of i=n+"")
é bastante lógico quando o vejo, mas eu não pensaria nisso.c-6?B:A
Deus me livre que eu já colocar isso em código de produção05AB1E ,
38373029 bytesExperimente online.
Explicação:
Explicação adicional para algumas partes:
fonte
Perl - 84
fonte
Powershell,
111102 bytesScript de teste explicado:
Saída:
fonte
Stax , 27 bytes
Execute e depure
Descompactado, não destruído e comentado, parece com isso.
Execute este
fonte