196 algoritmo de código de golf

35

Escriba un programa corto para el algoritmo 196 . El algoritmo comienza desde un número entero, luego le agrega su reverso hasta que se alcanza un palíndromo.

p.ej

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

Entrada

un número entero, que no es un número de lyrchrel (es decir, eventualmente produce un palíndromo bajo este algoritmo, en lugar de continuar infinitamente)

Salida

el palíndromo alcanzó.

Eelvex
fuente
66
Porque su pregunta es probablemente la única que involucra el algoritmo 196. Hacer etiquetas de un solo uso no es útil.
Chris Jester-Young
2
Lo que quería decir, su pregunta es probable que sea el único que jamás involucrar este tema, incluso en 2 años. :-)
Chris Jester-Young
1
@Chris: Bueno, el algoritmo 196 es bastante popular y tiene muchos nombres diferentes. Sin embargo, solo para estar seguro, publicaré otra pregunta al respecto antes de que transcurran los 2 años;)
Eelvex
1
@GigaWatt también, había leído mal su primera pregunta :) Simplemente no se moleste con el caso de A023108s.
Eelvex
1
@Joel, como con A023108, simplemente ignóralos (actúa como si no supieras sobre ellos); No sabemos si existe de todos modos.
Eelvex

Respuestas:

10

APL (22 caracteres)

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

Esto funciona en Dyalog APL. Aquí hay una explicación, de derecha a izquierda:

  • { ... }⍞: Obtenga la entrada del usuario como caracteres ( ) y aliméntelo a nuestra función ( { ... }).
  • Dentro de la función directa ( separa las declaraciones, por lo que las miramos de izquierda a derecha):
    • a≡⌽a←⍕(⍎⍵)+⍎⌽⍵ : a: Evalúe ( ) el argumento correcto ( ) reverse ( ), y agregue eso a la versión evaluada del argumento correcto en sí. Luego, formatee el resultado ( ; es decir, dé su representación de caracteres), asígnele ( ) eso a la variable a, y finalmente pruebe si ael reverso es equivalente a a(es decir, ¿es aun palíndromo?). Si es cierto, regrese a; de otra manera...
    • ∇a: Retroalimente anuestra función ( es una referencia propia implícita).

Ejemplo:

      {a≡⌽a←⍕(⍎⍵)+⍎⌽⍵:a⋄∇a}⍞
412371
585585
Dillon Cower
fuente
2
Guarda algunos caracteres para usar la entrada numérica. {⍵=A←⍎⌽⍕⍵:⍵⋄∇A+⍵}⎕. Guarda las llaves, un reverso y una evaluación.
marinus
10

GolfScript, 29 caracteres

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

Comentario seleccionado

