Игра с добавленными номерами
Напишите функцию / программу, которая принимает 2 целочисленных параметра, целочисленные параметры или целочисленные переменные , начальный номер и максимальное количество итераций. Код должен выполнить следующий пример игры, чтобы создать новое число, и повторять до тех пор, пока число не останется одной цифрой. например.
3 7 2 = (3 + 7) & (7 + 2) = 10 9
1 0 9 = (1 + 0) & (0 + 9) = 1 9
1 9 = (1 + 9) = 10
1 0 = (1 + 0) = 1
В основном, беря каждую отдельную цифру и добавляя ее к соседу, затем добавляя также результат следующего добавления.
Максимальный счетчик итераций предназначен для защиты бесконечных циклов, а когда достигнут максимум, код должен сбросить последние 5 числовых шагов. Тот же вывод должен произойти при завершении, достигнув одной цифры. Если произошло менее 5 шагов, выведите только действительные числа.
Вывод должен выглядеть как ( Step: Number
), включая последние 5 шагов завершенных или завершенных шагов:
func(3541, 50)
будет производить этот точный формат вывода:
6: 1411
7: 552
8: 107
9: 17
10: 8
func(3541, 5)
будет производить:
1: 895
2: 1714
3: 885
4: 1613
5: 774
Весь расчет ведется:
1: 895
2: 1714
3: 885
4: 1613
5: 774
6: 1411
7: 552
8: 107
9: 17
10: 8
Если осталось менее 5 шагов, просто распечатайте эти шаги.
Используйте только встроенные библиотеки, параметры могут быть откуда угодно (что проще для вашего языка). Нет ограничений на максимальный целочисленный размер, и если есть переполнения, пусть происходит сбой.
Учитывая, что это не слишком сложно с точки зрения загадки, я предоставлю до 25-го воскресенья 20:00 (UTC + 8) для рассмотрения заявок на принятый ответ, после чего победителем будет самый короткий из всех языков.
РЕДАКТИРОВАТЬ:
Поздравляем Говарда, выигравшего с ответом 48 GolfScript .
Специальное упоминание 2-й место Маринус с ответом 66 APL .
Моим личным фаворитом (склонность к JavaScript) был ответ core1024 .
func(3541, 5)
должен печатать 5 шагов или 10?Ответы:
GolfScript,
4846 символовСпасибо Питеру Тейлору за улучшение двух персонажей.
Ожидает оба числа в стеке. Попробуйте онлайн .
Примеры:
источник
.,,
и превратив окончательную карту в просто{': '*}%
.APL (66)
Левый аргумент - это максимальное количество итераций, а правый аргумент - начальный номер.
Объяснение:
∆←⍺{
...}⍕⍵
: передать левый аргумент как число и правый аргумент как строку в функцию, которая вычисляет список чисел, и сохранить его в∆
:(1<⍴⍵)∧⍺>0:
: если количество цифр больше 1 и количество оставшихся итераций больше0
:⍎¨⍵
: оценить каждую цифру2+/
: сумма каждой пары⍕¨
: форматировать каждое число как строку∆←,/
: объединить строки и сохранить в∆
∆,(⍺-1)∇⊃∆
: return∆
, за которым следует результат применения этой функции∆
с одной и той же разрешенной итерацией⋄⍬
: если нет, вернуть пустой список∆,⍪⍳⍴∆
: пара каждого элемента∆
с его индексом в∆
{
...}/
: для каждой пары:(⍕⍵),': ',⍺
: вернуть строку с индексом, после которой:
следует число↑¯5↑
: превратить список строк в матрицу, чтобы они отображались на отдельных строках, и взять последние 5 элементовТестовое задание:
источник
3 {...} 3541
.:
первым)Mathematica, 172 персонажа
Это слишком долго, благодаря именам функций Mathematica и безобразной обработке строк (в действительности «игра» - это всего лишь 76 из этих символов), но здесь это так или иначе:
Ожидается, что входное число в переменной
n
и максимальное количество итераций вm
.С меньшим количеством гольфа:
источник
Рубин, 106 знаков
Я не на 100% уверен в правилах ввода, но если я могу взять
n
в качестве строки, я могу сохранить 5 символов, и если я могу использовать предопределенные переменные и написать программу вместо функции, я могу сохранить еще 9.Создает функцию,
f
которая может быть вызвана следующим образом:f[3541, 6]
f[372, 50]
f[9999, 10]
источник
J -
9692 знакаСначала я решил это, предполагая, что все игры прекратились, и это вернулось, чтобы укусить меня за задницу во время тестирования. Левый аргумент - это количество шагов, правый аргумент - это начальная позиция, которая может быть задана в виде числа или строки.
Это немного слишком сложное и запутанное, чтобы удовлетворительно деголфить, поэтому я скажу так:
(<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)
Эта часть запускает игру за указанное количество шагов.2+/\
отвечает за добавление каждой пары цифр и<@>:@[
в тандеме с^:
элементами управления, фиксирующими промежуточные этапы игры.(#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".
Эта часть форматирует все результаты какstep: result
.({.~,i.0:)
удостоверяется, что мы не делаем слишком много шагов,#\
это номера шагов, и(,': '&,)&":"0
бит добавляет двоеточие и пробел.(-@(<.5<.#){.])
Эта часть исключает соответствующие пять или менее шагов из полного списка.<.
означает «минимум».Это работает, но если вы начнете с достаточно большого числа, результаты игры быстро начнут увеличиваться в размере, что заставляет J переключаться с целых чисел на неточные двойные. Вот некоторые примеры:
источник
Javascript 139
144 150Ungolfed
источник
Perl,
8684С переводами строки для удобства чтения:
+ Редактировать: нет оправдания тому, что вы не используете
-n
переключатель командной строки, а затем оценка 82 = 81 + 1 :И, возможно, целочисленное переполнение в порядке, это 81 = 80 + 1
источник
Javascript, 247
278288307символовотформатирован
Редактировать 1 : Удален троичный
Редактировать 2 : перевернутая логика для «пропуска» индекса 0
Редактировать 3 : переработанный рекурсивный вызов.
скрипка
источник
Bash + coreutils, 115 байт
Выход:
источник
JavaScript (ECMAScript 6 Draft) - 134 символа
Примеры:
источник
Javascript, 182 байта
источник
Perl
166147138129 байтUngolfed:
Я надеюсь, что это нормально, что он печатает несколько лишних пустых строк, если все это занимает менее 5 шагов.
источник
(('')x5, @o, "$i: $s")
на(@o, "$i: $s")
иjoin"\n", @o[-5..0]
сjoin"\n", @o[-5..-1]
. Тогда вы будете на 3 байта впереди;)Java
524405365 символов [414 байт]Гольф версия:
class A{static int n=0;List<String> s=new ArrayList<>();void c(int b,int r){String d=b+"";if(r==0||b <= 9){int m=s.size();for(int i= m>=5?m-5:0;i<m;i++)System.out.println(s.get(i));return;}String l="";for(int i=0;i<d.length()-1;i++)l+=d.charAt(i)+d.charAt(i+1)-96;s.add(++n+":"+l);c(Integer.valueOf(l),--r);}public static void main(String[] a){new A().c(3541,50);}}
Читаемая версия:
источник
chatAt
методInteger.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");
вы можете это сделать(digits[i] + digits[i+1] - 96)
JavaScript 133 байта
Ungolfed:
источник
Ява, 341 символ
371 символотформатирован:
Благодаря user902383 я смог уменьшить код на 30 символов, не разбивая строку в массив, используя -96 вместо "Integer.valueOf ()
источник
class a{public static void main(String[] a) {p(3541, 50);}static void p(int n,int k){Queue<String> q=new LinkedList();int c=0;while(n>9&&c<k){c++;String r="";String p=""+n;for(int i=0;i<p.length()-1;i++)r+=((p.charAt(i)+p.charAt(i+1)-96));n=Integer.parseInt(r);q.add(c+": "+n);if(q.size()>5)q.remove();}for(String s:q){System.out.println(s);}}}
Dart,
602588 байтДарт, наверное, один из худших языков для этого ... Мне нужно найти лучший способ сделать это.
Во всяком случае, вот моя запись:
Ввод через консоль
И негольфированная, слегка не унифицированная версия:
источник
PERL
135 129/125125/121 байтЭто та же ошибка, что и ответ Тала
Редактировать 129 байт как функцию:125 байт как функция:125 байтов в качестве консольного скрипта (без хеш-бенга):121 байт в виде консольного скрипта (без хеш-бенга):
Expanded:
Тест с
c(372,4);
:Тест с
c(3541,50);
:источник
C # - 269
Удобочитаемый:
Использование:
Выход:
источник
Кобра - 363
Довольно удручающий результат ... но, эй, я все же победил Java.
Он должен быть защищен от целочисленных переполнений для практических тестовых случаев.
источник
Python 2.7,
174173158 персонажейИспользование множества строк для выполнения задачи.
Python 2.7, 155 символов
Версия, определяющая функцию
Слегка негольфированная версия:
источник
Хаскелл, 154
пример использования:
Чтобы сделать его более читабельным, используйте
putStr
:источник
putStr $ 3541#50
сравнить это с примером ОП. В противном случае я рад, что здесь есть парень из Хаскелла.Groovy -
191182 символаОсновано на решении Томаса Рюпинга , портированного на Groovy 2.2.1:
Исполнение и вывод:
Ungolfed:
источник
** C
186179174 **Немного меньше в гольф (мини-гольф?)
Просто выделите достаточно памяти для циклического хранения пяти результатов. Внешний цикл продолжается до тех пор, пока мы не достигнем предела или не достигнем одной цифры. Внутренний цикл добавляет последнюю цифру числа к последней цифре 1/10 числа и добавляет это, умноженное на соответствующую степень 10 к результату. Разделите число, которое вы сначала, хотя на 10 и повторите, чтобы получить общее количество. Затем распечатайте до пяти последних результатов.
Следующая задача - посмотреть, смогу ли я побриться достаточно, чтобы победить некоторые языки сценариев в гольфе.
Редактировать: теперь компилируется с предупреждением, но пять символов сбриваются, удаляя объявление "void"
источник
C # -
309330320306 байтВерсия для гольфа:
Использование: F (3541,50);
Безголовая версия для удобства чтения:
Предложения по улучшению всегда приветствуются! ;)
Редактировать: Удалено String.Empty и заменено на "", чтобы сохранить 10 байт.
Редактировать 2: Спасибо Малику за подсказку со строками!
источник
.ToCharArray()
. Строка = массив символов.ToString()
, чтобы сделать+""