196 algorytm kod golf


35

Napisz krótki program dla algorytmu 196 . Algorytm zaczyna się od liczby całkowitej, a następnie dodaje odwrotność do momentu osiągnięcia palindromu.

na przykład

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

Wkład

liczba całkowita, która nie jest liczbą lyrchrela (tzn. ostatecznie daje palindrom w ramach tego algorytmu, zamiast kontynuować w nieskończoność)

Wydajność

dotarł palindrom.


6
Ponieważ twoje pytanie jest prawdopodobnie jedynym, które dotyczy algorytmu 196. Tworzenie tagów jednorazowego użytku nie jest przydatne.
Chris Jester-Young

2
Chodziło mi o to, że twoje pytanie prawdopodobnie będzie jedynym , które dotyczy tego tematu, nawet za 2 lata. :-)
Chris Jester-Young

1
@Chris: Cóż, algorytm 196 jest dość popularny, pod wieloma różnymi nazwami. Jednak dla pewności opublikuję kolejne pytanie na ten temat przed upływem 2 lat;)
Eelvex 29.01.11

1
@GigaWatt też, nie przeczytałem twojego pytania na pięść :) Po prostu nie przejmuj się przypadkiem A023108s.
Eelvex

1
@Joel, podobnie jak w przypadku A023108, po prostu je zignoruj ​​(zachowuj się, jakbyś o nich nie wiedział); i tak nie wiemy, czy coś istnieje.
Eelvex

Odpowiedzi:


10

APL (22 znaki)

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

Działa to w Dyalog APL. Oto wyjaśnienie od prawej do lewej:

  • { ... }⍞: Uzyskaj dane wejściowe od użytkownika jako znaki ( ) i wprowadź je do naszej funkcji ( { ... }).
  • W ramach funkcji bezpośredniej ( rozdziela instrukcje, więc patrzymy na nie od lewej do prawej):
    • a≡⌽a←⍕(⍎⍵)+⍎⌽⍵ : a: Oceń ( ) odwrotność ( ) odpowiedniego argumentu ( ) i dodaj to do sprawdzonej wersji samego argumentu. Następnie sformatuj wynik ( tj. Podaj jego reprezentację znaków), przypisz ( ) to zmiennej a, a na końcu sprawdź, czy aodwrotność jest równoważna a(tj. Czy apalindrom?). Jeśli to prawda, wróć a; Inaczej...
    • ∇a: aWróć do naszej funkcji ( to ukryte odniesienie).

Przykład:

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

2
Zapisuje kilka znaków, aby użyć wprowadzania numerycznego. {⍵=A←⍎⌽⍕⍵:⍵⋄∇A+⍵}⎕. Zapisujesz szelki, odwrotność i eval.
marinus

10

GolfScript, 29 znaków

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

Wybrany komentarz

