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

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}/

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

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.


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(' ')}

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))

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.