196 codice algoritmo golf


35

Scrivi un breve programma per l' algoritmo 196 . L'algoritmo inizia da un numero intero, quindi aggiunge il suo contrario fino a raggiungere un palindromo.

per esempio

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

Ingresso

un numero intero, che non è un numero di lyrchrel (ovvero, alla fine produce un palindromo sotto questo algoritmo, piuttosto che continuare all'infinito)

Produzione

raggiunto il palindromo.


6
Perché la tua domanda è probabilmente l'unica che riguarda l'algoritmo 196. Creare tag monouso non è utile.
Chris Jester-Young,

2
Quello che volevo dire era, la sua domanda è probabile che sia l'unico mai a coinvolgere questo tema, anche in tempo di 2 anni. :-)
Chris Jester-Young,

1
@Chris: Beh, l'algoritmo 196 è piuttosto popolare, con molti nomi diversi. Solo per essere sicuri, tuttavia,
posterò

1
@GigaWatt, ho sbagliato a leggere la tua domanda sul pugno :) Non preoccuparti del caso di A023108.
Eelvex

1
@Joel, come con A023108, semplicemente ignorali (comportati come se non li conoscessi); non sappiamo se ne esiste comunque.
Eelvex,

Risposte:


10

APL (22 caratteri)

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

Questo funziona in Dyalog APL. Ecco una spiegazione, da destra a sinistra:

  • { ... }⍞: Ottieni input dall'utente come caratteri ( ) e invialo alla nostra funzione ({ ... } ).
  • All'interno della funzione diretta ( separa le istruzioni, quindi le guardiamo da sinistra a destra):
    • a≡⌽a←⍕(⍎⍵)+⍎⌽⍵ : a: Evaluate ( ) l'argomento giusto ( ) reverse ( ), e aggiungilo alla versione valutata dell'argomento giusto stesso. Quindi, formatta il risultato ( ; cioè, dai la sua rappresentazione del carattere), assegna ( ) quello alla variabile ae infine verifica se ail contrario è equivalente a a(cioè, è aun palindromo?). Se vero, ritorna a; altrimenti...
    • ∇a: aRitorna alla nostra funzione ( è autorevole riferimento implicito).

Esempio:

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

2
Salva alcuni caratteri per utilizzare l'input numerico. {⍵=A←⍎⌽⍕⍵:⍵⋄∇A+⍵}⎕. Salva le parentesi graffe, un rovescio e una valutazione.
Marinus,

10

GolfScript, 29 caratteri

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

Commento selezionato

La carne del programma è il dociclo, ovviamente. Quindi lo coprirò e basta.

  1. .` copia il numero e lo stringe.
  2. .-1% copia quella versione di stringa e la inverte.
  3. .@ copia la versione invertita e porta in primo piano la versione originale non invertita.

Così, per esempio, il numero è 5280. In questa fase, lo stack è: 5280 "0825" "0825" "5280". Il palcoscenico è pronto per il confronto. (Dopo il confronto, la pila rimarrà a 5280 "0825"prescindere da cosa --- gli oggetti da confrontare sono stati saltati fuori.)

  1. Se la stringa e il contrario sono uguali, non ci importa della stringa invertita, quindi basta aprirla ( ;) e restituire 0 (per terminare il dociclo).
  2. Se non corrispondono, quindi valuta ( ~) la stringa invertita (per renderla un numero), aggiungi ( +) quella al numero originale e restituisci 1 (per continuare il dociclo).

4
Sei sicuro di non aver premuto i tasti casuali sulla tastiera? Sembra che ...

1
@ M28: GolfScript assomiglia ancora di più al rumore di linea rispetto a Perl, vero? ;-)
Chris Jester-Young,

Mi dispiace per te, deve essere doloroso codificarlo

@ M28: non è stato così doloroso come la soluzione che ho scritto per l' algoritmo Luhn . Basta pensarci. :-P
Chris Jester-Young,

La tua famiglia è preoccupata per te

10

Python 2, 55 byte

Seguendo il suggerimento di 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,

2
Guardando ncome int puoi accorciare di 6 caratteri, controlla il codice: meta.codegolf.stackexchange.com/q/75/62
JPvdMerwe

Sembra che abbia accidentalmente incluso la nuova riga vim aggiunta di nascosto alla fine del mio file al mio conteggio. Il conteggio reale è 55.
JPvdMerwe

7

Rubino - 56 caratteri

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

7

Sto solo esercitando le mie abilità in Pyth, non un serio contendente.

Pyth, 16 byte

L?bqb_by`+vbi_bTyz

Equivalente a Python 3:

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

Sto solo provando alcune vecchie sfide, già risposto, quindi non un serio contendente.
swstephe,