Mięsem programu jest dooczywiście pętla. Więc po prostu to omówię.

  1. .` kopiuje numer i go strituje.
  2. .-1% kopiuje tę wersję ciągu i odwraca ją.
  3. .@ kopiuje wersję odwróconą i przenosi oryginalną wersję nieodwróconą na pierwszy plan.

Więc powiedzmy, że numer jest 5280. Na tym etapie, stos jest: 5280 "0825" "0825" "5280". Etap jest ustawiony do porównania. (Po porównaniu stos pozostanie 5280 "0825"bez względu na to, co --- przedmioty do porównania zostały usunięte).

  1. Jeśli ciąg znaków i odwrotność są takie same, nie przejmujemy się ciągiem odwróconym, więc po prostu usuń go ( ;) i zwróć 0 (aby zakończyćdo pętlę).
  2. Jeśli się nie zgadzają, oceń ( ~) odwrócony ciąg (aby był liczbą), dodaj ( +) to do pierwotnego numeru i zwróć 1 (aby kontynuować dopętlę).

4
Czy na pewno nie nacisnąłeś przypadkowych klawiszy na klawiaturze? Wygląda to tak ...

1
@ M28: GolfScript wygląda jeszcze bardziej jak szum linii niż Perl, prawda? ;-)
Chris Jester-Young


@ M28: To nie było tak bolesne jak rozwiązanie, które napisałem dla algorytmu Luhna . Pomyśl o tym. :-P
Chris Jester-Young

Twoja rodzina martwi się o Ciebie

10

Python 2, 55 bajtów

Zgodnie z sugestią JPvdMerwe:

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

Python 2, 62:

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

Hehe ..))))))))
Nakilon 28.01.11

2
Patrząc na nint, możesz skrócić o 6 znaków, sprawdź kod: meta.codegolf.stackexchange.com/q/75/62
JPvdMerwe

Wygląda na to, że przypadkowo dołączyłem do mojej listy nowy wiersz vim podstępnie dodany na końcu mojego pliku. Rzeczywista liczba to 55.
JPvdMerwe

7

Rubin - 56 znaków

x,r=gets
x="#{x.to_i+r.to_i}"until x==r=x.reverse
puts x

7

Po prostu ćwiczę moje umiejętności Pythona, a nie poważny kandydat.

Pyth, 16 bajtów

L?bqb_by`+vbi_bTyz

Odpowiednik Python 3:

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

Próbuję tylko kilku starych wyzwań, na które już odpowiedziałem, więc nie jest to poważny konkurent.
swstephe

1
Niektórzy autorzy wyzwań zaktualizują zaakceptowaną odpowiedź, jeśli pojawią się krótsze rozwiązania, więc myślę, że należy poinformować PO, że nie jest to technicznie prawidłowe zgłoszenie. (Nie zrozum mnie źle, lubię też odpowiadać na stare wyzwania w CJam dla zabawy - i zrobiłem to kilka minut temu. Po prostu mówię, jeśli tak, zostaw notatkę, że język jest nowszy niż wyzwanie.)
Martin Ender,

Właściwie to, że „nie jest poważnym konkurentem”, odpowiedź podlega usunięciu - ale nie widzę żadnego powodu, dla którego nie należy tego traktować jako poważnego rywala.
pppery


6

CJam, 22 21 bajtów

CJam powstał po zadaniu tego pytania, więc technicznie jest to nieprawidłowe przesłanie. Ale pytanie uznałem za interesujące, więc oto:

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

Wyjaśnienie:

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";

Podstawowa logika polega na tym, że w każdej iteracji „do zrobienia” najpierw sprawdza się, czy palindrom został osiągnięty, czy nie. Jeśli nie, dodaj odwrotną liczbę. Prawie, jaki jest algorytm!

Wypróbuj online tutaj


5

To jest prawdziwy pretendent, odkąd J istnieje już od dziesięcioleci.

J (16 bajtów)

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

Jest to czasownik, więc można go przypisać do zmiennej w sesji J i używać w następujący sposób:

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

Jak to działa:

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

4

Python: 66

n=input()
while 1:
 r=int(`n`[::-1])
 if n==r:break
 n+=r
print n



4

JAGL Alpha 1.2 - 19, 21 ze standardowym

Nie kłócę się , tylko trochę doświadczenia z moim językiem
Oczekuje liczby od standardowego

T~d{DddgCi+dgdC=n}uSP

Wyjaśnienie

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

Edytowane. @Optimizer
globby

Nie edytuj wszystkich swoich zgłoszeń naraz w przypadku drobnych zmian (takich jak numer wersji), ponieważ niepotrzebnie zaśmieca to pierwszą stronę. W porządku, jeśli wykonujesz 2, a może 3 na raz, ale poczekaj kilka godzin, zanim wprowadzisz bardziej systematyczne zmiany.
Martin Ender

Zapomniałem, że to przekieruje na pierwszą stronę, moje złe. @ MartinBüttner
globby

4

05AB1E , 7 bajtów (niekonkurujące)

Nie konkuruje , ponieważ język jest późniejszy niż wyzwanie.

