Надрукуйте таблицю чисел у десяткових та 2 ** i базах


9

Комп'ютери живуть бінарними. Усі програмісти знають бінарне.

Але 2**xоснови часто нехтують як непрактичні, тоді як вони мають прекрасні стосунки до бінарних.

Показати вам один приклад такого красивого відношення, 19 буде моїм відгуком.

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

  • 10011 - це 19 у двійкових.

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

    • log2 (4) == 2, згадаймо два.
    • Накладка 10011 так, що вона має кратну 2 довжину -> 010011
    • Візьміть цифри 2 по 2 зліва направо і розглядайте їх як двоцифрові двійкові числа:

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

    Виконано , 10011 в базі-4 - 103.

Для бази 8 зробіть те саме, але 3 на 3, як log2 (8) = 3.

  • Накладка 010011
  • 010 -> 2
  • 011 -> 3

    23, Готово .

Для бази 16 зробіть те саме, але 4 на 4, як log2 (16) = 4.

  • Накладка 00010011
  • 0001 -> 1
  • 0011 -> 3

    13, Готово .

Завдання

Враховуючи максимальне число, ви виведете таблицю

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

для i, що йде від 0 до n включно. Двійкові числа є втіленням абсолютного мінімуму, необхідного для роботи, тому ваш код повинен бути якомога коротшим.

Обмеження та бонуси

  • База-десять -> двійкові та двійкові -> Вбудовані базові десятки вважаються лазівками, як 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(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-loop.
Yytsi

@TuukkaX: див. Використання: $ n має бути визначено перед фрагментом. Я знайшов цей байт, але дякую. І ще один: "\n"-> фізичний розрив лінії.
Тит

але мені довелося додати 3 байти, щоб надрукувати перший 0. (це або 5 байт, щоб запустити змінну).
Тит

0

Ruby, 80 байт (не-бонусна версія)

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 байт

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))(один рядок)
Leaky Nun
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.