1
Alcuni autori della sfida aggiorneranno la risposta accettata se arrivano soluzioni più brevi, quindi penso sia giusto informare l'OP, che tecnicamente non si tratta di una richiesta valida. (Non fraintendetemi, mi piace rispondere anche alle vecchie sfide con CJam per divertimento - e l'ho fatto solo pochi minuti fa. Sto solo dicendo, se lo fai, lascia un commento, che la lingua è più recente di la sfida.)
Martin Ender il

In realtà essere "non un contendente serio" rende una risposta soggetta a cancellazione - ma non vedo alcun motivo per cui questo non dovrebbe essere considerato un contendente serio.
pepery

6

J 25 27 31

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

6

CJam, 22 21 byte

CJam è stato creato dopo che questa domanda è stata posta, quindi tecnicamente si tratta di un invio non valido. Ma ho trovato la domanda interessante, quindi ecco qui:

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

Spiegazione:

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

La logica di base è che in ogni iterazione mentre si fa, si controlla innanzitutto se il palindromo viene raggiunto o meno. In caso contrario, aggiungere il numero inverso al numero. Praticamente qual è l'algoritmo!

Provalo online qui


5

Questo è un vero contendente, dato che J esiste da decenni.

J (16 byte)

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

Questo è un verbo, quindi può essere assegnato a una variabile in una sessione J e utilizzato in questo modo:

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

Come funziona:

(+^:~:|.&.":)^:_
 +^:~:           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 con stdin

Non contendere , sto solo facendo esperienza con la mia lingua. Si
aspetta un numero dallo stdin

T~d{DddgCi+dgdC=n}uSP

Spiegazione

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

Modificato. @Optimizer
globby

Ti preghiamo di non modificare tutti i tuoi invii in una sola volta per modifiche minori (come un numero di versione), poiché ciò ingombra inutilmente la prima pagina. Va bene se fai 2 o forse 3 alla volta, ma per favore aspetta qualche ora prima di fare modifiche più sistematiche.
Martin Ender,

Ho dimenticato che sarebbe arrivato in prima pagina, mia cattiva. @ MartinBüttner
globby

4

05AB1E , 7 byte (non concorrenti)

Non competitiva , poiché la lingua postdatizza la sfida.

Codice:

[DÂQ#Â+

Spiegazione:

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

Utilizza la codifica CP-1252 . Provalo online! .


Potresti spiegare qualcosa in più sul processo di biforcazione?
Conor O'Brien,

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ad esempio, nello stack è presente la stringa hello. La biforcazione manterrà la stringa originale e spingerà la stringa invertita. È l'abbreviazione di duplicati e inversi .
Adnan,

Oh, capisco. Freddo! Grazie
Conor O'Brien,

4

Brachylog , 8 byte

↔?|↔;?+↰

Provalo online!

Un po 'simile a uno dei primi programmi di Brachylog che ho visto ed è stato incuriosito dal video introduttivo di 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 caratteri

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

Test:

$ php 196.php <<< 5280
23232

Dovrò ricordare la $str = cosa del gatto per il golf futuro. Diamine molto meglio dell'uso STDINe ancora meglio di $argv[0].
Mr. Llama

@GigaWatt: anche $ s = 'm4' dovrebbe funzionare.
ninjalj,

3

Bash (64)

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

Chiama con: bash <nomefile> <numero>


A cosa serve il <nomefile>?
Eelvex

2
@Eelvex lo script deve richiamare se stesso, quindi è necessario memorizzarlo in un file.
Marin

3

C # - 103 99 caratteri

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

C # non fa mai molto bene nel golf. Elegante, ma prolisso.


1
Puoi facilmente giocare a golf di più. Usa "" + anziché .ToString e sbarazzati di alcuni spazi.
Jacob,

3

In Q (39 caratteri)

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

Esempio di utilizzo:

q)f 5280
23232

Modificare:

Fino a 34 ora, stesso utilizzo:

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


3

Gelatina , 9 byte (non competitiva)

Una risposta molto semplice, solo per la sfida della codifica e del linguaggio esoterico.

ṚḌ+µŒḂ¬$¿

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

Provalo online!

Se questa risposta non fosse chiara o sbagliata a qualsiasi livello, sentitevi liberi di segnalarla.

Grazie a Dennis per avermi aiutato con questo primo piccolo pezzo di codice.


Caspita, non tutti usano Jelly nel loro primo post.
Nissa,

Era nella mia lista delle cose da fare pubblicare una risposta su PPCG usando un linguaggio esoterico. Jelly è stata la prima a cui ho pensato :)
z3r0

2

Pitone. 85 caratteri:

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

Se non si desidera output su ogni iterazione:

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

(un personaggio in meno)


La descrizione dell'attività indica che deve essere stampato solo il palindromo finale.
Joey,

2

Windows PowerShell (63)

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