Kod:

[DÂQ#Â+

Wyjaśnienie:

[        # 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.

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .


Czy mógłbyś wyjaśnić nieco więcej na temat procesu rozdwojenia?
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Na przykład na stosie znajduje się ciąg znaków hello. Rozgałęzienie zachowa oryginalny ciąg i popycha go do tyłu. To skrót od duplikatu i odwrócenia .
Adnan

Rozumiem. Fajne! Dzięki
Conor O'Brien

4

Brachylog , 8 bajtów

↔?|↔;?+↰

Wypróbuj online!

Nieco podobny do jednego z pierwszych programów Brachylog, które widziałem i byłem zaintrygowany, z wideo wprowadzającego 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 znaków

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

Test:

$ php 196.php <<< 5280
23232

Będę musiał pamiętać o $str = kocie rzeczy do przyszłego golfa. O wiele lepszy niż używanie STDINi wciąż lepszy niż $argv[0].
Pan Llama,

@GigaWatt: $ s = 'm4' również powinno działać.
ninjalj

3

Bash (64)

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

Zadzwoń za pomocą: bash <nazwa_pliku> <numer>


Do czego służy <nazwa pliku>?
Eelvex

2
@Eelvex skrypt musi się nazywać, więc musisz zapisać go w pliku.
marinus

3

C # - 103 99 znaków

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

C # nigdy nie radzi sobie najlepiej w golfie. Elegancki, ale pełny.


1
Możesz z łatwością zagrać w golfa bardziej. Użyj „” + zamiast .ToString i pozbądź się niektórych spacji.
Jacob

3

W Q (39 znaków)

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

Przykładowe użycie:

q)f 5280
23232

Edytować:

Do 34 lat, to samo użycie:

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


3

Galaretka , 9 bajtów (nie konkuruje)

Bardzo prosta odpowiedź, tylko na wyzwanie związane z kodowaniem w języku ezoterycznym.

ṚḌ+µŒḂ¬$¿

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

Wypróbuj online!

Jeśli ta odpowiedź będzie niejasna lub błędna na jakimkolwiek poziomie, możesz ją wskazać.

Dziękuję Dennisowi za pomoc przy tym pierwszym małym fragmencie kodu.


Wow, nie wszyscy używają Jelly w swoim pierwszym poście.
Nissa,

Na mojej liście rzeczy do zrobienia było opublikowanie odpowiedzi na PPCG w ezoterycznym języku. Galaretka była pierwszą, o której myślałem :)
z3r0,

2

Pyton. 85 znaków:

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

Jeśli nie chcesz danych wyjściowych przy każdej iteracji:

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

(jeden mniej znaków)


Opis zadania stwierdza, że ​​należy wydrukować tylko końcowy palindrom.
Joey

2

Windows PowerShell (63)

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

Nadal nienawidzę tego, że nie ma łatwego sposobu na odwrócenie łańcucha.


Można go skrócić o dwa znaki, jeśli tylko dziesięć cyfr wejściowych. W ten sposób jest również bezpieczny, longco jest największym zintegrowanym typem obsługiwanym przez PowerShell, ale wciąż tracę dwa znaki.
Joey

2

Haskell 89 87 znaków

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

Nieco czytelna wersja:

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

Wersja do gry w golfa została stworzona przez ręczne wstawianie i zmianę nazw pozostałych funkcji na nazwy pojedynczych znaków.


1
Możesz to nieco skrócić, wykorzystując niewykorzystaną funkcję untilz Preludium, a także wyodrębniając wzór stosowania operatora binarnego do xi r x. Ponadto użyj readLnzamiast getLinei read. Rezultat oszczędza 20 znaków:f%x=f x$read.reverse.show$x;main=readLn>>=print.until((==)%)((+)%)
hammar

