Escreva um programa ou função que, dado um número inteiro positivo como entrada, produza a representação desse número inteiro em números maias .
Números maias
Os números maias são um sistema vigesimal (base 20) usando apenas três símbolos:
< >
para zero (o símbolo correto é algum tipo de shell que não pode ser facilmente representado usando ASCII)..
para um----
para cinco
Os números são escritos verticalmente em potências de 20, e os números entre 0 e 19 são escritas como pilhas de cincos e aqueles . Você deve consultar o artigo da Wikipedia para obter mais detalhes.
Como exemplo, aqui estão os números entre 0 e 25, separados por vírgulas:
. .. ... ....
. .. ... .... ---- ---- ---- ---- ---- . . . . . .
. .. ... .... ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
< >, . , .. ,... ,....,----,----,----,----,----,----,----,----,----,----,----,----,----,----,----,< >, . , .. ,... ,....,----
Entradas
- As entradas sempre são números inteiros positivos entre 0 e 2147483647 (2 ^ 31 - 1).
- Você pode pegar a entrada do STDIN, como um argumento de linha de comando, parâmetro de função ou qualquer coisa semelhante.
Saídas
- Cada linha tem no máximo 4 caracteres.
< >
e----
sempre deve ser impresso como indicado aqui (4 caracteres cada). - Uns (
.
) devem estar centralizados na linha. Se houver 1 ou 3.
, como o alinhamento horizontal perfeito é impossível, não importa se são uma coluna à esquerda ou uma coluna à direita ou ao centro. Deve haver exatamente uma linha vazia entre diferentes potências de 20, independentemente da altura das pilhas na potência de 20s. Por exemplo, a saída correta para 25 e 30 é:
. . ---- ---- ----
Não são permitidas linhas iniciais ou finais.
As saídas devem ser impressas exatamente como estão nos exemplos fornecidos.
Casos de teste
Cada número individual entre 0 e 25 é dado como exemplo acima.
Entrada:
42
Saída:
..
..
- Entrada:
8000
Saída:
.
< >
< >
< >
- Entrada:
8080
Saída:
.
< >
....
< >
- entrada:
123456789
Saída:
.
...
----
----
----
.
----
----
..
----
----
.
....
----
----
----
....
----
- Entrada:
31415
Saída:
...
...
----
----
----
----
----
----
----
----
- Entrada:
2147483647
Saída:
.
...
----
----
.
----
----
.
----
----
----
....
----
..
..
----
Pontuação
Isso é código-golfe , então o código mais curto em bytes vence.
fonte
Respostas:
Pitão, 41 bytes
Experimente online: Demonstração
Explicação:
fonte
Perl,
125117 bytesAgradeço a Dom Hastings por me ajudar a economizar 8 bytes.
fonte
redo,if(int($i/=20))
você poder usar~~($i/=20)&&redo
.~~
converte para int - você também pode usar0|
no início (ou|0
no final). Também substituirsubstr(".... ... .. . ",20-$i%5*5,5)
por(' .', ' ..','...','.'x4)[$i%5-1].$/
parece funcionar bem, mas eu não testei todos os casos de teste ... Se esses funcionarem, você está com 114 ... Se eu pensar em mais alguma coisa para compartilhar, avisarei!$-
que sempre truncará para um int ... pode economizar um pouco mais!JavaScript ES6, 143 bytes
Cargas de bytes adicionadas, porque precisam
console.log
, poderiam salvar outros 23 bytes sem ela.fonte
Mathematica
185 182 171153Com 18 bytes salvos, graças à sugestão de Arcinde de usar funções anônimas,
Exemplo
Verificando
O número decimal, 31415, expresso na base 20. O Mathematica emprega letras minúsculas para isso.
Os dígitos decimais correspondentes ao número da base 20 acima.
Outro exemplo
fonte
c=Column;c[If[#>0,{q,r}=#~QuotientRemainder~5;c@{{""," ."," .."," ...","...."}[[r+1]],c@{{""},{d="----"},{d,d},{d,d,d}}[[q+1]]},"< >"]&/@#~IntegerDigits~20]&
usando funções anônimas.JavaScript (ES6), 157 bytes
As novas linhas são significativas e são contadas como 1 byte cada. Como a impressão em STDOUT é necessária,
console.log
me custam alguns bytes lá.Demo
Para fins de demonstração, escreverei uma versão ES5 para que funcione em todos os navegadores:
fonte
.join
precisa de parênteses?Python 2.x, 142 bytes:
Exemplo:
Editar: linha à direita ...
fonte
[n%20==0]
para[n%20<1]
. Segundo, mude[[""," "*(2-n%5/2)+"."*(n%5)+"\n"][n%5!=0]
parah=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1]
witha=n%5
, que move todos osn%5
s para fora, e altera o condicional ao*(a>0)
qual retorna uma string vaziaa==0
para o mesmo efeito.a
,h
e,n
em uma linha, assim:a=n%5;h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1];n/=20
. Tudo isso deve deixar você com 131 bytes.CJam,
8276 bytesMeu primeiro programa CJam, basicamente apenas uma transliteração da minha resposta Perl para o CJam.
Experimente on-line
Multilinhas com comentários:
fonte
PHP, 220 bytes
A mesma abordagem da minha resposta JavaScript. O PHP possui funções embutidas para tudo.
Recebe 1 entrada da linha de comando (ou seja, STDIN), como visto em
$argv[1]
:fonte
C - 149
Usa recursão para imprimir os números mais significativos primeiro. Em seguida, imprime zero ou imprime todos os pontos com um inteligente
printf
e todos os cinco em um loop. Não tenho certeza se posso evitar o uso de if-else aqui.A desvantagem do printf inteligente é que 1 e 3 não estão alinhados um ao outro:
O resultado para 23 é:
119solução incorreta - nova linha finalfonte
PHP,
202192 bytesEle obtém a entrada do primeiro argumento da linha de comando.
O código fonte completo, com comentários e testes, está disponível no github .
fonte
\n
tem dois caracteres - mas uma nova linha no meio de uma sequência é apenas um.Python 2, 114 bytes
Esta resposta é baseada nas respostas Pyth de Jakube e Python 2 de Locoluis.
fonte
Geléia ,
504947 bytesExperimente online!
...
agora fica alinhado graças ao ponto de user202729.Quando você se engana, o pensamento
< >
é um palíndromo ...fonte
...
....
e..
precisa haver um espaço, então eu também o coloquei...
. Existe um caminho mais curto?...
não devem estar alinhadas à direita. Apenas mudar<4
para<3
?