Для любителей nandgame: пожалуйста, попробуйте DPD до десятичного числа в логических элементах !
Задний план
Плотно упакованный десятичный код (DPD) - это способ эффективно хранить десятичные цифры в двоичном формате. Он хранит три десятичных знака (от 000 до 999) в 10 битах, что намного эффективнее, чем наивный BCD (который хранит одну цифру в 4 битах).
нотации
- Буквы
a
в нижнем регистреi
- это биты, которые копируются в десятичное представление. 0
и1
являются точными битами во входных или выходных битовых комбинациях.x
биты игнорируются при преобразовании.
Таблица перевода
Ниже приведена таблица преобразования из 10 битов DPD в три десятичных знака. Каждая десятичная цифра представлена в виде 4-битного двоичного кода (BCD). Обе стороны пишутся слева направо от самой значимой цифры к наименьшей.
Bits => Decimal (Digit range)
a b c d e f 0 g h i => 0abc 0def 0ghi (0-7) (0-7) (0-7)
a b c d e f 1 0 0 i => 0abc 0def 100i (0–7) (0–7) (8–9)
a b c g h f 1 0 1 i => 0abc 100f 0ghi (0–7) (8–9) (0–7)
g h c d e f 1 1 0 i => 100c 0def 0ghi (8–9) (0–7) (0–7)
g h c 0 0 f 1 1 1 i => 100c 100f 0ghi (8–9) (8–9) (0–7)
d e c 0 1 f 1 1 1 i => 100c 0def 100i (8–9) (0–7) (8–9)
a b c 1 0 f 1 1 1 i => 0abc 100f 100i (0–7) (8–9) (8–9)
x x c 1 1 f 1 1 1 i => 100c 100f 100i (8–9) (8–9) (8–9)
задача
Преобразуйте 10 бит DPD в 3 десятичных знака.
Контрольные примеры
DPD Decimal
0000000101 005
0001100011 063
0001111001 079
0000011010 090
0001011110 098
1010111010 592
0011001101 941
1100111111 879
1110001110 986
0011111111 999
1111111111 999 * Output is same regardless of the `x` bits
вход
Формат ввода по умолчанию представляет собой список из 10 бит. Биты должны следовать точному порядку, указанному выше, или наоборот. Вместо этого вы можете использовать эквивалентную строку или целочисленное представление. В отличие от других моих задач, изменение порядка или использование вложенных структур не допускается .
Для ввода [1, 1, 0, 0, 0, 1, 0, 1, 0, 0]
допустимы следующие форматы:
- Список битов:
[1, 1, 0, 0, 0, 1, 0, 1, 0, 0]
- Строка:
"1100010100"
- Двоичное целое число:
788
или0b1100010100
- Десятичное целое число:
1100010100
- Перевернуто:
[0, 0, 1, 0, 1, 0, 0, 0, 1, 1]
и перевернуто в любых других форматах выше
Следующие форматы не допускаются:
- Произвольный порядок следования битов:
[0, 0, 0, 0, 0, 1, 1, 1, 0, 1]
- Вложенные структуры:
[[1, 1, 0], [0, 0, 1], [0, 1, 0, 0]]
или[0b110, 0b001, 0b0100]
Выход
Формат вывода по умолчанию представляет собой список из 3 десятичных цифр. Каждая цифра должна быть представлена от 0 до 9, либо целое число, либо символ. Как и при вводе, вы можете выбрать строковое или целочисленное представление. Если вы выбираете целочисленное представление, начальные нули могут быть опущены.
Критерий оценки и выигрыша
Применяются стандартные правила игры в гольф . Самая короткая программа или функция в байтах для каждого языка выигрывает.
источник
Python 3 ,
229 ... 9796 байтПопробуйте онлайн!
-4 байта @xnor
-6 байт @nwellnhof
отформатирован:
объяснение
Поскольку я изначально хотел реализовать это в Jelly, я придерживаюсь подхода, отличного от большинства приведенных здесь ответов, который прост и, возможно, подходит для языка игры в гольф. Хотя функция golfed принимает целое число, пусть вход будет в виде списка битов
[a0,a1,...,a9]
. Тогда мы можем получить три значения из ввода[a2,a5,a9]
: это всегда будут младшие биты[d0,d1,d2]
соответственно.[2*a0a1,2*a3a4,2*a7a8,8]
: старшие биты каждой цифры будут одним из них.[a3,a4,a5,a7,a8]
, определяющие, как получить старшие биты каждой цифры. Мы рассчитываем показатель (между 1 и 8) следующим образом:Затем можно элегантно вычислить n-ю цифру, как показано в
high_bits[arr[indicator][n]] | low_bits[n]
таблице ниже, которая сжата в строку.источник
b"..."
для замены конвертации наord
.b"$>6;-/'?"[a&8and(~a&6or a>>4&6|1)]
сохраняет еще четыре байта.JavaScript (Node.js) ,
126119117112111 байтПопробуйте онлайн!
-5 байт, спасибо @tsh (и 2 самостоятельно), поэтому
l
могу приложить больше усилий, чем я ожидал.Еще -2 байта, используя технику @ tsh!
-5 байт спасибо @Arnauld
-1 байт спасибо @Neil
Ввод в виде списка из 10 бит (как 10 аргументов), вывод в виде списка из 3 цифр.
источник
(!i|!d|e)
->i+l!=5
;(d|e|!h)
->h+l!=1
(g?h-i|h&!e?h?b:e:8:h*4+i*2)
->(g?h<i?e:h>i*e?b:8:h*4+i*2)
сохраняет еще один байт. (На этот раз я проверил ...)C (gcc) ,
138129 байтПопробуйте онлайн!
Сначала извлекает некоторые биты в переменные
s
иt
, таким образом, восемь строк таблицы преобразования можно определить по:Затем устанавливает
u
иv
с делениями (правые сдвиги), так чтоu
,v
и входомw
содержат нижние три КОРА бит в позициях 0-2. Остальное немного тасуется в зависимости отs
иt
. Два заметных трюка:Порт решения Javascript Ширу Асакото занимает всего 124 байта :
Попробуйте онлайн!
источник
f(b){int a=b/2%8,e=b&110,c=b/16,d=c/8;b=10*(10*(d%2|(6>a|78==e?d:8))+c%2+(3<a&a%2?e-46?8:d&6:c&6))+b%2+(4>a?b&6:a-5?a-6&&e-14?8:d&6:c&6)};
Рубин ,
153 ... 119117 байтПопробуйте онлайн!
Как это работает:
Это отправная точка: преобразовать в BCD, сдвинув 3 бита влево, что работает для большинства шаблонов.
Получите средние биты каждого полубайта (и один дополнительный бит третьего полубайта, но замаскируйте младший значащий бит).
Если третья цифра меньше 10 (меньше 9, потому что мы никогда не заботились о LSB), мы настроены: это обычный BCD, мы можем вывести гекс без каких-либо изменений
В противном случае сделайте немного черной магии, перемещая биты и добавляя магические числа, пока мы не получим желаемый результат.
источник
Сетчатка 0.8.2 ,
191181 байтПопробуйте онлайн! Ссылка включает в себя тестовые случаи. Редактировать: 10 байт сохранены, не дополняя цифры до 4 бит, кроме случаев, когда это необходимо. Объяснение:
Вставьте разделители, чтобы каждая цифра могла быть преобразована в десятичную отдельно. Это эффективно обрабатывает первые два случая в таблице преобразования.
Обработайте последний (восьмой) случай в таблице преобразования.
Обработайте шестой и седьмой случаи в таблице преобразования.
Обработайте пятый случай в таблице преобразования.
Обработайте третий и четвертый случаи в таблице преобразования.
Выполните двоичное преобразование в десятичное.
источник
Желе ,
51484039 байтПопробуйте онлайн!
Алгоритм
За исключением индексов списка, все целые числа в этом разделе записаны в двоичном виде.
В первом и последнем случае нам просто нужно сжать первый массив[ γ, ζ, κ ] , уступая [ α βγ,δε ζ, θ ι κ ] в первом случае и [ 100 γ, 100 ζ, 100 кГ ] напоследок.
Остальные два случая похожи, но массивы[ 100 , α β, δε ] а также [ 100 , 100 , α β] должны быть переупорядочены в соответствии со значениями [ θ ι ] и, возможно, δε ,
Во втором случае шесть перестановок[ 100 , α β, δε ] являются [ 100 , α β, δε ] , [ 100 , δε , α β] , [ α β, 100 , δε ] , [ α β, δε , 100 ] , [ δε,100,αβ] , а также [δε , αβ, 100 ] ,
Вычисляя100 - θ ι мы карту 00 , 01 , а также 10 до четырех, трех и двух, выбирая перестановки [ αβ,δε , 100 ] , [ αβ, 100 ,δε ] , а также [ 100 ,δε , αβ] ,
После архивирования результата с[γ,ζ, κ ] , мы получаем [ αβγ,δεζ, 100 кГ ] , [ αβγ, 100ζ,δε κ ] , или [ 100γ,δεζ, αβκ ] ,
В третьем случае перестановки (с дубликатами)[100,100,αβ] are [100,100,αβ] , [100,αβ,100] , [100,100,αβ] , [100,αβ,100] , [αβ,100,100] and [αβ,100,100] .
By computing(100−θι)−(100−δε)=δε−θι=δε−11 , we map 00 , 01 , and 10 to three, four, and five modulo six, selecting the permutations [100,100,αβ] , [100,αβ,100] , and [αβ,100,100] .
After zipping the result with[γ,ζ,κ] , we get [100γ,100ζ,αβκ] , [100γ,αβζ,100κ] , or [αβγ,100ζ,100κ] .
Code
источник
Python 2, 157 bytes
Try it online!
источник
Clean,
238... 189 bytes-2 bytes thanks to Neil
Try it online!
Takes a 'list' of 10 bits in the form of 10 arguments, using a direct formula to compute the result.
источник
i*(9*e+19*d+i*...)
, that secondi*
looks unnecessary.Perl 5, 195 bytes
Try it online
I know 195 bytes is far too much for this contest, but I had no idea how to further compress the Perl code. Suggestions?
Explanation of the code
В более читаемой версии намерение кода должно стать очевидным:
В правилах для кодирования DPD каждая строка кодируется в 18-битное значение, сегментирование на (6,6, (2,2,2)) бит.
@p
для 3-битных последовательностей, которые должны быть разделены на биты 11-9, 7-5 и 3-1 результата.@p
состоит из битов 9-8, 6-5, 3-2 входа и числа в8
качестве четвертого членаНапример, первое число в списке,
16390
которое является100000000000110
битовым полем, содержит следующую информацию:источник
05AB1E , 84 байта
Ответ порта КимОйхус на 05AB1E.
Попробуйте онлайн!
Грубое объяснение:
источник
05AB1E ,
104103101 байтОпределенно не подходящий язык для такого рода задач, но, ну, ладно ...
Ввод в виде строки, вывод в виде списка из трех цифр.
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
У нас есть следующие восемь сценариев для рассмотрения:
Сначала я делю входные данные (неявные) на куски размера
[2,1,2,1,3,1]
и сохраняю этот список в регистре:Смотрите этот 05AB1E наконечник шахты (раздел Как сжать большие целые числа? ) , Чтобы понять , почему
•3γã•
это212131
Теперь мы сначала собираемся построить 0 и 1 для первой цифры вывода. Сценарии использования 1,2,3,7
'0'+1st+2nd
; и сценарии 4,5,6,8 использования'100'+2nd
:Затем мы собираемся построить 0 и 1 для второй цифры вывода. Сценарии использования 1,2,4
'0'+3rd+4th
; сценарии использования 3,5,7,8'100'+4th
; и сценарий 6 использует'0'+1st+4th
:Затем мы собираемся построить 0 и 1 для третьей цифры вывода. Сценарии использования 1,2
5th+6th
; сценарий 3 использует'0'+3rd+6th
; сценарии 4,5 использования'0'+1st+6th
; и сценарии 6,7,8 использования'100'+6th
:Теперь у нас в стеке все 0 и 1, поэтому мы можем преобразовать их в три выходные цифры:
источник