Напишите функцию, которая, учитывая первые 12 цифр кода ISBN-13 , будет вычислять весь ISBN путем вычисления и добавления соответствующей контрольной цифры.
Ввод вашей функции - это строка, содержащая первые 12 цифр номера ISBN. Его выводом является строка, содержащая все 13 цифр.
Формальная спецификация
Напишите функцию, которая при задании строки s, состоящей полностью из ровно 12 десятичных цифр (и без других символов), возвращает строку t со следующими свойствами:
- t состоит ровно из 13 десятичных цифр (и никаких других символов);
- s является префиксом t ;
- сумма всех цифр в нечетных позициях в t (т. е. первой, третьей, пятой и т. д.), плюс в три раза сумма всех цифр в четных позициях в t (т. е. второй, четвертой, шестой и т. д.), представляет собой кратный 10.
Пример / тестовый пример
вход
978030640615
Выход
9780306406157
Состояние победы
В качестве кода-игры для гольфа победит самый короткий ответ.
Ответы:
Golfscript - 25 символов
Всего версия программы всего 19 символов
Перепроверьте здесь для анализа позже. А пока посмотри мой старый скучный ответ
Golfscript - 32 символа
Аналогично вычислению числа Луна
Анализ для 978030640615
источник
{
и последних трех символов;}:f
, Интересно, можно ли сделать то же самое для первого решения ...:f
(да, я знаю, что функции обычно назывались тогда).Python - 44 символа
Python - 53 символа
источник
Хаскель - 54 персонажа
Это требует поддержки параллельных списков , которые поддерживаются GHC (с
-XParallelListComp
флагом) и Hugs (с-98
флагом).источник
[1,3]
на[9,7]
и удалить-
что экономит байт :)APL (27 символов)
Я использую Dyalog APL в качестве моего переводчика. Вот краткое объяснение, в основном справа налево (в пределах определения функции
F←{ ... }
):⍎¨⍵
: Выполнить / оценить (⍎
) каждый (¨
) символ, указанный в правом аргументе (⍵
).(12⍴1 3)
: Изменить форму (⍴
) вектора1 3
на вектор12
-элемента (повторяя, чтобы заполнить пробелы).+.×
: Возьмите скалярное произведение (+.×
) его левого аргумента ((12⍴1 3)
) и его правого аргумента (⍎¨⍵
).10-
: Вычесть из 10.10|
: Найти остаток после деления на10
.⍕
: Отформатируйте число (т.е. дайте представление символа).⍵,
: Добавить (,
) нашу вычисленную цифру к правильному аргументу.источник
PHP -
868582 символовПереформатировать и объяснить:
источник
Windows PowerShell, 57
источник
Haskell,
787166 символовисточник
Рубин -
7365 символовисточник
"\\1"
->'\1'
?f=->s{...}
. Сохранить 6 символов. Также напишитеs<<(...).to_s
вместо добавления 48 и используйтеFixnum#chr
.C # (94 символа)
С разрывами строки / пробелами для удобства чтения:
Проверено на нескольких ISBN из книг на моей полке, так что я знаю, что это работает!
источник
Питон -
91, 89источник
for
(иin
и третьим) в понимании списка, если он может быть разделен парсером (без использования имени переменной). -2 символа там.Perl, 53 символа
источник
C # -
8977 символовОтформатирован для удобства чтения:
Мы не умножаем на один или три, мы просто добавляем все, плюс мы добавляем все четные символы еще раз, умноженные на два.
9992 достаточно велика, чтобы сумма всех символов ASCII была меньше этой (чтобы мы могли модифицировать на 10 и быть уверенным, что результат будет положительным, нет необходимости модифицировать на 10 дважды), и не делится на ноль, потому что мы добавляем все эти дополнительные 2 * 12 * 48 (двенадцать цифр ASCII, взвешенные на 1 и 3) == 1152, что позволяет нам сэкономить один дополнительный символ (вместо двойного вычитания 48 мы вычитаем 0 только для преобразования из char в int, но вместо 990 нам нужно написать 9992).
Но опять же, хотя это гораздо менее красиво ;-), это решение старой школы дает нам до 80 символов (но это почти C-совместимо):
источник
J -
554538например
старый способ:
источник
(i.12)(".@{)y
можно заменить на"."0 y
Рубин - 80 символов
источник
DC, 44 символа
Вызвать как
lIx
, например:источник
Q, 36 символов
источник
D - 97 знаков
Отформатирован более разборчиво:
Многословие оператора приведения D определенно затрудняет написание одержимо короткого кода.
источник
Java - 161 символов :(
источник
Q (44 символа)
источник
Скала 84
Тестирование:
Результат:
источник
C,
8079 символовФункция изменяет строку на месте, но возвращает исходный указатель строки, чтобы удовлетворить требованиям проблемы.
Некоторое объяснение: вместо того, чтобы вычитать 48 (значение ASCII цифры
0
) из каждого входного символа, аккумуляторs
инициализируется так, чтобы он был по модулю 10 равен 48 + 3 * 48 + 48 + 3 * 48 ... + 48 + 3 * 48 = 24 * 48 = 1152. Этого шага10-sum
можно избежать путем накопленияs
путем вычитания вместо сложения. Однако оператор модуля%
в C не дал бы пригодного для использования результата, если быs
был отрицательным, поэтому вместо использованияs-=
множителей 3 и 1 заменяются на -3 = 7 по модулю 10 и -1 = 9 по модулю 10 соответственно.Испытательный жгут:
источник
Groovy
75, 66 символовиспользовать:
источник
APL (25)
источник
Perl 6 , 29 байт
Попробуйте онлайн!
источник
Python 2 ,
7876 байтПопробуйте онлайн!
Принимает строку в качестве аргумента.
Объяснение:
Используя нотацию фрагмента Python, преобразует строку в список пар символов. ("978030640615" -> [("9", "7"), ("8", "0"), ("3", "0"), ("6", "4"), ("0 "," 6 "), (" 1 "," 5 ")])
Для этого списка пар преобразует каждый элемент в целое число и возвращает + 3b.
Суммирует все результаты.
Получает сумму по модулю 10, ИЛИ 10, если остаток равен 0. (Это предотвращает окончательную цифру 10 вместо 0.)
Удаляет остаток от 10, чтобы получить контрольную цифру.
Преобразует вычисленную контрольную цифру в строку с помощью устаревшего выражения обратной галочки.
Возвращает исходное число плюс вычисленную контрольную цифру.
Редактировать:
Сохранено 2 байса, удалив пробелы (спасибо Джо Кинг !).
источник
for
иor
APL (Dyalog Unicode) , 18 байтов SBCS
Функция анонимного неявного префикса, принимающая строку в качестве аргумента. Используя подход Bubbler .
Попробуйте онлайн!
≢
длина аргумента (12)9 7⍴⍨
циклически изменить[9,7]
эту длину+.×
Точечный продукт следующего с этим:⍎¨
оцените каждого персонажа10|
мод-10 этого,∘⍕
добавьте следующую строку:⊢
неизмененный аргументисточник
постоянный ток , 25 байтов
Попробуйте онлайн!
Я знаю, что здесь уже есть постоянный ответ, но 25 <44, так что, думаю, я чувствую, что это нормально. При этом используется тот факт , что
8+9^z
эквивалентно либо-3
или по-1
модулю 10 в зависимости от того г четным или нечетным. Поэтому я использую,A~
чтобы разбить число на цифры в стеке, но когда я строю стек, я умножаю каждую цифру на,8+9^z
где z - текущий размер стека. Затем я добавляю их все по мере развертывания стека функций и печатаю последнюю цифру.источник
MATLAB - 82 символа
источник
R, 147 символов
Использование:
источник
J, 25
источник