Любое положительное целое число можно получить, начиная с 1 и применяя последовательность операций, каждая из которых либо «умножить на 3», либо «разделить на 2, отбрасывая любой остаток» .
Примеры (пишем f для * 3 и g для / 2):
4 = 1 *3 *3 /2 = 1 ffg
6 = 1 ffggf = 1 fffgg
21 = 1 fffgfgfgggf
Напишите программу со следующим поведением:
Ввод : любое положительное целое число, через стандартный или жестко запрограммированный. (При жестком кодировании входная цифра будет исключена из длины программы.)
Вывод : строка f и g такая, что <input> = 1 <string>
(как в примерах). Такая строка в обратном порядке также приемлема. NB. Выходные данные содержат только f и g или являются пустыми.
Победителем является запись с наименьшим количеством байтов программы плюс-вывод, когда 41 является входом.
x mod 3
: еслиx=3y
построить y, а затем применитьf
; еслиx=3y+1
построить2y+1
и применитьf
тогдаg
; еслиx=3y+2
тогда это становится сложным, но по существу является рекурсивным.Ответы:
GolfScript, оценка 64 (43-2 + 23)
(41 жестко запрограммирован, поэтому -2 балла за счет). Выход
что составляет 23 символа (без перевода строки). По построению код гарантирует, что он всегда возвращает (одно из) кратчайших представлений.
источник
"1 "
не должны быть включены в вывод.Мы пачкаемся, друзья!
ЯВА
210 207199 символовбез golfed:
Вывод: в зависимости от веры старых богов, самое короткое, что у меня было, - 30. Обратите внимание, что вывод должен быть прочитан справа.
234
108
редактировать 45
точки :
318199 + 30 = 229edit1 (2 * i + 1)% 3 == 0 -> (2 * i)% 3 == 1
Nota Bene, если вы используете Java 6, а не Java 7 во время игры в гольф, вы можете использовать
Структура из 39 символов вместо стандартной структуры длиной 53 символа.
источник
(2*i+1)%3==0
эквивалентноi%3==1
if(X){A}else{if(Y){B}else{C}}
длиннее чемif(X){A}else if(Y){B}else{C}
. Также вы можете заменить ваши==
условия на более короткие<
условия.Питон, оценка 124 (90-2 + 36)
90 символов кода (новые строки как 1 каждый) - 2 для жестко закодированной входной цифры + 36 символов для вывода
Выход:
источник
m=f=0
вы можете сделать внешний циклwhile(n!=x)*(m!=x)
и удалить разрывы. Приносит до 95 символов кода.n
на3**f
.print'f'*f+'g'*g
, что даст оценку 90-2 + 36 = 124.Питон, оценка 121 (87 - 2 + 36)
источник
l,n,f=len(t),1,0
и удалили его'1',
из, вы набрали бы 87-2 + 36 = 121.1,
.l,n,f=len(t),1,0
дает одинаковое количество символов, верно? (Для каждой переменной=
,
Perl, оценка 89 (63 - 2 + 28)
Предположение: если наивный подход, описанный в моем первоначальном решении ниже, когда-либо достигнет цикла, этот цикл будет [21, 7, 15, 5, 10, 21, ...] . Поскольку нет контрпримеров для 1 ≤ n ≤ 10 6 , похоже, что это правда. Чтобы доказать это, достаточно показать, что это единственный цикл, который может существовать, что я могу или не могу сделать в более поздний момент времени.
Вышеупомянутое решение избегает цикла немедленно, вместо того, чтобы угадывать (неправильно), и избегать его во второй раз.
Выход (28 байт):
Perl, оценка 100 (69 - 2 + 33)
Использование метода угадывания и проверки. Строка строится с использованием обратных операций (преобразование значения в 1 , а не наоборот), и строка соответствующим образом зеркально отражается, что разрешено в спецификации задачи.
Всякий раз, когда встречается не кратное трем, оно умножается на два, добавляя единицу, если результат будет кратным трем. Когда встречается число, кратное трем, оно будет разделено на три ..., если только это значение не встречалось ранее, что указывает на цикл, а значит, на угадывание и проверку.
Выход (33 байта):
источник
J, оценка 103 (82-2 + 23)
* Примечание: я назвал свои глаголы
f
иg
, чтобы не путать с выходными строкамиf
иg
.Hard кодировки:
Общие функции:
Избавился от работы с блоками двоичных чисел, что было самым важным изменением в сжатии
g
. Переименовал переменные и удалил некоторые пробелы, но все по-прежнему функционально. (Использование:g 41
)J, оценка 197 (174 + 23)
Выход:
ffffffffggggggggfgffggg
f
преобразует список логических чисел в число, используя 0s как*3
и 1s как/2
(иfloor
).#:i.2^i
создает массив ранга 2, содержащий все логические массивы ранга 1 длиныi
.источник