Вы все должны быть знакомы с последовательностью Конвея (она же «смотрите и говорите») :
1
11
21
1211
111221
312211
etc
Вы также можете начать с любого произвольного числа в качестве отправной точки. Позвольте f(s)
быть следующим элементом последовательности. Теперь для каждого s
мы можем найти f(s)
. Обратное не так тривиально: он не для каждого y
можно найти предшественника s
таким образом, что f(s) = y
. Например, y = 1
мы не можем найти предшественника. Но если он y
имеет четную длину, вы можете разделить его на пары цифр, которые описывают каждую часть предшественника:
513211 divides in 51,32,11
so: 51 comes from 11111
32 comes from 222
11 comes from 1
put together: 111112221
Таким образом, мы можем определить уникального предшественника для каждой y
четной длины.
Примечание : «предшественник», s
определенный таким образом, обычно НЕ удовлетворяет f(s) = y
.
Цель
Напишите фрагмент функции / программы, который принимает в качестве входных данных строку цифр,
- вычисляет следующий элемент последовательности Конвея, если длина входной строки нечетна
- вычисляет предшественник входной строки, как определено выше, если длина входной строки четная .
Самый короткий код в байтах побеждает.
Последние вопросы, основанные на последовательности взглядов и высказываний:
513111
делится на51
,32
и11
?11111111111111
? Согласно вашей спецификации, так и будет1111111
. Вы должны изменить свою спецификацию, чтобы определить разумный ответ для этого.11111111111111
просто нет предшественника. Это незаконный ввод.Ответы:
CJam,
4645444342 байтаПроверьте это здесь. Он берет число в STDIN и печатает результат в STDOUT.
источник
si
->~
= 45Рубин,
125 120 119101 байтВвод строки через функцию
f
:Дополнено примечаниями:
источник
Пролог - 170 байт
Этот отрывок определяет функцию
(-)/2
. Вы можете вызвать это какКажется, что в этой последовательности только одна длина с нечетной четностью: начальная
[1]
.Удобочитаемый:
источник
Питон: 139 символов
один тестовый случай
источник
s)] if
доs)]if
.2 else
Хаскелл,
134 128115Если он должен быть из стандартного ввода / стандартный вывод, добавить
main=interact l
к150 144131 общих символов. Функция называетсяl
.источник
l "11"
работаю, я получаю исключение сl "111"
илиl "1111111111111"
Perl - 98 байт
Размер всех этих управляющих операторов меня беспокоит, но я очень доволен тем, как сработали регулярные выражения.
несжатый:
источник
Эрланг, 205
Основной функцией является f, которая принимает входные данные в виде строки Erlang и возвращает выходные данные в виде строки.
Эту функцию можно сделать на 15 байтов короче (190), отбрасывая требование к регистру более 9 идентичных символов.
f
вызывает,g
который вычисляет предшественник рекурсивно, и, если число символов нечетное (находится в конце вычисления), он вызывает функцию,i
которая в паре сh
вычисляет следующий элемент.источник
Хаскель, 105
Я думаю, это хорошо, что оказалось, не используя никаких вспомогательных функций :-).
источник
|x:y:z<-r
- Я совершенно не знал, что ты можешь сделать это. Это так классно!APL (45)
Да, это правильное определение функции, даже с
∊
внешним.источник
Java 7, Score =
252235 байтовДа, это снова Java; худший язык гольфа в мире. Этот подход использует строки. Произвольно большие целые числа поддерживаются в java, но занимают гораздо больше места для кодирования.
Позвони с
f(intputString)
. Возвращает соответствующую строку.Golfed:
Гольф Расширены структурным кодом:
Частично гольф
Полностью расширен:
Для запуска сначала скомпилируйте вторую запись:
javac LookAndSayExpandedGolfed.java
Затем запустите с:
java LookAndSayExpandedGolfed
Редактировать: Исправлена ошибка.
источник
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4 at java.lang.String.charAt(String.java:658)
--1
должно быть--i
?513211
->11111
.Javascript (в браузере, ES5, IE8 +), 152
Может быть сокращен на 4 символа, если вы пропустите var, или еще на несколько символов с другими промежуточными не измененными глобальными переменными, но давайте представим, что мы не плохие программисты на минуту.
Переключение на функцию короткого синтаксиса ES6 с аргументом и возвращаемым значением вместо использования приглашения заставит оповещение для ввода-вывода сэкономить больше.
JSFiddle здесь: http://jsfiddle.net/86L1w6Lk/
источник
var
... мы все "плохие программисты" здесь. ;)Python 3 - 159 байт
источник
Кобра - 217
(186, если я могу предположить, что
use
утверждениеSystem.Text.RegularExpressions
существует в другом месте)источник
JavaScript (ES6) 85
Используя регулярное выражение, заменить на функцию. Различное регулярное выражение и разные функции в зависимости от того, какая длина ввода четная или нечетная.
источник