La carne del programa es el dociclo, por supuesto. Así que solo cubriré eso.

  1. .` copia el número y lo stringifica.
  2. .-1% copia esa versión de cadena y la invierte.
  3. .@ copia la versión invertida y trae la versión original no invertida al frente.

Así, por ejemplo, el número es 5280. En esta etapa, la pila es: 5280 "0825" "0825" "5280". El escenario está preparado para la comparación. (Después de la comparación, la pila se dejará en 5280 "0825"cualquier lugar --- los elementos para comparar se han eliminado).

  1. Si la cadena y el reverso son iguales, no nos importa la cadena revertida, así que simplemente desactívela ( ;) y devuelva 0 (para finalizar el dociclo).
  2. Si no coinciden, evalúe ( ~) la cadena invertida (para convertirla en un número), agregue ( +) eso al número original y devuelva 1 (para continuar el dociclo).
Chris Jester-Young
fuente
44
¿Estás seguro de que no presionaste teclas aleatorias en tu teclado? Se ve así ...
1
@ M28: GolfScript se parece aún más al ruido de línea que Perl, ¿no? ;-)
Chris Jester-Young
Lo siento por ti, debe ser doloroso codificar eso
@ M28: Eso no fue tan doloroso como la solución que escribí para el algoritmo de Luhn . Solo piensa en eso. :-P
Chris Jester-Young
Su familia está preocupada por usted
10

Python 2, 55 bytes

Siguiendo la sugerencia de 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
Alexandru
fuente
Jeje ..))))))))
Nakilon
2
Al mirar ncomo int puede acortar 6 caracteres, verifique el código: meta.codegolf.stackexchange.com/q/75/62
JPvdMerwe
Parece que accidentalmente incluí la nueva línea vim agregada furtivamente al final de mi archivo a mi cuenta. El recuento real es 55.
JPvdMerwe
7

Ruby - 56 caracteres

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

Solo ejercito mis habilidades de Pyth, no un contendiente serio

Pyth, 16 bytes

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())
swstephe
fuente
Solo estoy probando algunos viejos desafíos, ya respondidos, por lo que no soy un contendiente serio.
swstephe
1
Algunos autores del desafío actualizarán la respuesta aceptada si se presentan soluciones más cortas, por lo que creo que es justo informar al OP, que técnicamente no es una presentación válida. (No me malinterpreten, también me gusta responder a los viejos desafíos con CJam por diversión, y lo hice hace unos minutos. Solo digo, si lo hacen, dejen una nota, que el idioma es más nuevo que el desafío.)
Martin Ender
En realidad, "no ser un contendiente serio" hace que una respuesta esté sujeta a eliminación, pero no veo ninguna razón para que esto no se considere un contendiente serio.
pppery
6

J 25 27 31

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

CJam, 22 21 bytes

CJam se creó después de esta pregunta, por lo que técnicamente es un envío no válido. Pero la pregunta me pareció interesante, así que aquí va:

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

Explicación:

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 lógica central es que en cada iteración while-do, primero verifica si se alcanza el palíndromo o no. Si no, agregue el reverso al número. ¡Más o menos lo que es el algoritmo!

Pruébalo en línea aquí

Optimizador
fuente
5

Este es un contendiente real, ya que J ha existido durante décadas.

J (16 bytes)

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

Este es un verbo, por lo que puede asignarse a una variable en una sesión J y usarse así:

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

Cómo funciona:

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

Python: 66

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

Perl, 40 caracteres

$_=<>;$_+=$r while$_!=($r=reverse);print
ninjalj
fuente
Sé que esta es una publicación muy antigua, pero algunos cambios pueden reducir esto a 26 bytes: ¡ Pruébelo en línea!
Dom Hastings
4

Scala 82

def p(n:Int):Int={val s=n.toString.reverse.toInt
if(n==s)n else p(n+s)}
p(readInt)
usuario desconocido
fuente
4

JAGL Alpha 1.2 - 19, 21 con stdin

No contendiendo , solo obteniendo algo de experiencia con mi idioma
Espera un número de stdin

T~d{DddgCi+dgdC=n}uSP

Explicación

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
globby
fuente
Editado @Optimizer
globby
No edite todas sus presentaciones a la vez para modificaciones menores (como un número de versión), ya que esto satura innecesariamente la portada. Está bien si haces 2 o quizás 3 a la vez, pero espera unas horas antes de hacer ediciones más sistemáticas.
Martin Ender
Olvidé que empujaría a la primera página, mi mal. @ MartinBüttner
globby
4

05AB1E , 7 bytes (no competitivos)

No competitiva , ya que el lenguaje es posterior al desafío.

Código:

[DÂQ#Â+

Explicación:

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

Utiliza la codificación CP-1252 . Pruébalo en línea! .

Adnan
fuente
¿Podría explicar un poco más sobre el proceso de bifurcación?
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Por ejemplo, en la pila está la cadena hello. La bifurcación mantendrá la cadena original y empujará la cadena hacia atrás. Es la abreviatura de duplicar y revertir .
Adnan
Oh ya veo. ¡Guay! Gracias
Conor O'Brien
4

Brachylog , 8 bytes

↔?|↔;?+↰

Pruébalo en línea!

Algo similar a uno de los primeros programas de Brachylog que vi y que me intrigó, del video introductorio de 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
sundar - Restablece a Monica
fuente
3

PHP - 54 48 caracteres

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

Prueba:

$ php 196.php <<< 5280
23232
Arnaud Le Blanc
fuente
Voy a tener que recordar lo del $str = gato para el futuro golf. Mucho mejor que usar STDINy aún mejor que $argv[0].
Sr. Llama
@GigaWatt: $ s = 'm4' también debería funcionar.
ninjalj
3

Golpe (64)

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

Llamar con: bash <nombre de archivo> <número>

marinus
fuente
¿Para qué es el <nombre de archivo>?
Eelvex
2
@Eelvex el script debe llamarse a sí mismo, por lo que debe almacenarlo en un archivo.
marinus
3

C # - 103 99 caracteres

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

C # nunca funciona muy bien en el golf. Elegante, pero detallado.

KeithS
fuente
1
Puedes jugar golf más fácilmente. Use "" + en lugar de .ToString y elimine algunos espacios.
Jacob
3

En Q (39 caracteres)

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

Uso de muestra:

q)f 5280
23232

Editar:

Hasta 34 ahora, mismo uso:

{while[x<>g:"I"$(|) -3!x;x+:g];x} 5280
sinedcm
fuente
3
r=input()
while 1:
    r=`r`
    if r==r[::-1]:
      break
    else:
      r=int(r)+int(r[::-1])

print r
Ashwini Chaudhary
fuente
3

Gelatina , 9 bytes (no competitiva)

Una respuesta muy simple, solo para el desafío de la codificación y el lenguaje esotérico.

ṚḌ+µŒḂ¬$¿

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

Pruébalo en línea!

Si esta respuesta no es clara o incorrecta en algún nivel, no dude en señalarla.

Gracias a Dennis por ayudarme con este primer pequeño código.

z3r0
fuente
Wow, no todos usan Jelly en su primera publicación.
Nissa
Estaba en mi lista de tareas para publicar una respuesta en PPCG usando un lenguaje esotérico. Jelly resultó ser el primero en el que pensé :)
z3r0
2

Pitón. 85 caracteres:

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

Si no desea resultados en cada iteració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

(un personaje menos)

Thomas O
fuente
La descripción de la tarea indica que solo se debe imprimir el palíndromo final.
Joey
2

Windows PowerShell (63)

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

Todavía odio que no haya una manera fácil de invertir una cadena.

Joey
fuente
Se puede acortar en dos caracteres si solo hay diez dígitos de entrada. De esta manera, también es seguro para longcuál es el tipo integral más grande que PowerShell admite de todos modos, pero aún así, desperdicio dos caracteres.
Joey
2

Haskell 89 87 caracteres

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

Versión algo legible:

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 versión de golf fue creada mediante la incorporación manual y el cambio de nombre de las funciones restantes a nombres de caracteres individuales.

sepp2k
fuente
1
Puede acortar esto bastante aprovechando la función infrautilizada untildel Preludio, así como extrayendo el patrón de aplicar un operador binario a xy r x. Además, use en readLnlugar de getLiney read. El resultado ahorra 20 caracteres:f%x=f x$read.reverse.show$x;main=readLn>>=print.until((==)%)((+)%)
hammar
@hammar: podría usar la función mónada y ahorrar aún más: definir r=(=<<read.reverse.show)y simplemente usar r(==)`until`r(+). Además de ese ahorro, no es necesario que sea un programa completo, un envío válido podría ser la función sin nombre de antes. Esto lo reduce a 41 bytes: ¡ Pruébelo en línea!
ბიმო
2

befunge, 57 bytes

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

aunque el código se coloca en una cuadrícula de 4x19, podría llamarse 76.

  • la primera línea se está inicializando y leyendo el número de entrada
  • la segunda línea invierte el primer número en la pila y lo coloca en la segunda posición de la pila.
  • y la tercera línea verifica si un número es palíndromo.
Ali1S232
fuente
2

C ++ TMP (256 caracteres)

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

Esta versión podría acortarse un poco, pero es difícil dejar pasar una respuesta de 256 caracteres. Aquí hay una versión sin 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;
}
Dillon Cower
fuente
2

Pyke, 13 bytes (sin competencia)

D`_b]D$XIsr)h

