Escreva o programa mais curto que use um único número inteiro como entrada e imprima um ábaco de Suanpan
Casos de teste
Entrada:
314159
Saída:
|\======================================/|
|| (__) (__) (__) (__) (__) (__) ||
|| (__) (__) (__) (__) || || ||
|| || || || || || || ||
|| || || || || (__) (__) ||
|<======================================>|
|| (__) (__) (__) (__) || (__) ||
|| (__) || (__) || || (__) ||
|| (__) || (__) || || (__) ||
|| || || (__) || || (__) ||
|| || || || || || || ||
|| || || || || (__) || ||
|| || (__) || (__) (__) || ||
|| || (__) || (__) (__) || ||
|| (__) (__) || (__) (__) || ||
|| (__) (__) (__) (__) (__) (__) ||
|/======================================\|
Entrada:
6302715408
Saída:
|\==============================================================/|
|| (__) (__) (__) (__) (__) (__) (__) (__) (__) (__) ||
|| || (__) (__) (__) || (__) || (__) (__) || ||
|| || || || || || || || || || || ||
|| (__) || || || (__) || (__) || || (__) ||
|<==============================================================>|
|| (__) (__) || (__) (__) (__) || (__) || (__) ||
|| || (__) || (__) (__) || || (__) || (__) ||
|| || (__) || || || || || (__) || (__) ||
|| || || || || || || || (__) || || ||
|| || || || || || || || || || || ||
|| || || (__) || || || (__) || (__) || ||
|| (__) || (__) || || (__) (__) || (__) || ||
|| (__) || (__) (__) (__) (__) (__) || (__) || ||
|| (__) (__) (__) (__) (__) (__) (__) || (__) (__) ||
|| (__) (__) (__) (__) (__) (__) (__) (__) (__) (__) ||
|/==============================================================\|
Respostas:
J,
126124121119116115113105116115112 caracteresRecebe entrada do teclado. Exemplo:
O principal truque aqui é o abuso do boxe de J, redefinindo os caracteres que ele usa. Ele usa um parâmetro global -
9!:7
- para fazer isso. Pode haver espaço para mais golfe, mas, para ser sincero, fiquei feliz em trabalhar com algo que compensasse minha última tentativa nessa questão .Cabe em um tweet com caracteres suficientes para dizer 'Gaz made this' :-).
Edit: 3 caracteres de poupança são devidos ao empréstimo da resposta
2 6$' || (__)'
de Jesse Millikan .Edição adicional: perdi 11 caracteres adicionando espaços extras em ambos os lados que eu não havia notado que não estavam presentes.
Explicação:
O código está em três seções principais:
1) Configuração
Isto é ele mesmo em duas partes.
9!:7'\=/<=>/=\|='
redefine os caracteres que J usará para exibir caixas. O boxe de J normalmente se parece com isso:mas depois de redefinir, fica assim:
(s=:[,.~,.)
define um verbo que vou usar algumas vezes depois. Este é o melhor lugar para declará-lo. Ele pega um caractere à esquerda e uma matriz de caracteres à direita e imprensa a matriz entre o caractere. Por exemplo:A final
[
serve apenas para separar a configuração da próxima parte.2) Entrada e Representação
".,.1!:1[1
pega a entrada do teclado e a separa em dígitos individuais:((i.5)</5|])
cria uma representação em zeros e uns da parte inferior do ábaco:|:@(1,.<&5)
cria uma representação de zeros e uns da parte superior do ábaco:Essas duas partes são encaixotadas usando
;
:Em seguida, as caixas são colocadas uma em cima da outra para formar a base do ábaco, dando:
3) Saída
&.>
significa que o que se segue irá operar em ambas as caixas por sua vez.(,-.)
este é um gancho que nega a entrada e a adiciona ao final do original:Isso realmente faz parte da representação, mas para fins de golfe, é melhor tê-lo nesta seção. Aplicado à entrada anterior:
[:,.(_6[\' || (__)'){~
Os zeros e uns agora são usados para selecionar uma sequência para representar um cordão ou a ausência de um:Mas agora, como Howard me apontou, há um espaço curto de cada lado das contas. Portanto, usamos o
s
verbo predefinido para colocar o conteúdo de cada caixa entre duas colunas de espaços:Feito isso, tudo o que resta é converter isso em uma string usando
":
para que possamos colocar entre duas colunas de|
:fonte
Ruby 1.9, 154 caracteres
Supõe que a entrada não seja finalizada por uma nova linha.
Curiosidade: devido à maneira como estou transformando os dígitos de entrada em números (
$&.hex
é um byte menor que$&.to_i
), esse ábaco realmente funciona com dígitos hexadecimais atée
:Pois
0xf
, um terceiro cordão aparece magicamente na metade superior.Ao permitir sinalizadores adicionais durante a chamada de script, isso pode ser reduzido para 152 bytes (código de 149 bytes + sinalizadores de chamada adicionais de 3 bytes):
Corra com
ruby -n suanpan.rb
.fonte
Perl (151 caracteres)
(
168163158157156154)Explicação
Edições
\n
s para caracteres de nova linha reais. Não posso acreditar que não pensei nisso antes!fonte
Windows PowerShell, 191
História:
$l
.%
que gera números a partir dos dígitos.$r
e$b
. E$a
também é obsoleto. Como está$l
.$OFS
se eu precisar apenas uma vez.$f
.-join
pois podemos realmente usar o espaço adicional com bom efeito.fonte
Haskell, 243 caracteres
Não é particularmente inteligente. Tenho certeza que pode ser reduzido de alguma forma ...
fonte
interact
z x|x=" (__) "|0<1=" || "
.Delphi, 348
Esta versão cria uma string para escrever apenas uma vez; Os dígitos são manipulados por uma função separada que funciona por meio de uma
digit modulo m >= value
construção (negada se o valor for <0).Delphi, 565Primeira tentativa :
Isso usa 3 matrizes; um para as 7 strings que poderiam ser discernidas, um para as linhas de saída e um para mapear as 7 strings para 11 colunas (10 dígitos e 1 coluna inicial).fonte
GolfScript, 139 caracteres
Ainda não jogou muito, mas se encaixa em um tweet (apenas com ASCII). Experimente aqui .
fonte
J, 225
Passa em dois testes dados, deve trabalhar até pelo menos várias centenas de dígitos.
Primeiro: sim, sim, cavando. Segundo: Isso é apenas embaraçosamente longo. Ah bem. Ainda não decidi se vou jogar mais ou me enrolar na posição fetal e chorar. (Ou ambos!)
Aqui está uma explicação em vez de um programa mais curto:
fonte
C,
277274 caracteresSabe, parece-me que simplesmente não temos soluções suficientes aqui que realmente tirem proveito do pré-processador C. Em parte, isso ocorre porque esses
#define
espaços ocupam bastante espaço. Mas ainda assim, há muito potencial. Sinto a necessidade de resolver essa deficiência.Isso é melhor.
fonte
Mathematica 281
Exemplo
fonte
C, 548
Primeira versão, apenas um pouco de golfe até agora.
fonte
Scala (489 caracteres)
Tentativa de baixa qualidade realmente.
fonte
Sclipting , 77 caracteres
A recompensa refere-se a tweets , e o Twitter conta caracteres (não bytes). :)
Na verdade, eu escrevi isso anos atrás (quando este desafio foi lançado), mas nunca o publiquei porque inventei o Sclipting depois que esse desafio foi lançado pela primeira vez. Se você acha que isso o torna inelegível, eu entendo.
Explicação
fonte
Python,
309301288 caracteresVersão compacta:
Versão clara:
Observe que, para compactar, as variáveis foram renomeadas para uma única letra e as compreensões da lista foram alteradas para geradores que não exigem colchetes extras.
fonte