@hammar: Możesz użyć funkcji monad i zaoszczędzić jeszcze więcej: Zdefiniuj r=(=<<read.reverse.show)i po prostu użyj r(==)`until`r(+). Oprócz tego oszczędzania nie musi to być pełny program, prawidłowe przesłanie może być po prostu nienazwaną funkcją z wcześniejszego okresu. Zmniejsza to do 41 bajtów: Wypróbuj online!
ბიმო

2

befunge, 57 bajtów

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

chociaż kod jest umieszczony w siatce 4x19, więc można go nazwać 76.

  • pierwsza linia inicjuje się i odczytuje numer wejściowy
  • druga linia odwróć pierwszy numer na stosie i umieść go w drugiej pozycji stosu.
  • a trzecia linia sprawdza, czy liczba jest palindromem.

2

C ++ TMP (256 znaków)

#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);}

Tę wersję można nieco skrócić, ale odpowiedź na 256 znaków jest trudna do pominięcia. Oto wersja bez gry w golfa:

#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

Pyke, 13 bajtów (niekonkurencyjny)

D`_b]D$XIsr)h

Wypróbuj tutaj!

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

2

Dodaj ++ , 57 bajtów

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

Wypróbuj online!

Jak to działa

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 bajty

-1 bajt dzięki @AdmBorkBork

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

Skrypt testowy:

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

&$f 5280

1
Nie potrzebujesz ;pomiędzy param($m)i for.
AdmBorkBork

2

GNU dc, 46 bajtów

Wymaga GNU dc, wersja min 1.4 (do Rkomendy).

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

Wejścia i wyjścia są jak zwykle na szczycie stosu. Odwrócenie cyfr w dc wymaga zaskakująco dużej ilości kodu (chyba że czegoś mi brakuje, co jest dalekie od niemożliwego). Ma zakres liczbowy, dzięki któremu dobrze się zachowuje w przypadku takich danych wejściowych (które na przykład przepełnią arytmetykę 32-bitową bez znaku):

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

Wyjaśnienie

# 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


Może chcę sprecyzować, że działa to tylko w GNU dc 1.4 i nowszych, ponieważ używa nowej Rkomendy. Jednak dobre rozwiązanie!
Sophia Lechner,

Pracuję nad zupełnie innym podejściem, ale nie jestem pewien, czy skończy się mniej.
Sophia Lechner,

Dzięki Sophia - nie zdawałem sobie sprawy, że to Rbyło nowe. Czekamy na Twoją metodę!
Toby Speight,

Ach, nie ... Próbowałem innego podejścia do układania pętli zewnętrznej, ale skończyło się to o około pięć bajtów większym i nie ładniejszym. Wygrałeś. =)
Sophia Lechner,

2

R , 193 109 105 bajtów

-84 bajty dzięki Giuseppe! -4 pa dzięki JayCe!

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

Wypróbuj online!


1
Możesz (i powinieneś) wybrać inny sposób robienia tego niż manipulowanie sznurkiem, ale oto kilka wskazówek golfowych dla wybranej przez ciebie metody: strsplit(x,"")jest krótszy niż strsplit(x,NULL)i el(L)krótszy niż L[[1]]. as.doublejest krótszy niż as.numerici strtoijest krótszy niż oba; zamiast ustawienia tpo prostu użyj go bezpośrednio w ifwyciągu. jest to również funkcja rekurencyjna, jeśli się nie mylę, więc należy ją f=podać w ramach przesłania.
Giuseppe,

@Giuseppe Rozumiem. Dzięki za wskazówki. Będę nad tym pracował. Łatwiej jest mi zdobyć coś, co działa, a potem wrócić i zoptymalizować.
Robert S.

1
Hehehe, nie martw się. Jeśli masz ochotę na użycie ciągów (lub jest to zmuszone przez problem), rozważ utf8ToIntkonwersję na cyfry i intToUtf8konwersję z powrotem. To będzie duża oszczędność bajtów!
Giuseppe,


1
Save 4 more bytes by using - in place of U. I also replaced rev with ! but it does not save any byte...
JayCe
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.