Pruébalo aquí!

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

Agregar ++ , 57 bytes

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

Pruébalo en línea!

Cómo funciona

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]
caird coinheringaahing
fuente
2

Powershell, 63 62 bytes

-1 byte gracias a @AdmBorkBork

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

Script de prueba:

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

&$f 5280
mazzy
fuente
1
No necesitas el ;entre param($m)y for.
AdmBorkBork
2

GNU dc, 46 bytes

Requiere GNU dc, min versión 1.4 (para Rcomando).

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

La entrada y la salida son las mejores, como de costumbre. Se necesita una cantidad sorprendente de código para invertir los dígitos en CC (a menos que me falte algo, lo que está lejos de ser imposible). Tiene el rango numérico para comportarse bien con entradas como estas (que desbordarán la aritmética sin signo de 32 bits, por ejemplo):

  • 89 ⇒ 8.813.200.023.188
  • 8997 ⇒ 16,668,488,486,661
  • 10677 ⇒ 4,668,731,596,684,224,866,951,378,664

Explicación

# 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
Toby Speight
fuente
Pruébalo en línea! (Javascript)
Toby Speight
Es posible que desee especificar que esto solo funciona en GNU dc 1.4 y posterior, ya que utiliza el nuevo Rcomando. Buena solución, sin embargo!
Sophia Lechner
Estoy trabajando en un enfoque totalmente diferente, pero no estoy seguro de que terminará siendo más pequeño.
Sophia Lechner
Gracias Sophia, no me había dado cuenta de que Rera nuevo. ¡Espero ver tu método!
Toby Speight
Ah, no ... Intenté un enfoque diferente para organizar el bucle externo, pero terminó siendo aproximadamente cinco bytes más grande y no más bonito. Tú ganas. =)
Sophia Lechner
2

R , 193 109 105 bytes

-84 bytes gracias a Giuseppe! -4 adios gracias a JayCe!

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

Pruébalo en línea!

Robert S.
fuente
1
Puede (y debe) elegir una forma diferente de hacerlo que la manipulación de cuerdas, pero aquí hay algunos consejos de golf para el método que ha elegido: strsplit(x,"")es más corto strsplit(x,NULL)y el(L)más corto que L[[1]]. as.doublees más corto que as.numericy strtoies más corto que ambos; en lugar de configurarlo, túsalo directamente en tu ifestado de cuenta. Además, esta es una función recursiva si no me equivoco, por lo que debe incluirla f=como parte de su envío.
Giuseppe
@Giuseppe lo tengo. Gracias por los consejos. Seguiré trabajando en esto. Es más fácil para mí obtener algo que funciona y luego volver y optimizar.
Robert S.
1
Jejeje, no te preocupes. Si está empeñado en usar cadenas (o si el problema lo obliga), considere utf8ToIntconvertir a dígitos y intToUtf8volver a convertir. ¡Eso será un gran ahorro de bytes!
Giuseppe
1
Ahorre 4 bytes más utilizando -en lugar de U. También he sustituido revcon !pero no guarda los bytes ...
Jayce