Победителем (довольно очевидно) является Деннис ♦, который использовал желе с 10 байтами!
Эта проблема все еще будет здесь, однако результаты больше не будут приняты.
Трансмиссия числа - это концепция Джона Конвея (который также известен тем, что создал «Игру жизни» Конвея, но это не главное). Это определяется так:
Для любого числа ... силовая передача числа - это ... (т. Е. Каждая 2-я цифра слева направо является степенью цифры до этого). Этот процесс повторяется до тех пор, пока результат не станет одной цифрой.
ПРИМЕРЫ:
2592 => (2^5)(9^2) = 2592 <= Cannot be further decomposed
135 => (1^3)5 = 5
1234 => (1^2)(3^4) = 81 => (8^1) = 8
1100 => (1^1)(0^0) = 1 # (0^0) = 1
-42 => -42 # Negative numbers output the input
Ваша задача для любого числа n
на входе вернуть powertrain(n)
(т.е. n
после того, как разложение силового агрегата закончится) в качестве выхода.
Это код гольф, поэтому выигрывает самое короткое количество байтов.
ОТКАЗ-ВЕЩИ:
- У вас может быть нечетное количество цифр на входе, последняя цифра просто не будет иметь силу.
- 0 ^ 0 равно 1, потому что если бы это было 0, то многие числа мгновенно свернулись бы в 0 или 1.
- Если число неразрушимо в какой-либо части процесса вычисления (например, если оно заканчивается
2592
), вы можете просто вывести число. - Если вход
< 10
(то есть все однозначные числа и отрицания), выведите вход.
Я, вероятно, объявлю победителя через несколько часов .
Текущий список лидеров:
- Желе ( Денис ♦ ): 10
- Pyth ( DenkerAffe ): 16
- МАТЛ ( Дон Мюсли ): 21
- Perl ( Тон Хоспел ): 42
- Хаскель ( Дэмиен ): 64
- Javascript ES6 ( edc65 ): 71
- Mathematica ( Murphy ): 74
- Mathematica ( LegionMammal978 ) и Haskell ( Renzeee ): 77
- Python 2 ( математика ): 111
- Питон 3 ( Эрван ): 161
- Ява 8 ( синий ): 229
- Oracle SQL 11.2 ( Jeto ): 456
- Befunge '93 ( Lex ): 490
1100
и-42
легко пропустить правила о крайних случаях, если они не отображаются в тестовых случаях.Ответы:
Желе,
15141210 байтПопробуйте онлайн!
Как это работает
источник
n
времени, но у меня нет доказательств того, что это работает для всех возможных входных данных.D*2/Pµ¡
Haskell,
6764 байта(>> = (==)) >> = до тех пор, пока $ p.show не является неназванной функцией, которая принимает целое число в качестве входных данных и возвращает его трансмиссию.
Сохранено 3 байта благодаря Zgarb
источник
((==)=<<g)
экономит два байта(\n->g n==n)
.(>>=(==))>>=
действительно похожа на поезд!Perl, 42
48байтВключите +2 для
-lp
(вы можете сбросить-l
тоже, но мне нравятся новые строки)Запустить с вводом на STDIN, например
powertrain.pl
:(на старых версиях perl вы можете оставить пробел между регулярным выражением и до)
Это не сможет обработать фиксированную точку,
24547284284866560000000000
но это большое значение не будет работать в любом случае, потому что к тому времени perl переключился на экспоненциальную запись.Приведенная выше версия на самом деле будет работать быстро (в большинстве
2592
циклов) для всех чисел, которые perl может представлять без использования экспоненциальной записи, поскольку доказано, что между2592
и нет никаких фиксированных точек24547284284866560000000000
( https://oeis.org/A135385 )Это, однако, предполагает что-то еще не доказано. В принципе, это может быть сокращение, которое занимает больше, чем
X=10^7
шаги (предполагается, что ни одна нефиксированная точка не занимает больше 16 шагов, https://oeis.org/A133503 ), значение которой падает нижеX
(но выше10^7
), а затем поднимается опять таки. Если это так, я должен вернуться к:объяснение
Код работает, помещая
**
и*
(чередуя) между цифрамитак
2592
становится2**5*9**2
и12345
становится1**2*3**4*5
. Это допустимые выражения Perl, которые могут быть оценены с(
0**0
Находится1
в Perl). Тогда просто поместите цикл вокруг этого со счетчиком, который заставляет его истечь. Поскольку, за исключением фиксированных точек, значения очень быстро снижаются, ряд силовых агрегатов сходится до того, как счетчик получит шанс по-настоящему заработать.источник
Pyth,
25181116 байтПопробуй это здесь!
714 байтов, сохраненных с помощью @Jakubeобъяснение
источник
Python 2, 111 байт
Идея состоит в том, чтобы создать строку, в которой цифры
n
разделяются операциями, которые чередуются между*
и**
, а затемeval
этой строкой. (Другие решения используют эту же идею; см., Например , ответ Perl от Ton Hospel .)Таким образом, операция переключается между
'**'[0:]
, что есть**
, и'**'[-1:]
, что справедливо*
.Однако к концу
for
-loop строка заканчивается операцией (той или другой), поэтому нам нужно либо удалить последнюю операцию, либо добавить еще одну цифру, чтобы строка имела смысл.К счастью, добавление
1
в конце будет работать независимо от того, какая операция является последней. (Если хотите,1
это односторонняя идентификация справа, как для умножения, так и для возведения в степень. Другой способ сказать, что этоpowertrain(n) == powertrain(10*n + 1)
для всехn>0
.)Наконец, если результат
eval
события совпадает с входом (как в1
цикле длины ), функция завершается. В противном случае функция вызывает себя в результате. (Он будет зависать вечно на любом цикле длины> 1
, но согласно комментариям ОП я могу предположить, что таких циклов нет.)(Примечание: приведенное выше объяснение работает для однозначных положительных целых чисел, поскольку
n
будет завершен однозначный ввод , вn**1
результате чего будет1
получен цикл. Однако нам также необходимо принять неположительный ввод, поэтому при условии Начиная это короткое замыкание, если входное значение меньше, чем1
. Мы могли бы исключить эту строку и сохранить 17 байтов, если входные данные были гарантированно неотрицательными.)источник
Java 8,
265244229 байтЭто мой первый ответ, но я давно читаю этот сайт и думаю, что знаю, что делаю. По крайней мере, это лучше, чем befunge и SQL ...
К сожалению, как и другие ответы, этот не работает для 24547284284866560000000000 из-за встроенных в java'a ограничений на то, как большие целые могут получить.
Сохранено 36 байтов благодаря @JackAmmo
Ungolfed Объяснение
источник
if(n<10)return n;else{...}
else является ненужным, поскольку логически все в этом блоке else будет работать в любом случае, только когда n <10 - false. Удаление остатка и двух соответствующих скобок сэкономит вам 6 байтов. Аналогичная ситуация с вашим последним if ... elseif(n==t)return n;else return p(t);
удалите else и пробел после него, чтобы сохранить еще 5 байтов. На самом деле вы можете сократить его еще больше, если вы используете триадный оператор вместо if ... еще какreturn n==t?n:p(t);
int t=i=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){...}for(i=0;...)...
JavaScript (ES6) 71
Рекурсивная функция, остановка при обнаружении повторения. Это не могло бы работать для более длинных циклов (повторение 2 или более значений), но, похоже, этого не могло произойти, по крайней мере, в ограниченном диапазоне точности числа javascript (17 цифр)
Тест
источник
+'1'
убить двух зайцев одним выстрелом!replace
было на 1 байт длиннее:f=n=>`${n}1`.replace(/../g,([x,y])=>r*=Math.pow(x,y),r=1)&&n-r?f(r):n
Mathematica, 77 байт
Анонимная функция. Не слишком сложно.
источник
Befunge
720490 байтНе могу удержаться, чтобы сделать еще один после Никогда не говори мне, что шансы . Итак, я оптимизировал «ASCII-уровень» предыдущего. В этом случае я не видел необходимости, чтобы указатель инструкций проходил над цифрами, чтобы прочитать их, поэтому я не предпринял усилий, чтобы сделать их читаемыми человеком. Так что теперь это скорее дигитайзер.
Опять же, если вы, ребята, хотите объяснения, дайте мне знать в комментариях, я постараюсь создать несколько полезных описаний. Вы можете скопировать вставить код в интерпретатор . Я обнаружил, что в примере 24547284284866560000000000 выводится 0, но, похоже, это проблема с получением такого большого значения из точки на сетке, поскольку вы можете четко видеть правильное значение, сохраняемое на последних шагах.
Эта версия также поддерживает отрицательный вклад. Это большое улучшение по сравнению с предыдущей версией, если я так скажу. По крайней мере 1 ошибка была исправлена, а размер был значительно уменьшен.
источник
Haskell,
1007977 байтНе в гольф:
Эта функция разбивает ввод на цифры и выполняет трюк через
i
.РЕДАКТИРОВАТЬ: Спасибо Ними за некоторые советы.
источник
i(a:[])=a
естьi[a]=a
, б) нет необходимостиmax 1
, потому что0^0 = 1
в Haskell, в) заменить(:[])
наpure
, г) переместитьlet
внутреннюю частьg
в отдельную функцию и заменитьif ... then ... else
охранниками:h=i.map(read.pure).show ; g x|x==h x=x|1<2=h x
pure
не в прелюдии, но остальные советы работают, спасибо. Я пытался сделать это с охраной, но в итоге использовал;
раньше охранника, и это не сработало, но теперь я знаю, как это должно работать.pure
находится в Prelude, который идет с base-4.8.2.0. Не знаю, когда это было введено. Вам не нужно( )
вi([a])=a
.Mathematica, 74 байта
объяснение
Это решение использует вспомогательную функцию
f
, которая принимает цифры числа в качестве аргументов и применяет одну итерацию операции силовой передачи. Последняя строка - это чистая функция, созданная для использованияReplaceRepeated
функции (или//.
для краткости), которая применяет правило к выражению (в данном случае аргумент#
чистой функции) до тех пор, пока оно больше не изменится. Правилоi_/;i>0:>f@@IntegerDigits@i
заменяет все неотрицательные на функцию,f
применяемую к десятичным цифрам.источник
:=
)SetDelayed::write: Tag Times in n f[a_,b_,c___] is Protected. >>
,Set::write: Tag Times in 1 f[n_] is Protected. >>
Вторая ошибка исчезает, когда я использую:=
против=
.;
s вместо переносов строк:0~f~0=f[]=1;f@n_=n;f[a_,b_,c___]:=f[c]a^b;#//.i_/;i>0:>f@@IntegerDigits@i&
MATL , 21 байт
Может потребоваться несколько секунд, чтобы произвести вывод.
РЕДАКТИРОВАТЬ (30 июля 2016 г.): связанный код заменяется
9L
на,1L
чтобы адаптироваться к последним изменениям в языке.Попробуйте онлайн!
При этом используются следующие две хитрости для уменьшения количества байтов за счет эффективности кода:
n
время вместо ожидания, пока не будет найден цикл. Это приемлемо согласно комментариям ОП.1
должен быть добавлен финал, чтобы завершить финальную операцию питания. Вместо этого, количество добавленных1
является количество цифр. Это обеспечивает четное число, поэтому можно выполнять все операции с питанием (даже если последние являются ненужными1^1
операциями).Код:
источник
a, b, a, b
до бесконечности (более одного термина). Если один термин повторяется, то вы должны вывести это число. Извините, если это не совсем понятно.2592
на входе, они довольно долго ничего не выводят.Python 3,
169161 байтUngoldfed
Полученные результаты
источник
;
этого способа, чтобы сэкономить пробельные символы. Также вы можете поместить тело цикла for в ту же строку.def f(s,o=[['1',s]["-"in s]],n=int):
while s not in o:
o+=[s];s+=1*(len(s)%2<1);r=1
for i,j in zip(s[::2],s[1::2]):r*=n(i)**n(j)
s=str(r)
return o[-1]
o=[['1',s]["-"in s]]
в аргументе по умолчанию не работает для меня, это вызывает ошибку "не определено"Oracle SQL 11.2, 456 байт
Un-golfed
v рекурсивное представление, параметры
n: число, которое нужно разделить на две части
c: количество двухзначных частей
i: текущая 2-х значная часть для вычисления
f: строка, объединяющая полномочия с * в качестве разделителя
t: оценка f
DECODE переключаются на следующий номер для разделения и вычисления, когда все части текущего номера сделаны.
XMLTABLE (f) принимает выражение и оценивает его, помещая результат в псевдостолбец «column_value». Это версия игры в гольф http://tkyte.blogspot.fr/2010/04/evaluating-expression-like-calculator.html
CYCLE - это сборка оракула при обнаружении цикла, которая используется в качестве условия выхода.
Поскольку результат для: 1 <10 равен: 1, а v не возвращает строки для этих случаев, SUM вызывает строку со значением NULL в качестве значения. NVL возвращает: 1 как результат, если строка пуста.
источник