Код алгоритму 196 гольфу


35

Напишіть коротку програму для 196-алгоритму . Алгоритм починається з цілого числа, потім додає до нього зворотній характер, поки не буде досягнуто паліндром.

напр

input = 5280
5280 + 0825 = 6105
6105 + 5016 = 11121
11121 + 12111 = 23232
output = 23232

Вхідні дані

ціле число, яке не є лірхрельним числом (тобто, зрештою, за цим алгоритмом виходить паліндром, а не продовжує нескінченно)

Вихідні дані

паліндром досяг.


6
Тому що ваше питання, мабуть, єдине, що стосується алгоритму 196. Створення тегів для одноразового використання не корисно.
Кріс Єстер-Янг

2
Я мав на увазі те, що ваше питання, ймовірно, буде єдиним, хто коли-небудь займався цією темою, навіть через 2 роки. :-)
Кріс Єстер-Янг

1
@Chris: Що ж, 196-алгоритм - це досить популярний, який має багато різних імен. Щоб бути впевненим, я опублікую ще одне запитання щодо цього, перш ніж
закінчиться

1
@GigaWatt також я помилив ваше кулакове запитання :) Просто не турбуйтеся зі справою A023108s.
Ельвекс

1
@Joel, як і у випадку з A023108, просто ігноруйте їх (дійте так, як ви про них не знаєте); ми не знаємо, чи існує взагалі.
Вісімнадцять

Відповіді:


10

APL (22 символи)

{a≡⌽a←⍕(⍎⍵)+⍎⌽⍵:a⋄∇a}⍞

Це працює в Dyalog APL. Ось пояснення справа наліво:

  • { ... }⍞: Отримайте дані від користувача у вигляді символів ( ) та подайте їх до нашої функції ( { ... }).
  • У межах прямої функції ( відокремлює твердження, тому ми дивимось на них зліва направо):
    • a≡⌽a←⍕(⍎⍵)+⍎⌽⍵ : a: Оцініть ( ) зворотний ( ) правильний аргумент ( ) і додайте його до оціненої версії самого правильного аргументу. Потім відформатуйте результат ( тобто, подайте його символьне представлення), призначте ( ) цій змінній aі, нарешті, перевірте, чи aє зворотній зворотній еквівалент a(тобто є aпаліндром?). Якщо це правда, поверніться a; інакше ...
    • ∇a: Зворотній зв'язок aз нашою функцією ( неявна самонавіювання).

Приклад:

      {a≡⌽a←⍕(⍎⍵)+⍎⌽⍵:a⋄∇a}⍞
412371
585585

2
Це дозволяє економити кілька символів для використання цифрового введення. {⍵=A←⍎⌽⍕⍵:⍵⋄∇A+⍵}⎕. Ви зберігаєте дужки, реверс і eval.
Марін

10

GolfScript, 29 символів

~]{{.`.-1%.@={;0}{~+1}if}do}%

Вибраний коментар

Звичайно, м'ясо програми - це doцикл. Тож я просто покрию це.

  1. .` копіює номер і стрифікує його.
  2. .-1% копіює версію рядка та відміняє її.
  3. .@ копіює перевернуту версію і повертає оригінальну невернуту версію на передню частину.

Так, наприклад, число 5280. На цьому етапі, стек: 5280 "0825" "0825" "5280". Етап встановлюється для порівняння. (Після порівняння стек буде залишений 5280 "0825"незалежно від того, що --- пункти для порівняння вискочили.)

  1. Якщо рядок і реверс однакові, ми не дбаємо про перетворену рядок, тому просто вискочіть її ( ;) і поверніть 0 (щоб закінчити doцикл).
  2. Якщо вони не збігаються, то оцініть ( ~) зворотний рядок (щоб він став числом), додайте ( +) до початкового числа та поверніть 1 (для продовження doциклу).

4
Ви впевнені, що не натискали випадкові клавіші на клавіатурі? Виглядає так ...

1
@ M28: GolfScript більше схожий на шум лінії, ніж Perl, чи не так? ;-)
Кріс Єстер-Янг

Мені шкода вас, це мусить бути болісно

@ M28: Це було не так болісно, ​​як рішення, яке я написав для алгоритму Луна . Подумайте лише про це. :-P
Кріс Єстер-Янг

Ваша сім'я переживає за вас

10

Python 2, 55 байт

Наступна пропозиція JPvdMerwe:

n=input()
while`n`!=`n`[::-1]:n+=int(`n`[::-1])
print n

Пітон 2, 62:

n=raw_input()
while n!=n[::-1]:n=`int(n)+int(n[::-1])`
print n

Хехе ..))))))))
Накілон

