Os Cheela (do livro Ovo do Dragão, de Robert L. Forward) são criaturas que vivem na superfície de uma estrela de nêutrons. Seu corpo é plano e circular, com doze olhos no perímetro, então eles naturalmente usam um sistema de numeração de base 12.
Entre os Cheela, o cuidado com os filhotes e a educação dos jovens são tarefas realizadas pelos Antigos. Como o jovem Cheela precisa ser ensinado a multiplicar, os Antigos poderiam usar uma tabuada de multiplicação.
Sua tarefa é produzir uma tabela de multiplicação 12
x 12
na base 12
, como a seguir. Letras maiúsculas A
e B
são usadas para dígitos correspondentes a decimal 10
e 11
respectivamente.
1 2 3 4 5 6 7 8 9 A B 10
2 4 6 8 A 10 12 14 16 18 1A 20
3 6 9 10 13 16 19 20 23 26 29 30
4 8 10 14 18 20 24 28 30 34 38 40
5 A 13 18 21 26 2B 34 39 42 47 50
6 10 16 20 26 30 36 40 46 50 56 60
7 12 19 24 2B 36 41 48 53 5A 65 70
8 14 20 28 34 40 48 54 60 68 74 80
9 16 23 30 39 46 53 60 69 76 83 90
A 18 26 34 42 50 5A 68 76 84 92 A0
B 1A 29 38 47 56 65 74 83 92 A1 B0
10 20 30 40 50 60 70 80 90 A0 B0 100
A saída deve ser impressa na tela. O formato deve ser o seguinte:
- Os números devem estar alinhados à direita em cada coluna.
- São permitidos espaços à esquerda antes da primeira coluna, espaços à direita após a última coluna ou uma nova linha após a última linha.
A separação entre colunas pode ser um espaço (como mostrado acima) ou mais de um espaço, mas o número de espaços deve ser consistente entre as colunas. Para medir a separação de colunas, considere que os números exibidos incluem quaisquer espaços iniciais que possam ter sido necessários para atender ao requisito 1 (portanto, cada número ocupa três caracteres, o primeiro dos quais pode ser espaços). Por exemplo, a tabela com separação de dois espaços seria a seguinte:
1 2 3 4 5 6 7 8 9 A B 10 2 4 6 8 A 10 12 14 16 18 1A 20 3 6 9 10 13 16 19 20 23 26 29 30 4 8 10 14 18 20 24 28 30 34 38 40 5 A 13 18 21 26 2B 34 39 42 47 50 6 10 16 20 26 30 36 40 46 50 56 60 7 12 19 24 2B 36 41 48 53 5A 65 70 8 14 20 28 34 40 48 54 60 68 74 80 9 16 23 30 39 46 53 60 69 76 83 90 A 18 26 34 42 50 5A 68 76 84 92 A0 B 1A 29 38 47 56 65 74 83 92 A1 B0 10 20 30 40 50 60 70 80 90 A0 B0 100
O armazenamento do computador em uma estrela de nêutrons é muito caro, portanto, seu código deve usar o mínimo de bytes possível.
Desafio e bônus estendidos
Idealmente, seu código deve ser reutilizado em outras partes do universo, onde outros sistemas de numeração podem estar em uso. Para esse fim, o desafio é opcionalmente estendido da seguinte forma: Seu código aceita um número N
como entrada e gera uma tabela de multiplicação N
x N
na base N
, com o formato acima.
A entrada pode ser do teclado ou como argumento de função. O programa ou função deve funcionar para 2
≤ N
≤ 36
, usando como dígitos nos primeiros N
caracteres da seqüência 0
, 1
, ..., 9
, A
, B
, ..., Z
(maiúsculas letras)
Esse desafio estendido é opcional. Se você seguir esta rota, obtenha 20% de desconto na contagem de bytes (não é necessário arredondar para um número inteiro).
fonte
Because they have twelve eyes, they naturally use a base-12 numbering system.
Bem, naturalmente. É por isso que usar binário, afinal ... ;-)Respostas:
Pitão, 27 * 0,8 = 21,6
Experimente online: Demonstração
Explicação:
fonte
CJam, 33 * 0,8 = 26,4 bytes
Teste aqui.
Isso usa a separação mínima necessária.
Explicação
Tabela de entrada
22
(a maior que cabe na postagem sem uma barra de rolagem horizontal):fonte
MATL , 42 * 0,8 = 33,6
aviso Legal
Como o criador do idioma e o autor do desafio são os mesmos, esta resposta não é elegível para ganhar .
Para uma discussão sobre se essa restrição é necessária ou não, consulte esta meta questão .
Código
Isso usa a separação mínima.
Exemplo
Tabela de multiplicação octal
Explicação
Edit: Experimente online!
Para executar no compilador online (em 19 de fevereiro de 2016), altere
Y)
paraX:
e remova[]
. Isso é para se adaptar às alterações que foram feitas no idioma desde que este desafio foi lançado.fonte
Utilitários Bash + BSD, 36
O Works pronto para o uso no OS X.
rs
pode precisar ser instalado nos sistemas Linux.Co{1..12}d{1..12}*p
paraCo1d1*p Co1d2*p Co1d3*p ... Co1d12*p ... Co12d12*p
.dc
expressão que gera os termos necessários.Co
define a base de saída como 12.d
é usado como um separador entre números em vez de um espaço, portanto, não é necessário escapar na expansão de braçadeira.d
na verdade duplica a parte superior da pilha, mas isso é efetivamente ignorado e descartado.dc
é uma única linha separada por espaço.rs
remodela isso em uma matriz de 12x12.-j
justifica à direita cada termo.fonte
Pitão, 36 bytes
Experimente aqui.
fonte
Km+1dUJ12
porKSJ12
.S
cria o intervalo[1, 2, ..., 12]
. Você pode substituir ambosj""
ejk
pors
, desde a junção das strings. E outro byte: muderjbm...K1
parajmr...1K
. Com essas alterações, você obtém 28 bytes:KSJ12jmrsm.[\ 4sm.Hbj*dkJK1K
Python,
153147132 bytes * 0,8 = 105,6Até 132 bytes, graças aos conselhos de Tim Pederick! :)
fonte
rjust
('%4s'%f(...)
). Veja se a impressão de cada valor comprint ...,
(e umprint
para a nova linha) é menor quejoin
. Nesse caso, tente recolher os loops .and
Aor
B) dentro da funçãof
, usandon>=b
. Fiz isso até perceber que não era mais curto do que o que tinha antes,n//b
... mas você está usando o Python 2! Você pode salvar um byte comn/b
.CJam,
38333238 * (.8) = 30,4 bytesExperimente aqui.
(Parece muito semelhante ao de Martin agora.)
fonte
Perl 6 , 60 bytes -20% = 48 bytes
(Isso é quase exatamente como eu escreveria, mesmo que não estivesse tentando fazê-lo o mais curto possível)
Uso:
fonte
for(
como o início da chamada de uma sub-rotina nomeada emfor
vez dafor
construção do loop modificador . O que causaria um erro de compilação.JavaScript (ES6) 84 (105-20%)
A maneira óbvia, para começar.
Notas
alert
não é a melhor maneira de exibir a tabela, mas é a mais curta, pois há uma solicitação explícita para "exibir na tela"Menos golfe
fonte
Python 3, 126 - 20% = 100,8 bytes
A função externa,,
t
é a que realmente imprime a tabela de multiplicação. A função interna,,i
faz a conversão de um número em uma base de 2 para 36.Gorjeta de chapéu ao Boomerang por sua solução e por uma dica de golfe. Evitei copiar qualquer coisa da solução do Boomerang, mas me permiti olhar para ela para ver onde eu poderia aparar mais. E mesmo antes disso, descobri que quanto mais jogava golfe, mais os meus começaram a se parecer com os do Boomerang!
fonte
print(i(15,12),i(120,12),i(144,12),i(150,12))
seu código retorna em13 A0 00 06
vez de13 A0 100 106
. Infelizmente, a tarefa exige a impressão de um número n base de 3 dígitos (100). Não deve ser muito difícil de corrigir, mas pode adicionar alguns bytes ...n>=b
, nãon>b
.def t(b): i=lambda n:(n>=b and i(n//b)or'')+chr(n%b+[48,55][n%b>9]) R=range(b) for r in R:print(*('%3s'%i(~r*~c)for c in R))
Eu gostaria de fazer isso na minha solução, mas agora ambas as nossas soluções são muito perto, pode muito bem melhorar a melhor um ^^Javascript (ES6)
96,893,6 bytes (20% de 117)Explicação
- salvou 4 bytes graças a @ edc65
fonte
alert(b)
sem noeval
é mais curto. E, pelo menos, variável evitara
, é inútilb+=' '.repeat(4-a.length)+(i*j).toString(n).toUpperCase()
a
como você calcula...repeat(4-a.length)...
?MATLAB,
111 * 0,8 = 88,8110 * 0,8 = 88 bytesMinha estréia aqui:
Explicação:
[1:N]'*[1:N]
faça a tabuada de multiplicação na base 10dec2base([1:N]'*[1:N],N)
converter para a base 12. A saída é uma matriz de caracteres com 0-s iniciaisstrjoin(cellstr(dec2base(___)))
converter em célula e voltar a char que une strings com espaço produzindo 1x575 string[' ',strjoin(___)]
anexar espaço para ter 576 elementosstrrep(___,' 0',' ')
remova um zero inicial. Fazemos isso duas vezes porque temos strings com dois zeros à esquerdareshape(___,4*N,N)'
converter matriz de caracteres 1x576 em matriz de caracteres 48x12disp(___)
exibir o resultado semans =
Saída:
Se não contamos a instrução
N=12;
, os5*.8=4
bytes são salvos. Além disso, se aans =
saída for tolerada, podemos remover odisp()
salvamento de outros6*0.8=4.8
bytes. Claro, pode haver outras maneiras de salvar bytes :)fonte
ans
saída é tolerada se a saída for um argumento de função. Mas, neste caso, o desafio diz que "a saída deve ser impressa na tela", portantoans
não é permitido. Além disso,N
deve ser tomado como uma entrada no desafio estendido. Você pode resolver isso usando uma função anônima:,@(n)disp(reshape(strrep(strrep([' ',strjoin(cellstr(dec2base([1:N]'*[1:N],N)))],' 0',' '),' 0',' '),4*N,N)')
que você chamaria usandoans(12)
Python 3:
166161152 - 20% = 121,6 bytesEu sei que é inferior às respostas existentes em Python, mas imaginei tentar. É a minha primeira vez postando neste site…
fonte
APL,
3231 × 0,8 = 24,8 bytesIn origin 0. Em inglês:
∘.×⍨1+⍳⍵
: tabela de multiplicação⍵⊥⍣¯1¨
: expressa na base ⍵ cada elemento da tabela de multiplicação⊃∘(⎕D,⎕A)¨¨
: converte a tabela de vetores de números em uma tabela de vetores de caracteres¯4↑¨
: alinhar à direita com o comprimento 4 de cada elemento do resultadoA rotina de impressão APL padrão faz a coisa certa.
fonte
{¯4↑¨⊃∘(⎕D,⎕A)¨¨⍵⊥⍣¯1¨∘.×⍨1+⍳⍵}
Ruby,
6966 caracteres - 20% = 52,8Exemplo de execução:
fonte
ksh93, 51 * 0.8 == 40.8 bytes
Isso deve funcionar até a base 64 (o maior radical suportado pelo ksh). Exemplos:
fonte
Pyke, 14 bytes * 0,8 = 11,2 bytes, não competitivo
Experimente aqui!
Explicação:
Ou 12 bytes sem o bônus
fonte