Попробуйте взять некоторое неотрицательное целое число, например 8675309, и вычислить абсолютные значения разностей между всеми парами соседних цифр.
Для 8675309
получаем |8-6| = 2
, |6-7| = 1
, |7-5| = 2
, |5-3| = 2
, |3-0| = 3
, |0-9| = 9
. Набирать эти результаты вместе дает другое, меньшее неотрицательное целое число: 212239
. Повторение процесса дает 11016
, тогда 0115
, что согласно соглашению, что ведущие нули не записываются, упрощается как 115
, которое становится 04
или 4
, которое не может быть уменьшено далее. Суммируя все эти значения мы получаем 8675309 + 212239 + 11016 + 115 + 4 = 8898683
.
Давайте определим сумму разности цифр (или DDS) как эту операцию многократного взятия разности цифр числа для формирования нового числа, а затем добавления всех полученных чисел к оригиналу.
Вот первые 20 значений в соответствующей последовательности DDS:
N DDS(N)
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 11
11 11
12 13
13 15
14 17
15 19
16 21
17 23
18 25
19 27
Вот первые 10000 значений , график которых довольно любопытен:
Тем более, что он выглядит одинаково, когда вы строите его на 1000 или даже 100:
(Я бы назвал это лестницей стоматолога ...)
Вызов
Напишите программу или функцию, которая принимает неотрицательное целое число и печатает или возвращает свое значение DDS. Например, если вход был 8675309
, выход должен быть 8898683
.
Самый короткий код в байтах побеждает.
источник
Ответы:
Пиф, 17
Попробуйте здесь или запустите Test Suite
Объяснение:
источник
Python 2, 73
К счастью, мне удалось избежать любых строковых операций.
g
это функция, которая вычисляет ответ.источник
(n-n/10)%10
работать так же, какn%10-n/10%10
? Или, может быть, даже(9*n/10)%10
?%
- это истинный оператор модуля, а не остаток, так что это не сработает.Matlab, 101
105байтБольшое спасибо @beaker за его предложение использовать
polyval
вместо ifbase2dec
. Это позволило мнеКод:
Пример:
Бонус: произвольная база
Небольшое обобщение позволяет использовать произвольную базу чисел, не обязательно десятичную:
Произвольная база от 2 до 10,
108104 байтаПричина , почему это работает только для базы до
10
является то , что от Matlabdec2base
функция использует цифры0
,1
...,9
,A
,B
, ..., и есть скачок символов (ASCII) кодов от9
доA
.Произвольная база от 2 до 36, 124
146байтСкачок от
9
вA
упомянутый выше потребности специальной обработки. Максимальная база36
в соответствии сdec2base
функцией Matlab .Вот как выглядят лестницы стоматолога для разных основ:
источник
CJam,
2221 байтОбратите внимание, что эта программа завершает работу с ошибкой, которая разрешена по умолчанию .
С помощью интерпретатора Java ошибки могут быть подавлены закрытием STDERR. Если вы попробуете этот код онлайн в интерпретаторе CJam , игнорируйте все выходные данные перед последней строкой.
Спасибо @ Sp3000 за указание на ошибку в оригинальной ревизии.
Спасибо @ MartinBüttner за отыгрывание 1 байта.
Пример запуска
Как это работает
A всегда будет правдивым, когда проверено
h
. Тем не менее, если я являюсь однозначным целым числом,2ew
произойдет сбой с ошибкой после использования массива, к которому он был вызван. Это оставляет только желаемый результат в стеке, который печатается перед выходом.источник
Лабиринт ,
176134127119103978882797672 байтаСпасибо Sp3000 за сохранение 1 байта и прокладывание пути для еще 2.
Это, вероятно, еще можно сократить, но эй, это лучше, чем
JavaMatlabPython ...Попробуйте онлайн.
Это завершается с ошибкой, но сообщение об ошибке записывается в STDERR (вот почему вы не видите его в TIO).
Реализация довольно проста. Мы добавляем текущее значение к промежуточной сумме. Если текущее значение было больше чем
9
, мы вычисляем его основную цифру из 10 (через повторяющийся div-мод) и формируем новое число из абсолютных разностей. Если мы получим9
или меньше, мы печатаем промежуточный итог.Цифры текущего номера собраны во вспомогательном стеке с самой старшей цифрой сверху.
Что ж, причудливая реализация, которую
abs(...)
я здесь сделал, оказалась нелепо сложной по сравнению с новым решением ... Я добавлю обновленное объяснение, когда закончу играть в гольф дальше.источник
Java - 300 байт
Гольф версия
Ungolfed / Полная версия
источник
static
s после вытягивания их в 3),(a+"")
как правило, то же самоеa.toString()
, но короче 4) Вам не нужен сканер, если это просто функция, просто займет много времени в качестве ввода.long f(long t){long a=t;char[]c;while((c=(a+"").toCharArray()).length>1){String s="";for(int i=0;i<c.length-1;)s+=Math.abs(c[i]-c[++i]);t+=a=new Long(s);}return t;}
Юлия,
8160 байтUngolfed:
Попробуйте онлайн
Сохранено 21 байт благодаря feersum и Glen O!
источник
ndigits(n)>1
, отличная отn>9
?int(join(abs(diff(["$n"...]))))
экономит 9 байт. Переключитесь вn>9
соответствии с предложением feersum для сохранения еще 9 байтов. Сохраните еще три байта, выполнив оба назначения в цикле while за один шаг (и удалив лишнюю, теперь ненужную точку с запятой):n->(s=n;while n>9 s+=n=int(join(abs(diff(["$n"...]))))end;s)
хорошо ,
37322423 байтаВ бою:
K5 имеет несколько функций, которые хорошо подходят для этого - «кодировать» и «декодировать» могут выполнять базовое преобразование, каждая пара (
':
) объединяет последовательные элементы в списке, а сканирование с фиксированной точкой (\
) может создавать итеративную последовательность, пока не остановится меняется. Отсутствие примитиваabs()
приводит к некоторой неприглядной массе в виде{(x;-x)x<0}'
.Редактировать:
Вместо этого
{(x;-x)x<0}'
я могу (несколько расточительно) взять квадратный корень из квадрата последовательности ({%x*x}
сэкономив 5 байтов).Изменить 2:
Вдохновленный решением APL @maurinus, я могу заменить «decode» (
((#$x)#10)\x
) на оценку каждого символа строкового представления числа-.:'$x
! Это также позволяет мне использовать молчаливую форму всего выражения, сохраняя дополнительные символы.источник
Python 2, 87 байт
Рекурсивно добавляет текущее число и берет различия в цифрах. Много преобразования между числами и строками. Вероятно, может быть улучшено.
источник
Юлия,
5548 байтовUngolfed:
По сути, это повторяется до уровня, состоящего из одной цифры (где различие не может быть выполнено), а затем суммируется обратно при выходе из рекурсии, уровень за уровнем.
источник
Haskell, 140 байт
d
делает работуКто-нибудь знает, как избежать импорта длинных функций преобразования?
источник
intToDigit
естьtoEnum.(+48)
иdigitToInt
есть(\i->fromEnum i-48)
. Вы также можете перейтиs
к точечной версии с=<<
в контексте списка:s=snd.span(==0).m abs.(zipWith(-)=<<tail)
. Наконец,(==0)
есть(<1)
, потому что мы работаем с неотрицательными целыми числами.s
смысла, нет необходимости давать ему имя. Позвоните прямо:iterate(snd.span ... tail))
=<<
используется в контексте функции, а не в списке, извините.NoMonomorphismRestriction
Позвольте мне иметь безd
очков тоже.chr
иord
обаData.Char
, так что вы не можете опуститьimport
. Флаги компилятора также считаются байтами, поэтомуNoMonomorphismRestriction
ваш счет увеличивается на 25.К5, 50 байт
источник
APL (22)
Объяснение:
⍵≤9:⍵
: если ⍵ ≤ 9, вернуть ⍵ без изменений.⍎¨⍕⍵
: преобразовать ⍵ в строку, затем оценить каждый символ2-/
: вычтите каждые два соседних числа|
: принять абсолютные значения10⊥
: превратить массив в число base-10⍵+∇
: вызвать функцию рекурсивно с этим новым значением и добавить результат к входуисточник
Mathematica,
726965 байтЯ открыт для предложений здесь.
источник
Tr@FixedPointList[FromDigits@*Abs@*Differences@*IntegerDigits,#]&
JavaScript ES6, 73 байта
Это не становится короче: / Я попробую больше подходов, но это самый короткий до сих пор
источник
t
она все еще действует и экономит 2 байта.JavaScript (ES6), 69
Попробуйте запустить приведенный ниже фрагмент в браузере, совместимом с EcmaScript 6 (но не в Chrome, так как он по-прежнему не поддерживает оператор распространения
...
) Возможно, MS Edge?Альтернатива, использование понимания массива , которое теперь предназначено для EcmaScript 2016 (ES7), 67 байт:
источник
Python 3, 125 байт
Раньше я, как краткость регулярного выражения , пока я не пытался использовать его для этой задачи ...
re.findall('\d\d',s,overlapped=True)
это не на;)Ура @Todd :)
источник
J, 70 байт
источник
C 162 байта
golfed:
ungolfed:
источник
R, 134 байта
Код
Протестируйте это онлайн .
Ungolfed
Вот график разницы между серией «Разностная сумма числа» от f (1) до f (1m). Просто потому, что я люблю дифф.
Код участка
источник
MATLAB
(141)(137)Программа суммирует цифры той же строки перед встроенными цифрами, это означает, что она использовала только целочисленное деление «n / 10» log_10 (n) раз, сложность O (N).
Если
n= a b c d
Моя программа рассчитывает:
Использование:
а =
1
источник
,end
параметрfunction
объявления.Пролог, 143 байта
Код:
Разъяснение:
q выполняет вычисления, которые преобразуют число в его разницу в цифрах.
r рекурсивно вызывает q и суммирует результаты, чтобы найти сумму разности цифр.
р является точкой входа. Принимает число, звонки г и печатает ответ.
Пример:
Попробуйте онлайн здесь .
источник
PHP - 198 байт
Ungolfed
источник
Perl 6 , 56 байт
использование:
источник