Imprimir uma tabela de números em bases decimais e 2 ** i

9

Computadores vivem por binários. Todos os programadores sabem binário.

Mas as 2**xbases são frequentemente negligenciadas como não práticas, enquanto mantêm belas relações com o binário.

Para mostrar um exemplo de uma relação tão bonita, 19 será meu testemunho.

19 10011 103 23 13 j
  • 19 é decimal, incluído para maior clareza.

  • 10011 é 19 em binário.

  • 103, na base 4 é feita a partir do binário desta maneira:

    • log2 (4) == 2, vamos lembrar dois.
    • Almofada 10011 para que ela tenha um múltiplo de 2 comprimento -> 010011
    • Pegue os dígitos 2 por 2 da esquerda para a direita e trate-os como números binários de 2 dígitos:

      • 01 -> 1
      • 00 -> 0
      • 11 -> 3

    Feito , 10011 na base-4 é 103.

Para a base 8, faça o mesmo, mas 3 por 3, como log2 (8) = 3.

  • Pad 010011
  • 010 -> 2
  • 011 -> 3

    23, Feito .

Para a base 16, faça o mesmo, mas 4 por 4, como log2 (16) = 4.

  • Pad 00010011
  • 0001 -> 1
  • 0011 -> 3

    13, Feito .

Tarefa

Dado um número máximo como entrada, você deve gerar uma tabela

base-ten-i base-two-i base-four-i base-eight-i base-sixteen-i base-thirtytwo-i

para i que vai de 0 a n inclusive. Os números binários são o epítome do mínimo absoluto necessário para funcionar, portanto, seu código deve ser o mais curto possível.

Restrições e bônus

  • Base-dez -> binário e binário -> Base-dez embutidos são considerados brechas como Base-a -> Base-b.

  • Se você gerar todas as 2**ibases (para i> 2) usando as relações mencionadas acima, receberá um *0.6bônus, mas as conversões básicas de base (escritas por você) serão permitidas.

Tabela de exemplo

> 32
0 0 0 0 0 0
1 1 1 1 1 1
2 10 2 2 2 2
3 11 3 3 3 3
4 100 10 4 4 4
5 101 11 5 5 5
6 110 12 6 6 6
7 111 13 7 7 7
8 1000 20 10 8 8
9 1001 21 11 9 9
10 1010 22 12 a a
11 1011 23 13 b b
12 1100 30 14 c c
13 1101 31 15 d d
14 1110 32 16 e e
15 1111 33 17 f f
16 10000 100 20 10 g
17 10001 101 21 11 h
18 10010 102 22 12 i
19 10011 103 23 13 j
20 10100 110 24 14 k
21 10101 111 25 15 l
22 10110 112 26 16 m
23 10111 113 27 17 n
24 11000 120 30 18 o
25 11001 121 31 19 p
26 11010 122 32 1a q
27 11011 123 33 1b r
28 11100 130 34 1c s
29 11101 131 35 1d t
30 11110 132 36 1e u
31 11111 133 37 1f v
32 100000 200 40 20 10
Caridorc
fonte
4
Diminuiu o voto por causa de "Você deve gerar todas as 2 ** i (para i> 2) bases usando as relações mencionadas acima". Exigir um algoritmo específico remove muito do que torna o código golfe interessante. Você pode banir as funções de conversão de base incorporadas enquanto ainda permite a escolha do algoritmo.
xnor
@xnor agora usando o meu método só dá um bônus, para dar mais liberdade para os golfistas
Caridorc
11
Também não sou fã do bônus. Isso significa efetivamente que você deve usar um algoritmo interno ou seu algoritmo, e nenhum outro algoritmo pode ser viável.
xnor
Os built-ins do @xnor não são permitidos. Um conversor geral será mais curto, então eu dou um bônus se você usar minhas regras de conversão artificial
Caridorc 19/09/2015

Respostas:

2

CJam, 54 * 0,6 = 32,4 bytes