2
Дивлячись nяк на int, який ви можете скоротити на 6 символів, перевірте код: meta.codegolf.stackexchange.com/q/75/62
JPvdMerwe

Здається, я випадково включив новий рядок vim, підлий, доданий до кінця мого файлу до мого рахунку. Реальний підрахунок - 55.
JPvdMerwe


7

Просто вправляючи мої навички Pyth, а не серйозний суперник.

Pyth, 16 байт

L?bqb_by`+vbi_bTyz

Еквівалент Python 3:

y=lambda b:b if b==b[::-1] else y(str(eval(b)+int(b[::-1],10)))
print y(input())

Просто випробувавши старі виклики, вже відповів, так що не серйозний претендент.
swstephe

1
Деякі автори викликів оновлять прийняту відповідь, якщо надійде коротше рішення, тому я вважаю, що справедливо повідомити ОП, що це технічно не є правдивим. (Не зрозумійте мене неправильно, я люблю відповідати на старі виклики із CJam для розваги - і я це робив кілька хвилин тому. Я просто кажу, якщо ви це робите, залиште на замітку, що мова новіша, ніж виклик.)
Мартін Ендер

Насправді "несерйозний претендент" робить відповідь видаленою - але я не бачу причин, щоб це не можна вважати серйозним претендентом.
pppery


6

CJam, 22 21 байт

CJam був створений після того, як було задано це питання, тому технічно це недійсне подання. Але мені питання було цікавим, тож ось що:

r{__W%:X=0{~X~+s1}?}g

Пояснення:

r{                 }g    "Read the input number as string and enter a while-do loop";
  __                     "Make 2 copies of the string number";
    W%:X                 "Reverse the second and store it in X";
        =                "Check if the number is already palindrome";
         0{      }?      "Put 0 on stack if it is palindrome, else, run the code block";
           ~             "Convert the string to int";
            X~           "Put the reverse string on stack and convert it to int too";
              +s         "Add the two numbers and covert back the result to string";

Основна логіка полягає в тому, що при кожній ітерації під час спочатку ви перевіряєте, чи досягається паліндром чи ні. Якщо ні, додайте зворотний номер до числа. Досить багато алгоритму!

Спробуйте його онлайн тут


5

Це фактичний суперник, оскільки J існує вже десятиліттями.

J (16 байт)

(+^:~:|.&.":)^:_

Це дієслово, тому його можна присвоїти змінній у сесії J та використовувати так:

   f =. (+^:~:|.&.":)^:_
   f 5280
23232

Як це працює:

(+^:~:|.&.":)^:_
 +^:~:           add if unequal
      |.&.":     reverse under string format
 +^:~:|.&.":     add reverse unless a palindrome
(           )^:_ repeat until unchanged




4

JAGL Alpha 1.2 - 19, 21 зі стдін

Не суперечуюсь , просто отримавши певний досвід моєї мови
Очікує, що число stdin

T~d{DddgCi+dgdC=n}uSP

Пояснення

T~                       Get a line of input, and eval to an integer
  d                      Duplicate (for first round)
   {Ddd                  Drop last and duplicate twice
       gCi               Convert to string, reverse, and convert back to integer
          +d             Add to original and duplicate
            gdC          Convert to string, duplicate, reverse
               =n}       If it isn't a palindrome, keep going
                  uSP    Run until palindrome reached, then print output number

Відредаговано. @Optimizer
globby

Будь ласка, не редагуйте всі ваші публікації одразу для незначних змін (наприклад, номер версії), оскільки це зайве захаращує головну сторінку. Це добре, якщо ви робите 2 або, можливо, 3 одночасно, але зачекайте кілька годин, перш ніж робити більш систематичні зміни.
Мартін Ендер

Забув, що це підштовхне до першої сторінки, моя погана. @ MartinBüttner
globby

4

05AB1E , 7 байт (неконкурентоспроможний)

Неконкурентовані , оскільки мова висуває виклик.

Код:

[DÂQ#Â+

Пояснення:

[        # Infinite loop.
 DÂ      # Duplicate and bifurcate (which duplicates it and reverses the duplicate).
   Q#    # If the number and the number reversed are equal, break.
     Â+  # Add the reversed number to the initial number.

Використовує кодування CP-1252 . Спробуйте в Інтернеті! .


Чи можете ви пояснити трохи більше про процес біфуркації?
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Наприклад, на стеці - рядок hello. Біфуркація збереже початкову рядок, а рядок буде витіснено назад. Це короткий варіант для дублювання та зворотного зв'язку .
Аднан

О Я бачу. Класно! Спасибі
Conor O'Brien

4

Брахілог , 8 байт

↔?|↔;?+↰

Спробуйте в Інтернеті!

Дещо схожа на одну з перших програм Brachylog, яку я побачив і мене заінтригувало, із вступного відео Brachylog .

?↔?.|↔;?+↰.  (initial ? and the .s are implicit)

?↔?          % If the input and its reverse are the same,
   .         %   then the input is the output
    |↔;?+↰   % Or, add the input and its reverse, and call this predicate recursively
          .  % The result of that is the output

3

PHP - 54 48 символів

<?for($s=`cat`;$s!=$r=strrev($s);$s+=$r);echo$s;

Тест:

$ php 196.php <<< 5280
23232

Мені доведеться запам'ятати $str = річ кота для майбутнього гольфу. Хек набагато краще, ніж використання STDINі все ж краще, ніж $argv[0].
Містер Лама

@GigaWatt: $ s = 'm4' також має працювати.
ніндзя

3

Баш (64)

X=`rev<<<$1|sed s/^0*//`;[ $1 = $X ]&&echo $1||. $0 $(($1+$X))

