Вызов
Учитывая ASCII представление вавилонского числа в качестве входных данных, выведите число западно-арабскими цифрами.
Вавилонская система счисления
Как рассчитывали вавилоняне? Интересно, что они использовали систему Base 60 с элементом системы Base 10. Давайте сначала рассмотрим единичный столбец системы:
Вавилоняне имели только три символа: T
(или, если вы можете сделать это :), 𒐕
которые представляли 1, и <
(или, если вы можете сделать это:), 𒌋
которые представляли 10, и \
(или, если вы делаете это:), 𒑊
которые представляли ноль.
Примечание: Технически, \
(или 𒑊
) не ноль (потому что вавилоняне не имели понятия «ноль»). «Ноль» был изобретен позже, поэтому позже \
был добавлен символ-заполнитель, чтобы предотвратить двусмысленность. Однако для целей этой задачи достаточно считать \
ноль
Итак, в каждом столбце вы просто складываете значение символов, например:
<<< = 30
<<<<TTTTTT = 46
TTTTTTTTT = 9
\ = 0
В каждом столбце никогда не будет больше пяти <
или больше девяти T
. \
всегда будет отображаться один в столбце.
Теперь нам нужно расширить это, добавив больше столбцов. Это работает точно так же, как и любое другое базовое значение шестьдесят, где вы умножаете значение самого правого столбца на , слева на , слева на и так далее. Затем вы складываете значение каждого, чтобы получить значение числа.
Столбцы будут разделены пробелами, чтобы предотвратить двусмысленность.
Некоторые примеры:
<< <TT = 20*60 + 12*1 = 1212
<<<TT \ TTTT = 32*60^2 + 0*60 + 4*1 = 115204
правила
- Вы можете принять ввод ASCII (
T<\
) или Unicode (𒐕𒌋𒑊
) - Введенное число всегда будет меньше
<
S всегда будет слева отT
й в каждой колонке\
всегда будет появляться один в столбце
выигрыш
Самый короткий код в байтах побеждает.
источник
<<<<TTTTTT <TTTTTTT <<<<TTTTTT <<<<
"How did the Babylonians count? Interestingly, they used a Base 60 system with an element of a Base 10 system."
Который все еще используется сегодня; Вавилонская система счисления - это именно то, что мы используем для часов. Две десятичные цифры каждая для секунд, минут и часов, 60 секунд до минуты, 60 минут до часа.Ответы:
JavaScript (ES6), 44 байта
Принимает ввод как массив символов ASCII.
Попробуйте онлайн!
Как?
Вавилонскую систему счисления можно рассматривать как язык из четырех инструкций, работающий с одним регистром - назовем его аккумулятором.
Начиная с , каждый символ c во входном массиве a изменяет аккумулятор k следующим образом:k=0 c a k
space
: умножить на 60 (реализовано как: добавить 59 k к k )<
: добавь к kT
: приращение\
: ничего не делать; этоNOP
инструкция этого языка (реализовано как: добавить к k )источник
C (gcc) ,
140138136 байтПопробуйте онлайн!
источник
Perl 6 , 39 байт
-3 байта благодаря nwellnhof
Попробуйте онлайн!
Использует клинописные символы.
Объяснение:
источник
{:60[.words>>.&{sum (.ords X%151)X%27}]}
(40 байт)Желе ,
1312 байтМонадическая ссылка, принимающая список символов, который дает целое число.
Попробуйте онлайн!
Как?
Еще 12:
ḲO⁽¡€%:5§ḅ60
(⁽¡€
это1013
, так что это модули1013
со стороныO
rdinal значений получает53
,5
и1
для<
,T
,\
соответственно , а затем выполн ют целочисленное деление, с:
помощью ,5
чтобы получить10
,1
и0
)источник
05AB1E , 13 байтов
Попробуйте онлайн!
Чтобы восполнить, насколько ленивым я был с моим ответом Jelly, вот представление в 05AB1E xD.
источник
8740
?•Yη•
(4 байта)1|Ç7%-13%O60β
также 13 - это гольф?Python 2 ,
96938785 байтПопробуйте онлайн!
Добавлено:
источник
(ord(c)%5/2or 11)-1
8740%ord(c)/4
Excel VBA, 121 байт
Ограничено 32-битным Office, так как
^
служитLongLong
литералом типа в 64-битных версияхПринимает данные из ячейки
A1
и выводит их в непосредственное окно vbe.Ungolfed и комментируется
источник
Дьялог АПЛ ,
3330 байтПопробуйте онлайн!
Редактировать: -3 байта благодаря ngn
'\ T<'⍳
заменяет символы числами (их положение в строковой константе) и⌽
переворачивает ввод, чтобы наиболее значимые «цифры» были последними. Это позволяет+\2=
вести текущий подсчет желаемой степени 60 (применено60*
) путем подсчета количества встречений с пробелом (индекс 2 в строковой константе).⌊10*⍵-3
дает желаемую силу десяти для каждого персонажа. Порядок символов в строковой константе и смещение -3 приводят к тому, что '\' и пробел переходят в отрицательные числа, что приводит к дробным значениям, когда эти символы возводятся в степень 10, что позволяет их исключить с помощью⌊
.Все, что нам нужно сейчас сделать, - это умножить числа степеней 10 на значения мест степеней 60 и суммировать с этим все
+/
.источник
' '
:{+/(⌊10*⍵-3)×60*+\2=⍵}'\ T<'⍳⌽
Python 2 , 62 байта
Попробуйте онлайн!
Это использует технику из ответа Арно .
источник
Холст ,
201716 байтовПопробуй это здесь!
Объяснение:
источник
APL (NARS ⎕io ← 0), 28 символов, 56 байтов
некоторый тест с проверкой типа:
Каждый тип результата является числом.
источник
JavaScript (Node.js) ,
12211410710683 байтаПопробуйте онлайн!
Я немного одержим операциями с массивами в «функциональном стиле», использую ввод ASCII, насколько я могу судить, JS не очень хорош в получении кодов в гольфе
Я сохраняю это для потомков, но это наивное / глупое решение, я предлагаю вам проверить ответ Арно, который гораздо интереснее в реализации задачи
источник
c<'T'
работает вместоc=='<'
&&
на|
.for...of
циклы: PСетчатка ,
292623 байтаПопробуйте онлайн! Использует разделение новой строки, но ссылка включает заголовок, чтобы использовать пробелы вместо этого для удобства. Редактировать: 3 байта сохранены с помощью @KevinCruijssen. Сохранено еще 3 байта благодаря @FryAmTheEggman. Объяснение:
Замените каждый
<
с 10T
с.Возьмите первую строку, умножьте ее на 60 и добавьте следующую строку. Затем повторяйте, пока не останется только одна строка.
Посчитай
T
с.Более быстрая 51-байтовая версия:
Попробуйте онлайн! Использует разделение новой строки, но ссылка содержит заголовок, чтобы вместо этого использовать пробелы Объяснение:
Подберите каждую строку отдельно и посчитайте количество
T
s и в 10 раз больше числа<
s. Это преобразует каждую строку в ее базовое 60-значное значение.Преобразование базы 60, запуск линии за раз. Вычисление выполняется в десятичном формате для скорости.
источник
<
без+
, если только я не вижу какой-то крайний случай.$&
теперь всегда один символ, я могу использовать символ по умолчанию, сохраняя еще два байта!_
время$*
в более ранних версиях Retina по умолчанию1
.<
как одиночное совпадение и повторял их в 10 раз больше (количество<
в матче), и мое предлагаемое изменение повторяется каждые<
отдельно 10 раз (что вы играли на 2 байта больше, используя неявную 1 с10*
). Теперь я лучше понимаю, почему это+
было изначально. Я не знаю слишком много о встроенных функциях Retina, только регулярные выражения в целом, поэтому я предложил изменение, потому что я уже читал его как повторение каждые>
10 раз. ;)Bash (с sed и dc), 50 байтов
Принимает разделенный пробелами ввод
stdin
, выводит вstdout
Попробуйте онлайн!
объяснение
Использует sed для преобразования ввода с кучей совпадений регулярных выражений, например, до
<<<TT \ TTTT
тех пор, пока ввод не будет преобразован вA+A+A+1+1+60*60*1+1+1+1+
. Затем этот вход подается в dc с явной командой выполнения ввода?
, перед которой стоитz
(помещает длину стека (0) в стек, чтобы у нас было где-то обосновать сложение), а затемp
(print).источник
J ,
3430 байтПопробуйте онлайн!
источник
Дьялог АПЛ,
3532 байтаПопробуйте онлайн!
31 в Дзайма / APL
источник
Нетер , 55 байт
Попробуйте онлайн!
Тот же подход, что и у @Arnauld.
источник
Древесный уголь , 26 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Очистить результат.
Зацикливайте вводимые символы. Команда
≡
обернута в блок, чтобы не найти блок «по умолчанию».Переключить текущий персонаж ...
если это пробел, умножьте результат на 60 ...
если это
<
то добавить 10 к результату ...если это,
T
то увеличивайте результат.Распечатайте результат.
источник
R ,
9881 байтПопробуйте онлайн!
Смешно долго из-за разбора строки.Спасибо Giusppe за то, что он сбрил 16 ненужных байтов.определять
y
значение байт-кода ввода Unicode иR = y("T<\") = y("𒐕𒌋𒑊")
Соблюдайте это
R%%3 = 1,2,0
иR%%6 = 1,5,0
... такR%%3 * R%%6 = 1,10,0
!Остальное легко: сумма на столбец, затем скалярное произведение с убывающей степенью 60.
источник
scan(,"")
разделяется на пробелы автоматически?/60
его можно заменить-1
в выражении экспоненты для другого выключенного байта, плюс<-
можно заменить на,=
так как все в скобках.Рубин ,
5046 байтовПопробуйте онлайн!
Базовый порт ответа Арнаулда улучшен на GB для -4 байтов.
источник
C (gcc) ,
656463 байтаПопробуйте онлайн!
источник
return o
сs=o
сохранением еще 5 байтов.Java 8,
6460 байт-4 байта благодаря @ceilingcat .
Попробуйте онлайн. Объяснение:
источник
Perl -F // -E, 39 байт
Это читает номер для преобразования из STDIN.
Это существенно то же решение, которое было дано @Arnauld с использованием JavaScript.
источник
F #, 128 байт
Попробуйте онлайн!
Развернувшись, это будет выглядеть так:
Seq.mapFoldBack
сочетает в себеSeq.map
иSeq.foldBack
.Seq.mapFoldBack
повторяет последовательность в обратном порядке и пропускает значение накопителя в последовательности (в этом случаеi
).Для каждого элемента в последовательности вычисляется вавилонское число (с помощью
Seq.sumBy
которого каждый символ отображается на число и суммируется результат), а затем умножается наi
.i
затем умножается на 60, и это значение затем передается следующему элементу в последовательности. Начальное состояние для аккумулятора - 1.Например, порядок вызовов и результатов
Seq.mapFoldBack
для ввода<<<TT \ TTTT
будет:Функция возвращает кортеж
seq<int>, int
.fst
Функция возвращает первый элемент в этом наборе, иSeq.sum
делает фактическое суммирование.Почему бы не использовать
Seq.mapi
или подобное?Seq.mapi
сопоставляет каждый элемент в последовательности и предоставляет индекс для функции отображения. Оттуда вы могли бы сделать60 ** index
(где**
находится оператор питания в F #).Но
**
требуетfloats
, нетints
, что означает, что вам нужно либо инициализировать, либо привести все значения в функцию какfloat
. Вся функция вернетfloat
, что (на мой взгляд) немного грязно.С
Seq.mapi
его помощью можно сделать 139 байт :источник
Tcl , 134 байта
Попробуйте онлайн!
В обратном списке я зацикливаю приращение результата в подсчете
<
иT
(с-all
опцией regexp) и увеличиваю натуральное как степень 60.Правильная версия (см. Комментарий)
источник
regsub {\\} $l0 l
цикл перед foreach ....APL (Dyalog Extended) , 18 байт SBCS
Функция анонимного молчаливого префикса.
Попробуйте онлайн!
источник
05AB1E (legacy) , 10 байтов
Попробуйте онлайн!
05AB1E , 11 байт
Попробуйте онлайн!
Тот же алгоритм, но в современном 05AB1E
O
не работает со списками смешанных целых и списков, поэтому нам нужно€O
вместо этого.источник