q~){_5,f{)L@{2md@+\}h(%/Wf%W%{{\2*+}*_9>{'W+}&}%S\}N}/

Teste aqui.

Para referência, aqui está uma solução mais curta que não se qualifica para o bônus (em 39 bytes):

q~){:X5{SLX{2I)#md_9>{'W+}&@+\}h;}fIN}/
Martin Ender
fonte
Eu atualizei o challange, você pode reivindicar um 0,6 * bônus se você usou o meu método
Caridorc
1

Pitão, 52 * 0,6 = 31,2 bytes

L?b+%b2y/b2YVUhQjd+NmjkX|_uL++GGHZ_McyNd]ZUQ+jkUTGS5

Teste on-line

Minha resposta sem bônus é 39 bytes

M?G+g/GHH@+jkUTG%GHkVUhQjd+N|R0gLN^L2S5
Brian Tuck
fonte
0

PHP, 232 230 233 217 * 0,6 = 130,2

sem chance de vencer as línguas do golfe, mas gostei do desafio.

for(;$d<=$n;$d++){echo'
',$d|0;for($k=$d,$b='';$k;$k>>=1)$b=($k&1).$b;for($w=1;$w<6;$w++,print" $z"|' 0')for($z='',$k=strlen($b);-$w<$k-=$w;$z=($e>9?chr($e+87):$e).$z)for($e=0,$y=1,$j=$w;$j--;$y*=2) $e+=$y*$b[$j+$k];}
  • uso: adicione $n=32;ou substitua $npor 32(ou qualquer outro número inteiro não negativo); ligar via cli
  • Se isso não for aceito, substitua $npor $_GET[n](+ 6 / + 3.6) e ligue no navegador
    ou no cli comphp-cgi -f bases.php -n=32
  • Substitua a quebra de linha por <br>ou adicione-a <pre>para testar no navegador
  • pode lançar avisos para variáveis ​​indefinidas e desvios de cadeia não inicializados em versões mais recentes do PHP.
    Remova E_NOTICE de error_reporting (prepend error_reporting(0);) para suprimi-los.
  • testado em 5.6

demolir:

for(;$d<=$n;$d++) // loop decimal $d from 0 to $n
{
    echo'
',$d|0; // print line break and decimal
    for($k=$d,$b='';$k;$k>>=1)$b=($k&1).$b; // convert $d to binary
    for($w=1;$w<6;$w++,
        print" $z"|' 0' // print number generated in inner loop (echo doesn´t work here)
    )
        for($z='',$k=strlen($b);-$w<$k-=$w; // loop from end by $w
            $z=($e>9?chr($e+87):$e).$z // prepend digit created in body
        )
            for($e=0,$y=1,$j=$w;$j--;$y*=2) $e+=$y*$b[$j+$k]; // convert chunk to 2**$w
}

edição principal:

  • usou alguma mágica de índice para renovar o loop interno -> agora funciona para trás em toda a cadeia (sem mais preenchimento, sem mais divisão ou cópia do binário)
  • partes movidas dos corpos do laço para as cabeças para eliminar chaves
  • teve que adicionar 7 4 bytes para corrigir os resultados decimais 0 após a renovação

versão sem bônus, 142 bytes

for(;$d<=$n;$d++,print'
',$d|0)for($w=1;$w<6;$w++,print" $z"|' 0')for($k=$d,$y=1,$z='';$k&&$y<<=$w;$k>>=$w)$z=(9<($e=$k%$y)?chr($e+87):$e).$z;

PHP vence Python?
Mesmo se eu adicionasse os 6 (3.6) bytes para tornar o snippet um programa, eu ainda venceria o Python (223 * 0,6 = 133,8 ou 148 sem bônus vs. 158). Surpreendente.

Titus
fonte
Recebo um erro 'Variável indefinida: n: 1' e acho que você pode economizar 1 byte removendo um espaço após a forpalavra - chave no loop for mais externo.
Yytsi
@TuukkaX: veja o uso: $ n deve ser definido antes do snippet. Encontrei esse byte, mas obrigado. E mais um: "\n"-> quebra de linha física.
Titus
mas tive que adicionar 3 bytes para imprimir o primeiro 0. (esse ou 5 bytes para iniciar a variável).
Titus
0

Ruby, 80 bytes (versão sem bônus)

m=ARGV[0].to_i;(0..m).each{|n|puts [10,2,4,8,16,32].map{|b|n.to_s(b)}.join(' ')}
jose_castro_arnaud
fonte
0

Python3 - 189, 167, 166 150 bytes

for i in range(int(input())+1):f=lambda b,n=i,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(b,n//b)+c[n%b];print(i,f(2),f(4),f(8),f(16),f(32))

Guardou 16 bytes com a ajuda de @ LeakyNun !

Versão bônus - 296 * 0.6 = 177.6 279 * 0.6 = 167.4 bytes

p=lambda b,c:"".join(str(int(b[i:i+c],2))for i in range(0,len(b),c))
z=lambda s:len(s)%2 and s or "0"+s
for i in range(int(input())+1):f=lambda n,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(n//b,b)+c[n%b];v=f(i,2);d=z(v);print(i,v,p(d,2),p(d,3),p(d,4),p(d,5),f(i,32))

Versão ligeiramente mais legível da versão bônus.

p=lambda b,c:"".join(str(int(b[i:i+c],2))for i in range(0,len(b),c))
z=lambda s:len(s)%2 and s or "0"+s
for i in range(int(input())+1):
    f=lambda n,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n] or f(n//b,b) + c[n%b]
    v=f(i,2)
    d=z(v)
    print(i,v,p(d,2),p(d,3),p(d,4),p(d,5),f(i,32))
Yytsi
fonte
Tenho certeza de que o bônus não se aplica. Você não está usando o binário para produzir os números 2 ** x base.
Titus
@ Titus Oh, entendi o bônus errado então. Vou editar a contagem de bytes. Obrigado!
Yytsi 04/07/19
A certeza "0123456789abcdefghijklmnopqrstuv"é menor do que a #from string import* digits+ascii_lowercase
Leaky Nun
@LeakyNun Oops. Você está certo. Eu só pensei em quão curto é escrever digits+ascii_lowercase: D. Obrigado!
Yytsi 04/07/19
150 bytes: for i in range(int(input())+1):f=lambda n=i,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(n//b,b)+c[n%b];print(i,f(2),f(4),f(8),f(16),f(32))(uma linha)
Leaky Nun 04/04