Зателефонуйте за допомогою: bash <ім'я файла> <номер>


Для чого <ім'я файлу>?
Ельвекс

2
@Eelvex сценарій повинен викликати себе, тому вам потрібно зберегти його у файлі.
marinus

3

C # - 103 99 символів

public int P(int i)
{
    var r = int.Parse(new string(i.ToString().Reverse().ToArray())));
    return r == i ? i : P(i + r);        
}

C # ніколи не дуже добре в гольфі. Елегантний, але багатослівний.


1
Ви можете легко гольфу більше. Використовуйте "" +, а не .ToString та позбудьтесь пробілів.
Яків

3

В Q (39 символів)

f:{while[x<>g:"I"$reverse -3!x;x+:g];x}

Використання зразка:

q)f 5280
23232

Редагувати:

Зараз до 34, те саме використання:

{while[x<>g:"I"$(|) -3!x;x+:g];x} 5280


3

Желе , 9 байт (не змагається)

Дуже проста відповідь, лише для завдання кодування в езотеричній мові.

ṚḌ+µŒḂ¬$¿

ṚḌ        : take the argument, reverse (and vectorize) it
  +µ      : add both
    ŒḂ¬$¿ : while the result isn't a palindrome

Спробуйте в Інтернеті!

Якщо ця відповідь буде незрозумілою чи неправильною на будь-якому рівні, сміливо зазначайте її.

Дякую Деннісу за те, що він допомагав мені в першому невеликому коді.


Нічого не всі використовують Jelly у своєму першому дописі.
Нісса

Це було в моєму списку справ, щоб розмістити відповідь на PPCG за допомогою езотеричної мови. Джеллі стався першим, про кого я подумав :)
z3r0

2

Пітон. 85 символів:

s,i=str,int;rs=lambda q:s(q)[::-1];n=i(input());
while rs(n)!=s(n):n+=i(rs(n));print n

Якщо ви не хочете виводити дані про кожну ітерацію:

s,i=str,int;rs=lambda q:s(q)[::-1];n=i(input());
while rs(n)!=s(n):n+=i(rs(n))
print n

(один символ менше)


В описі завдання зазначено, що слід друкувати лише остаточний паліндром.
Джої

2

Windows PowerShell (63)

for($a=+"$input";-join"$a"[99..0]-ne$a){$a+=-join"$a"[99..0]}$a

Я все ще ненавиджу, що немає простого способу повернути рядок.