Lo odio ancora che non esiste un modo semplice per invertire una stringa.


Può essere abbreviato da due caratteri se ci sono solo dieci cifre di input. In questo modo è sicuro anche per longil tipo integrale più grande supportato da PowerShell, ma spreco comunque due caratteri.
Joey,

2

Haskell 89 87 caratteri

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

Versione un po 'leggibile:

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

La versione giocata a golf è stata creata inserendo manualmente e rinominando le restanti funzioni con nomi di singoli personaggi.


1
Puoi accorciarlo un po 'sfruttando la funzione sottoutilizzata untildel Preludio, nonché estraendo lo schema di applicazione di un operatore binario a xe r x. Inoltre, utilizzare al readLnposto di getLinee read. Il risultato salva 20 caratteri:f%x=f x$read.reverse.show$x;main=readLn>>=print.until((==)%)((+)%)
Hammar

@hammar: potresti usare la funzione monade e risparmiare ancora di più: definisci r=(=<<read.reverse.show)e basta usare r(==)`until`r(+). A parte questo salvataggio, non è necessario che sia un programma completo, un invio valido potrebbe essere la funzione senza nome di prima. Questo ti porta a 41 byte: provalo online!
ბიმო

2

befunge, 57 byte

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

sebbene il codice sia inserito in una griglia 4x19, quindi potrebbe chiamarlo 76.

  • la prima riga è l'inizializzazione e la lettura del numero di input
  • la seconda riga inverte il primo numero nello stack e lo mette nella seconda posizione dello stack.
  • e la terza riga controlla se un numero è palindromo.

2

C ++ TMP (256 caratteri)

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

Questa versione potrebbe essere abbreviata un po ', ma è difficile passare una risposta di 256 caratteri. Ecco una versione senza golf:

#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 byte (non competitivo)

D`_b]D$XIsr)h

Provalo qui!

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

2

Aggiungi ++ , 57 byte

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

Provalo online!

Come funziona

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 byte

-1 byte grazie a @AdmBorkBork

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

Script di prova:

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

&$f 5280

1
Non hai bisogno del ;tra param($m)e for.
AdmBorkBork,

2

GNU cc, 46 byte

Richiede GNU dc, versione minima 1.4 (per Rcomando).

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

Input e output sono al top, come al solito. Ci vuole una quantità sorprendente di codice per invertire le cifre in cc (a meno che non mi manchi qualcosa, il che è tutt'altro che impossibile). Ha un intervallo numerico per comportarsi bene con input come questi (che traboccerà, ad esempio, l'aritmetica senza segno a 32 bit):

  • 89 ⇒ 8.813.200.023.188
  • 8997 ⇒ 16.668.488.486.661
  • 10677 ⇒ 4.668.731.596.684.224.866.951.378.664

Spiegazione

# 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


Potrebbe voler specificare che funziona solo su GNU dc 1.4 e versioni successive, poiché utilizza il nuovo Rcomando. Buona soluzione, però!
Sophia Lechner,

Sto lavorando ad un approccio totalmente diverso ma non sono sicuro che finirà più piccolo.
Sophia Lechner,

Grazie Sophia - Non mi ero reso conto che Rfosse nuovo. Non vedo l'ora di vedere il tuo metodo!
Toby Speight,

Ah, no ... Ho provato un approccio diverso per organizzare il circuito esterno ma è finito per circa cinque byte in più e non è più bello. Hai vinto. =)
Sophia Lechner,

2

R , 193 109 105 byte

-84 byte grazie a Giuseppe! -4 ciao grazie a JayCe!

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

Provalo online!


1
Puoi (e dovresti) scegliere un modo diverso di farlo rispetto alla manipolazione delle stringhe, ma qui ci sono alcuni consigli sul golf per il metodo che hai scelto: strsplit(x,"")è più corto di strsplit(x,NULL)ed el(L)è più corto di L[[1]]. as.doubleè più corto di as.numericed strtoiè più corto di entrambi; invece di impostare tbasta usarlo direttamente nella tua ifdichiarazione. anche questa è una funzione ricorsiva se non sbaglio, quindi è necessario inserirla f=come parte della richiesta.
Giuseppe,

@Giuseppe Capito. Grazie per i suggerimenti Continuerò a lavorarci su. Per me è più semplice ottenere qualcosa che funzioni, quindi tornare indietro e ottimizzare.
Robert S.

1
Hehehe, non preoccuparti. Se sei intenzionato a usare le stringhe (o sei costretto dal problema), considera utf8ToIntdi convertire in cifre e intToUtf8riconvertire. Sarà un grande risparmio di byte!
Giuseppe,


1
Salvare altri 4 byte usando -al posto di U. Ho anche sostituito revcon !ma non salva alcun byte ...
JayCe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.