Tallying é um sistema simples de contagem que funciona na base 5. Existem vários sistemas diferentes de cálculo usados em todo o mundo, mas o que é usado na maioria dos países de língua inglesa é talvez o mais simples - contar unidades marcando linhas verticais e, em seguida, para cada quinta marca coloca uma linha horizontal na coleção anterior de quatro. Isso agrupa as marcas de contagem em grupos de 5 (e facilita a contagem rápida).
Você vai escrever um programa que exibe marcas de registro até um determinado valor. Mas calcular apenas na base 5 é chato! Portanto, seu programa também deve poder exibir registros em diferentes bases.
Entrada
A entrada será um ou dois valores inteiros não negativos separados por vírgula (por exemplo, 9
ou 8,4
). O primeiro número é o valor que deve ser exibido pelo registro. O segundo valor é a base da contagem. Se o segundo valor não for fornecido, use a base 5 .
Resultado
A saída será o valor inserido representado como marcas de registro de arte ASCII. Aqui estão alguns exemplos contra os quais você pode testar seu programa - sua saída deve corresponder exatamente a eles!
Entrada: 12
ou12,5
| | | | | | | | | |
-+-+-+-+- -+-+-+-+- | |
| | | | | | | | | |
Entrada: 7,3
| | | | |
-+-+- -+-+- |
| | | | |
Entrada: 4,2
| |
-+- -+-
| |
Entrada: 6,1
ou 6,10
(observe os espaços iniciais)
| | | | | |
| | | | | |
| | | | | |
Observe também que a base 1 deve ser inconsistente - somente linhas verticais devem ser usadas.
Se um dos valores inseridos for 0, não haverá saída alguma (e seu programa deve terminar normalmente).
Regras
- Isso é código-golfe , portanto a implementação correta mais curta (em bytes) vence.
- A entrada / saída pode estar em qualquer meio adequado (por exemplo, stdin / stdout, arquivo ...).
- A entrada pode ser na forma de vários argumentos de linha de comando ou separados por espaços, etc., se for mais adequado para o idioma de destino.
- Novas linhas à direita são permitidas na saída. Os espaços à direita não são. Esta regra se aplica somente quando há uma saída (ou seja, não quando o valor inserido é 0).
- Seu código deve ter como padrão a base 5 quando nenhuma base for inserida.
6,1
parecer mais-+- -+- -+- -+- -+- -+-
?-+-
representaria dois, porque há uma linha vertical e uma pontuação horizontal através dela. A base 1 teria apenas linhas verticais. @AndoDaan ammended.--- --- --- --- --- ---
então. Para obter consistência com as outras bases, você deve fazer um ataque horizontal através deb-1
linhas verticais. Se pretende ser inconsistente, você deve declarar isso explicitamente.Respostas:
CJam 103 85 72 caracteres
Experimente em http://cjam.aditsu.net/ .
original
Trabalha definindo um conjunto de tallys com espaços, linhas e l para espaços que devem permanecer espaços. Em seguida, aproveita a função er (tranliteração) para criar a segunda linha. A parte mais ineficiente é lidar com os 1 e 0 casos especiais. Editará à medida que eu a melhorar. Dica: Demorei muito para perceber: como a segunda entrada sendo 1 é igual ao infinito ou a primeira entrada +1, redefini-la quando for igual a 1 economiza muito trabalho.
melhorado até agora com delimitação por vírgula
melhorado até agora com entrada delimitada por espaço
Naturalmente, o CJam foi realmente projetado para entrada delimitada por espaço. Colocar a entrada em 20 3 em vez de 20,3 é um grande benefício.
fonte
Python 2 -
111 108 119 144 140 136 135134 - ExperimenteOk, vamos tentar:
Edit: Eu esqueci que não deve haver saída se
n==0
oub==0
. Isso me custa 11 caracteres. :(Edit: Ok, depois de corrigir o segundo problema mencionado nos comentários, minha solução basicamente convergiu para a do BeetDemGuise.
fonte
b
nesse caso, deve ser 5). Vou deixar mais claro na pergunta. Edit: oh, não importa, você corrigiu isso assim como eu fiz esse comentário!n/b
vez den//b
?Bater,
239 228 199 189188Aqui está a minha tentativa, poderia ser muito jogado.
Nota: a segunda linha não subtrai 5 de 2, define um valor padrão se
$2
estiver vazio!fonte
{1..$n}
vez de`seq $n`
?h=8;echo {1..$h}
outputs{1..8}
Python -
171143O programa é bem direto:
t,b
. Se isso falhar, simplesmente atribua os valores corretos.1
, altere seu valor para algo que possa manipular todas as linhas verticais facilmente (t+1
).t
eb
forem diferentes de zero.EDIT 1: Use a
input
função em vez deraw_input
depois de algumas brincadeiras.EDIT 2: Obrigado a Falko por apontar um pequeno bug com minha verificação diferente de zero. Agora nosso código é basicamente idêntico, menos alguns nomes de variáveis e alguma lógica pequena.
EDIT 3: Graças a como o Python compara seqüências e tipos diferentes , podemos comparar
i
com alist
para obter uma versão mais curta do nossotry...except
bloco.Aqui está a versão não destruída:
fonte
t&b
éFalse
por 10,5. Caso contrário, nossas soluções estão convergindo! ;)i
é escalar ou uma lista. Então poderíamos largar otry ... except
monstro.list
é sempre maior que um int. Além disso,list
s são comparados em ordem lexicográfica. Portanto, se compararmos,[0]<i
isso sempre retornaráFalse
sei
for um número eTrue
sei
for uma lista (com um primeiro elemento diferente de zero).Java, 343
Menos golfe:
fonte
i
um,long
para não precisar declará-lo separadamente. Um pouco mais, fazendoi++%b>0
seus loops em vez de incrementá-lo separadamente (ei++<n%b
no terceiro loop). Outro usandob=b<2?(int)2e9:b
.Perl -
167165156destroçado
fonte
C - 193
Eu sinto muito. Lidar com o caso especial de 1 foi um truque ruim, então acho que isso poderia ser melhorado com uma abordagem melhor. Além disso, este código inclui uma nova linha no início da saída; portanto, se isso não for permitido, entre em contato.
Claro, define muito feio sempre ajuda :)
A contagem de caracteres inclui apenas os espaços necessários e novas linhas.
fonte
printf
porputs
e substituindoreturn
por um operador ternário.puts
é que ela adiciona uma nova linha sempre :(. E para o operador ternário, não é possível adicionarreturn
s oufor
s dentro deles! Seu comentário me deu a idéia de salvar mais alguns caracteres facilmente, removendo oreturn
que Obrigado.!C # 271bytes
Não é o mais curto, não consegui jogar a leitura de entrada devido à necessidade de aceitar 0 como entrada.
Código formatado:
fonte
Lua -
219203 bytesFui para fazer d cópias de b cópias de "|" e adicionar r cópias de "|" no fim. Eu sinto que talvez eu devesse ter subido a contagem dos "|" para a corda, uma de cada vez.
ungolfed:
Amostra:
fonte
JavaScript (193)
Isso pode ser excessivamente complexo.
Versão comentada
fonte
Python -
127123122Apenas entrando com uma versão python um pouco mais curta.
edit: Corrigido 0 não imprimindo nada e rejeitador, terminou com o mesmo comprimento
fonte
C (207 caracteres)
A nova linha logo antes
exit
é apenas para legibilidade.scanf
uso descaradamente roubado da Allbeert. Observe que esta solução não é compilada com o gcc, pois tenta impor um protótipo inexistente paraexit
. Compile com um compilador C funcional, comotcc
. Além disso, essa função pode ou não funcionar em plataformas de 64 bits. Use com cuidado.Aqui está a implementação original não-baseada em que isso se baseia:
fonte
Python 2 ,
134126123114 bytesExperimente online!
Velha pergunta que eu conheço, mas divertido de qualquer maneira. Chance de experimentar alguns truques que aprendi desde que entrei.
fonte