Можна скоротити на два символи, якщо вводиться лише десять цифр введення. Таким чином, це безпечно і для longтого, що це найбільший інтегральний тип PowerShell підтримує у будь-якому випадку, але все-таки я витрачаю два знаки.
Joey

2

Haskell 89 87 символів

r=read.reverse.show
main=getLine>>=print.head.filter(\x->x==r x).iterate(\x->x+r x).read

Трохи читабельна версія:

myFind p = head . filter p
rev = read . reverse . show
isPalindrome x = x == rev x
next x = x + rev x
sequence196 = iterate next
palindrome196 = myFind isPalindrome . sequence196

main = getLine >>= print . palindrome196 . read

Версія для гольфу була створена за допомогою ручного вбудовування та перейменування решти функцій в єдині імена символів.


1
Ви можете досить скоротити це, скориставшись невикористаною функцією untilз Прелюдії, а також витягнувши схему застосування бінарного оператора до xта r x. Також використовуйте readLnзамість getLineі read. Результат економить 20 символів:f%x=f x$read.reverse.show$x;main=readLn>>=print.until((==)%)((+)%)
hammar

@hammar: Ви можете використовувати функцію монади та економити ще більше: Визначте r=(=<<read.reverse.show)та просто використайте r(==)`until`r(+). Крім економії, вона не повинна бути повноцінною програмою, коректним поданням може бути лише названа функція від раніше. Це зводить вас до 41 байт: Спробуйте в Інтернеті!
ბიმო

2

befunge, 57 байт

"KCTS"4(&:0\v
\T\a*+\:0`jv>:a%\a/
0:+_v#-TD2$<^\
  @.<

хоча код розміщений у сітці 4x19, так можна назвати його 76.

  • перший рядок - ініціалізація та читання вхідного номера
  • другий рядок переверніть перший номер у стеку і поставте його у друге положення стека.
  • а третій рядок перевіряє, чи є число паліндром.

2

TM + C ++ (256 символів)

#include<cstdio>
#define Y(A,B,C,D)template<int N>struct A<C,D>{enum{v=B};};
#define Z(A)template<int N,int M>struct A{enum{v=
#define n 5194
Z(R)R<N/10,M*10+N%10>::v};};Y(R,N,0,N)Z(S)S<N+M,R<N+M,0>::v>::v};};Y(S,N,N,N)main(){printf("%d",S<n+R<n,0>::v,0>::v);}

Цю версію можна трохи скоротити, але відповідь на 256 символів важко пропустити. Ось версія без гольфу:

#include <iostream>

template<size_t N>
class Reverse
{
    template<size_t M, size_t R>
    struct Inner
    {
        enum { value = Inner<M/10, R*10 + M%10>::value };
    };

    template<size_t R>
    struct Inner<0, R>
    {
        enum { value = R };
    };

public:
    enum { value = Inner<N, 0>::value };
};

template<size_t N>
class OneNineSix
{
    template<size_t M, size_t R=Reverse<M>::value>
    struct Inner
    {
        enum { value = OneNineSix<M + R>::value };
    };

    template<size_t M>
    struct Inner<M, M>
    {
        enum { value = M };
    };

public:
    enum { value = Inner<N + Reverse<N>::value>::value };
};

int main()
{
    const size_t N = 4123;

    std::cout << OneNineSix<N>::value << std::endl;
}

2

Пайк, 13 байт (неконкурентоспроможний)

D`_b]D$XIsr)h

