Распечатать таблицу чисел в десятичной и 2 ** я базисах


9

Компьютеры живут по бинарному. Все программисты знают двоичный код.

Но 2**xбазы часто пренебрегают как непрактичные, в то время как они имеют прекрасное отношение к бинарному.

Чтобы показать вам один пример такого прекрасного отношения, 19 будет моим свидетельством.

19 10011 103 23 13 j
  • 19 - десятичное число, включенное для ясности.

  • 10011 - это 19 в двоичном виде.

  • 103, в базе 4 сделано, начиная с двоичного, таким образом:

    • log2 (4) == 2, давайте вспомним два.
    • Подушка 10011, чтобы она была кратна длине 2 -> 010011
    • Возьмите цифры 2 на 2 слева направо и рассматривайте их как 2-значные двоичные числа:

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

    Готово , 10011 в базе 4 - 103.

Для базы 8, сделайте то же самое, но 3 на 3, как log2 (8) = 3.

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

    23, Готово .

Для базы 16 сделайте то же самое, но 4 на 4, как log2 (16) = 4.

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

    13, Готово .

задача

Учитывая максимальное число в качестве входных данных, вы должны вывести таблицу

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

для меня это идет от 0 до п включительно. Двоичные числа являются воплощением абсолютного минимума, необходимого для работы, поэтому ваш код должен быть максимально коротким.

Ограничения и бонусы

  • Base-ten -> двоичные и двоичные -> Встроенные Base-ten рассматриваются как лазейки, как Base-a -> Base-b.

  • Если вы сгенерируете все 2**i(для i> 2) базисов, используя вышеупомянутые отношения, вы получите *0.6бонус, но общие преобразования баз (написанные вами) разрешены.

Пример таблицы

> 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
Понижено из-за «Вы должны сгенерировать все 2 ** i (для i> 2) базисов, используя вышеупомянутые отношения». Требование определенного алгоритма удаляет многое из того, что делает код гольф интересным. Вы можете запретить встроенные базовые функции преобразования, при этом оставляя выбор алгоритма.
xnor

@xnor, теперь использующий мой метод, дает только бонус, чтобы дать больше свободы игрокам в гольф
Caridorc

1
Я тоже не фанат бонуса. Это фактически означает, что вы должны использовать встроенный или ваш алгоритм, и никакой другой алгоритм не может быть жизнеспособным.
xnor

Встроенные модули @xnor не допускаются. Общий конвертер будет короче, поэтому я дам бонус, если вы используете мои придуманные правила конвертации
Caridorc

Ответы:


2

CJam, 54 * 0,6 = 32,4 байта

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

Проверьте это здесь.

Для справки, вот более короткое решение, которое не может претендовать на бонус (в 39 байт):

q~){:X5{SLX{2I)#md_9>{'W+}&@+\}h;}fIN}/

Я обновил вызов, вы можете претендовать на бонус 0,6 *, если вы использовали мой метод
Caridorc


0

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

нет шансов победить языки игры в гольф, но мне понравился вызов.

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];}
  • использование: добавить $n=32;или заменить $nна 32(или любое другое неотрицательное целое число); звоните через кли
  • Если это не принято, замените $nна $_GET[n](+ 6 / + 3,6) и позвоните либо в браузере,
    либо в Cli сphp-cgi -f bases.php -n=32
  • Замените разрыв строки на <br>или добавьте <pre>для проверки в браузере
  • может выдавать уведомления для неопределенных переменных и неинициализированных смещений строк в новых версиях PHP.
    Удалите E_NOTICE из error_reporting (prepend error_reporting(0);), чтобы подавить их.
  • протестировано в 5.6

сломать:

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
}

основное редактирование:

  • использовал некоторую магию индекса, чтобы обновить внутренний цикл -> теперь работает в обратном направлении на всей строке (больше не нужно заполнять, не разбивать или копировать двоичный файл)
  • переместил части тела петли к головкам, чтобы устранить скобы
  • пришлось добавить 7 4 байта, чтобы исправить десятичные 0 результатов после реконструкции

не бонусная версия, 142 байта

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 побеждает Python?
Даже если бы я добавил 6 (3,6) байтов, чтобы сделать фрагмент программы, я все равно побил бы Python (223 * 0,6 = 133,8 или 148 без бонусов против 158). Удивительно.


Я получаю сообщение об ошибке «Неопределенная переменная: n: 1», и я думаю, что вы можете сохранить 1 байт, удалив пробел после forключевого слова во внешнем цикле for.
Yytsi

@TuukkaX: см. Использование: $ n должно быть определено перед фрагментом. Я нашел этот байт, но спасибо. И еще: "\n"-> физический разрыв строки.
Тит

но мне пришлось добавить 3 байта, чтобы вывести первые 0. (это или 5 байтов для инициализации переменной).
Тит


0

Python3 - 189, 167, 166, 150 байт

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

Сохранено 16 байт с помощью @ LeakyNun !

Бонусная версия - 296 * 0,6 = 177,6 279 * 0,6 = 167,4 байта

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

Чуть более читаемая версия бонусной версии.

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

Я уверен, что бонус не применяется. Вы не используете двоичный файл для получения базовых 2 ** х чисел.
Тит

@ Titus О, тогда я понял бонус неправильно. Я отредактирую количество байтов. Спасибо!
Yytsi

Довольно уверен, что "0123456789abcdefghijklmnopqrstuv"корочеfrom string import* digits+ascii_lowercase
Leaky Nun

@ LeakyNun Упс. Вы правы. Я только думал о том, как коротко написать digits+ascii_lowercase: D. Спасибо!
Yytsi

150 байтов: 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))(одна строка)
прохлада монахиня
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.