Почему номер 6174 такой интересный? Как определено в Википедии
- Возьмите любое четырехзначное число, используя как минимум две разные цифры. (Допускаются ведущие нули.)
- Расположите цифры по возрастанию, а затем по убыванию, чтобы получить два четырехзначных числа, при необходимости добавляя начальные нули.
- Вычтите меньшее число из большего числа.
- Вернитесь к шагу 2.
Вышеупомянутый процесс, известный как рутина Капрекара, всегда будет достигать 6174 не более чем за 7 итераций. Как только 6174 достигнут, процесс продолжит давать его.
Напишите программу, которая запускает процедуру Капрекара с заданным четырехзначным числом (см. Определение выше), распечатывая каждый шаг этой процедуры.
Правила:
- Материалы должны быть законченными программами.
- Ввод должен быть прочитан из стандартного ввода. Трубопровод от эха в порядке.
- Ввод должен быть в числовой форме.
- Требуется распечатать ведущие нули. (См. Примеры ниже.)
- В последней строке должно быть указано, сколько итераций понадобилось. Пунктуация обязательна.
Примеры:
> 2607
7620 - 0267 = 7353
7533 - 3357 = 4176
7641 - 1467 = 6174
Iterations: 3.
> 1211
2111 - 1112 = 0999
9990 - 0999 = 8991
9981 - 1899 = 8082
8820 - 0288 = 8532
8532 - 2358 = 6174
Iterations: 5.
> 6174
7641 - 1467 = 6174
Iterations: 1.
Любой язык программирования приветствуется. Дополнительные очки для эзотерических + небольшая награда.
Обновление 1 : уже есть похожий вопрос .
Обновление 2 : добавлен пример для 6174 в качестве входных данных. Спасибо Питеру Тейлору за уведомление.
code-golf
repeated-transformation
sequence
lunohodov
источник
источник
Ответы:
Perl -
147143134130129126129128126РЕДАКТИРОВАТЬ: Теперь соответствует 6174 кейс, за счет нескольких символов ... запустить с
echo -n <number> | perl kaprekar.pl
РЕДАКТИРОВАТЬ: наконец-то вернуться туда, где я был раньше: D
источник
Ruby 1.9, 122 символа
Пример вызова:
Я посчитал
-ln
флаг как 4 символа (разница между обычным вызовомruby kaprekar.rb
иruby -ln kaprekar.rb
).источник
ruby -lp kaprekar.rb
. Ввели номер и нажали <Enter>, но выводом является сам введенный номер. Я явно что-то упускаю ... Посоветуйте, пожалуйста, как использовать скрипт.6174
ввода, что, к сожалению, позволяет использовать это решение до 128 символов.echo 1234 | ruby kaprekar.rb
выдает предупреждение и заканчивается ошибкойundefined method 'chars' for nil:NilClass (NoMethodError)
. Выполнениеecho 1234 | ruby -lp kaprekar.rb
выдает только предупреждение и ведет себя как положено. Вывод не такой, как ожидалось, так как в нем содержится предупреждающее сообщениеkaprekar.rb:3: warning: regex literal in condition
Питон, 141 символ
источник
;
s.while n-6174
, Между пробеломprint
и цитатой нет места .Golfscript, 74 символа
источник
Haskell,
197192182181 персонажаисточник
r
иs
сохраняет 2 символа. Кроме того, «000» является избыточным. «0» достаточно. Это подводит нас к 188 персонажам. Я удивленinteract
, не помогает здесь. Обычно это так.show x++s
сshows x s
усилением еще 2 байта. 186 сейчас.|k>0
) можно избавиться отf
. Дальнейшее переименованиеg
до%
заставляет нас 182 символов.> <> -
268308Не много претендента на гольф, но было весело писать. :)
Run with./fish.py kaprekar.fish -v <number>
EDIT: теперь принимает данные из STDIN.
источник
JavaScript,
189182165 символовКредит для DocMax:
Оригинал:
Ungolfed:
источник
n != 6174
на,n-6174
так как он вернет ноль, что ложно (по крайней мере, в C и Python).while(n.length<4)
наwhile(!n[3])
.n+'\n'
добавляется, чтобы избежать условного и дополнительного\n
, c) использует временную переменную, чтобы избежать последовательности join-split-join, d) использует тот факт, что мы нужно только добавить один '0' для заполнения:for(n=prompt(i=0,o=e='');n-6174;i++,o+=(n=(b=n.split(e).sort(),a=b.join(e),b).reverse().join(e))+' - '+a+' = '+(n=('0'+(n-a)).slice(-4))+'\n');alert(o+"Iterations: "+i+'.')
это должно быть 172 символа.i
равно 0 (+4), но в сочетании с проверкойi++
. К сожалению, это приводит к отключению на одну ошибку, поэтому я переключил приращение на уменьшение, а затем использовал немного побитовый трюк в конце (-1). Затем я изменилi=0,o=e=''
наi=o=e=''
(-2), переформатировалfor
цикл, чтобы избежать лишних скобок (-1), расширенного(b=...,a=...,b)
бита (-2) и пробралсяa=b.join
внутрьreverse()
вызова (-1). Итак, 169, неплохо!PowerShell, 125
128130131Проходит все контрольные примеры из вопроса.
источник
JavaScript, 260 байт
источник
Clojure, 256 символов
источник
Scala 2.9, 194 символа
Использует черту App из Scala 2.9.
Редактировать: дает правильный вывод для начального ввода 6174.
источник
PHP, 215
259276символыUngolfed:
источник
abs
,max
иmin
, так как сортировка всегда будет означать, что$b
больше, чем$a
. Это может спасти вас 20-ти символов. Кроме того, я думаю, что размещение сортировки внутри цикла в верхней части будет означать, что вам нужно иметь его в своем коде только один раз, что сэкономит вам еще 9.<?function k($c){echo"> $c\n";$n=str_split(str_pad($c,4,0,0));for(;$k-6174;$z++){sort($n);$a=join($n);$b=strrev($a);$k=str_pad($b-$a,4,0,0);echo"$b - $a = $k\n";$n=str_split($k);}echo"Iterations: $z\n";}
Вы можете сохранить 12 символов, изменив свойfor
оператор, вызвав его как функцию и используяjoin
вместоimplode
.CoffeeScript,
233225 символовПопробуйте здесь или с инструкциями здесь .
источник
0
(в соответствии с подсказкой) или нажатие кнопки отмены приводит к зависанию Safari.Scala 276
Scala 283
Diff:
источник
GAWK - 152 символа
Это версия GNU awk. Это может не работать с другими версиями не-GNU.
источник
awk: calling undefined function asort
. Версия Awk 20070501 работает на OSX 10.6.7. Не забывайте.
после количества итераций.9992 - 2999 = 6993
Рубин, 179 символов, но в любом случае
источник
PERL
источник
К, 104
Контрольные примеры
источник
Mathematica,
314291 персонажаЭто программа, kaprekar.m: -
Установка пути перед запуском: -
Запуск программы: -
источник
PHP , 160 байт
Попробуйте онлайн!
Завершить программу, ввод есть
STDIN
, запустить сphp -nF
.Выход
источник
Ржавчина - 375 байт
Я представляю это как возможную «верхнюю границу», я призываю любого найти язык, в котором разумная реализация этого длиннее - поскольку в этом нет ничего лишнего, но и ничего, даже отдаленно очевидного, что могло бы значительно его уменьшить. Особенность Rust заключается в том, что для считывания из стандартного ввода и анализа целого числа требуется около 120 символов. «Да, но тогда просто используйте строковое представление» ... но я на 99% уверен, что это будет еще дольше
источник
Perl 6 -n флаг, 105 байт
Попробуйте онлайн!
Я наконец-то начал использовать свой
{}...*
трюк, так как нам нужно иметь хотя бы одну итерацию для 6174. Я не уверен, зачем мне нужна дополнительная обтекание.&{ }
последовательности, хотя это отстой.Объяснение:
источник