Спробуйте тут!

 `_b          -     int(reversed(str(num))
D   ]         -    [num, ^]
     D        -   _ = ^
      $       -  delta(^)
       XI     - if ^:
         s    -  num = sum(_)
          r   -  goto_start()
            h - _[0]

2

Додайте ++ , 57 байт

L,BDbRBv
D,f,@,1]A+
D,g,@,1]A=
D,h,@,{f}A{g}Q{h}
L,{h}2/i

Спробуйте в Інтернеті!

Як це працює

L,	; Create a function 'lambda 1'
	; Example argument:   [5280]
    BD	; Digits;     STACK = [[5 2 8 0]]
    bR	; Reverse;    STACK = [[0 8 2 5]]
    Bv	; Undigits;   STACK = [825]

D,f,@,	; Define a monadic function 'f'
	; Example argument:         [5280]
    1]	; Call 'lambda 1';  STACK = [825]
    A+	; Add the argument; STACK = [6105]

D,g,@,	; Define a monadic function 'g'
	; Example argument:          [5280]
    1]	; Call 'lambda 1';   STACK = [825]
    A=	; Equal to argument; STACK = [0]

D,h,@,	; Define a monadic function 'h'
	; Example argument:  [5280]
   {f}	; Call 'f';  STACK = [6105]
   A{g}	; If 'g'...
   Q	;   Return
   {h}	; Else call 'h'

L,	; Define a function, 'lambda 2'
	; Example argument: [5280]
   {h}	; Call 'h'; STACK = [46464]
   2/i	; Halve;    STACK = [23232]

2

Powershell, 63 62 байт

-1 байт завдяки @AdmBorkBork

param($m)for(;$m-$s;$m=-join"$s"[-1..-"$s".Length]){$s+=$m};$s

Тестовий сценарій:

$f = {
param($m)for(;$m-$s;$m=-join"$s"[-1..-"$s".Length]){$s+=$m};$s
}

&$f 5280

1
Вам не потрібно ;між param($m)і for.
AdmBorkBork

2

GNU dc, 46 байт

Потрібен GNU dc, min версія 1.4 (для Rкоманди).

[O~3RO*+rd0<R]sR[+lfx]sg[ddO~rd0<R+d3R!=g]dsfx

Введення та вихід, як завжди, є верхньою частиною стеку. Для звороту цифр у dc потрібна дивна кількість коду (якщо я щось не пропускаю, що далеко не можливо). Він має числовий діапазон, щоб добре поводитись з такими входами (які, наприклад, переповнюватимуть 32-бітну неподписану арифметику):

  • 89 ⇒ 8,813,200,023,188
  • 8997 ⇒ 16,668,488,486,661
  • 10677 ⇒ 4,668,731,596,684,224,866,951,378,664

Пояснення

# Reverse digits, starting after first digit extracted
[O~3RO*+r d0<R]sR

# Recursion helper - add and recurse
[+ lfx]sg

# Main recursive function
[dd O~r d0<R+ d3R !=g]dsfx


Можна вказати, що це працює лише на GNU dc 1.4 і пізніших версіях, оскільки він використовує нову Rкоманду. Хороше рішення, хоча!
Софія Лехнер

Я працюю над абсолютно іншим підходом, але не впевнений, що він стане меншим.
Софія Лехнер

Дякую Софію - я не зрозуміла, що Rце нове. З нетерпінням чекаємо на ваш метод!
Toby Speight

Ах, ні ... я спробував інший підхід до упорядкування зовнішньої петлі, але він виявився приблизно на п’ять байтів більшим і не красивішим. Ти виграв. =)
Софія Лехнер

2

R , 193 109 105 байт

-84 байти завдяки Джузеппе! -4 байки завдяки JayCe!

function(x){"-"=utf8ToInt
S=strtoi
"!"=rev
while({z=paste(S(x)+S(intToUtf8(!-x),10));any(-z!=!-z)})x=z
z}

Спробуйте в Інтернеті!


1
Ви можете (і повинні) вибрати інший спосіб зробити це, ніж маніпуляції зі струнами, але ось кілька порад для гольфу для обраного вами методу: strsplit(x,"")він коротший strsplit(x,NULL)і el(L)коротший L[[1]]. as.doubleкоротше as.numericі strtoiкоротше обох; замість налаштування tпросто використовуйте його безпосередньо у своїй ifзаяві. також це рекурсивна функція, якщо я не помиляюся, тому вам потрібно поставити її f=як частину подання.
Джузеппе

@Giuseppe Зрозумів. Дякую за поради. Я продовжуватиму працювати над цим. Мені легше просто отримати щось, що працює, потім повернутися назад і оптимізувати.
Роберт С.

1
Хе-хе, ніяких турбот. Якщо ви пекло використовуєте рядки (або змушені проблемою), подумайте utf8ToIntпро перетворення в цифри та intToUtf8перетворення назад. Це буде велика економія байтів!
Джузеппе


1
Збережіть ще 4 байти , використовуючи -замість U. Я також замінив revна !байт, але це не економить жодного байту ...
JayCe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.