Considere tomar un número entero no negativo como 8675309 y calcular los valores absolutos de las diferencias entre todos los pares de dígitos vecinos.
Para 8675309
que obtenemos |8-6| = 2
, |6-7| = 1
, |7-5| = 2
, |5-3| = 2
, |3-0| = 3
, |0-9| = 9
. Encadenación estos resultados juntos produce otro, entero no negativo más pequeño: 212239
. La repetición del proceso da 11016
, entonces 0115
, que según la convención que los ceros iniciales no se escriben se simplifica como 115
, que se convierte en , 04
o 4
que no se puede reducir más. Sumando todos estos valores, obtenemos 8675309 + 212239 + 11016 + 115 + 4 = 8898683
.
Definamos la suma de diferencias de dígitos (o DDS) como esta operación de tomar repetidamente las diferencias de dígitos de un número para formar un nuevo número, y luego agregar todos los números resultantes al original.
Aquí están los primeros 20 valores en la secuencia DDS correspondiente:
N DDS(N)
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 11
11 11
12 13
13 15
14 17
15 19
16 21
17 23
18 25
19 27
Aquí están los primeros 10000 valores , cuyo gráfico es bastante curioso:
Especialmente porque se ve igual cuando lo trazas a 1000 o incluso a 100:
(Yo lo llamaría la escalera del dentista ...)
Reto
Escriba un programa o función que tome un número entero no negativo e imprima o devuelva su valor DDS. Por ejemplo, si la entrada fue 8675309
, la salida debería ser 8898683
.
El código más corto en bytes gana.
fuente
Respuestas:
Pyth, 17
Pruébelo aquí o ejecute Test Suite
Explicación:
fuente
Pitón 2, 73
Afortunadamente, logré evitar cualquier operación de cadena.
g
es la función que calcula la respuesta.fuente
(n-n/10)%10
funcionaría igual quen%10-n/10%10
? O tal vez incluso(9*n/10)%10
?%
es un verdadero operador de módulo, no un resto, por lo que eso no funcionaría.Matlab,
101105bytesMuchas gracias a @beaker por su sugerencia de usar
polyval
en su lugar sibase2dec
. Eso me permitióCódigo:
Ejemplo:
Bonus: base arbitraria
Una pequeña generalización permite usar una base de números arbitraria, no necesariamente decimal:
Base arbitraria de 2 a 10,
108104 bytesLa razón por la que esto funciona solamente para la base hasta
10
es que de Matlabdec2base
utiliza la función dígitos0
,1
, ...,9
,A
,B
, ..., y hay un salto en los códigos de caracteres (ASCII) de9
aA
.Base arbitraria de 2 a 36, 124
146bytesEl salto de
9
a loA
mencionado anteriormente necesita un tratamiento especial. La base máxima es36
según ladec2base
función de Matlab .Así es como las escaleras del dentista buscan diferentes bases:
fuente
CJam,
2221 bytesTenga en cuenta que este programa sale con un error, que está permitido por defecto .
Con el intérprete de Java, los errores se pueden suprimir al cerrar STDERR. Si prueba este código en línea en el intérprete de CJam , ignore todos los resultados antes de la última línea.
Gracias a @ Sp3000 por señalar un error en la revisión original.
Gracias a @ MartinBüttner por jugar golf en 1 byte.
Ejecución de ejemplo
Cómo funciona
A siempre será sincero cuando sea verificado
h
. Sin embargo, una vez que soy un entero de un solo dígito,2ew
fallará con un error después de consumir la matriz en la que se invocó. Esto deja solo el resultado deseado en la pila, que se imprime antes de salir.fuente
Laberinto ,
176134127119103978882797672 bytesGracias a Sp3000 por guardar 1 byte y allanar el camino para 2 más.
Esto probablemente aún podría acortarse, pero bueno, supera a
JavaMatlabPython ...Pruébalo en línea.
Esto termina con un error, pero el mensaje de error se escribe en STDERR (por lo que no lo ve en TIO).
La implementación es bastante sencilla. Agregamos el valor actual a un total acumulado. Si el valor actual era mayor que
9
, calculamos sus dígitos de base 10 (a través de la repetición div-mod) y formamos un nuevo número a partir de las diferencias absolutas. Si llegamos a9
o menos, imprimimos el total acumulado.Los dígitos del número actual se recopilan en la pila auxiliar con el dígito más significativo en la parte superior.
Bueno, la implementación sofisticada
abs(...)
que había hecho aquí resultó ser ridículamente complicada en comparación con la nueva solución ... Agregaré una explicación actualizada cuando termine de jugar al golf.fuente
Java: 300 bytes
Versión de golf
Ungolfed / versión completa
fuente
static
s después de tirar en 3)(a+"")
es generalmente el mismo quea.toString()
, pero más corto 4) No necesita un escáner si es solo una función, simplemente tome mucho tiempo como entrada.long f(long t){long a=t;char[]c;while((c=(a+"").toCharArray()).length>1){String s="";for(int i=0;i<c.length-1;)s+=Math.abs(c[i]-c[++i]);t+=a=new Long(s);}return t;}
Julia,
8160 bytesSin golf:
Pruébalo en línea
Guardado 21 bytes gracias a feersum y Glen O!
fuente
ndigits(n)>1
diferente a lan>9
?int(join(abs(diff(["$n"...]))))
ahorra 9 bytes. Cambie an>9
lo sugerido por feersum para otros 9 bytes guardados. Ahorre tres bytes más realizando ambas asignaciones en el ciclo while en un solo paso (y eliminando el punto y coma adicional, ahora innecesario):n->(s=n;while n>9 s+=n=int(join(abs(diff(["$n"...]))))end;s)
Ok ,
37322423 bytesEn acción:
K5 tiene algunas características que se adaptan bien a esto: "codificar" y "decodificar" pueden realizar una conversión de base, cada par (
':
) empareja elementos secuenciales en una lista y el escaneo de punto fijo (\
) puede producir la secuencia iterada hasta que se detenga cambiando. Sin embargo, la falta de una primitivaabs()
conduce a un volumen desagradable en forma de{(x;-x)x<0}'
.Editar:
En lugar de eso
{(x;-x)x<0}'
, puedo (un poco despilfarro) tomar la raíz cuadrada del cuadrado de la secuencia ({%x*x}
ahorrando 5 bytes.Edición 2:
Inspirado por la solución APL de @maurinus, puedo reemplazar la "decodificación" (
((#$x)#10)\x
) con la evaluación de cada carácter de la representación de cadena del número-.:'$x
! Esto también me permite usar una forma tácita de toda la expresión, guardando caracteres adicionales.fuente
Python 2, 87 bytes
Agrega recursivamente el número actual y toma las diferencias de dígitos. Mucha conversión entre números y cadenas. Probablemente se puede mejorar.
fuente
Julia,
5548 bytesSin golf:
Esencialmente, esto se repite hasta el nivel de un solo dígito (donde no se puede realizar ninguna diferencia de dígitos), luego se vuelve a sumar a medida que sale de la recursión, nivel por nivel.
fuente
Haskell, 140 bytes
d
hace el trabajo.¿Alguien sabe cómo evitar importar las funciones de conversión largas?
fuente
intToDigit
estoEnum.(+48)
ydigitToInt
es(\i->fromEnum i-48)
. También se puede activars
a una versión con pointfree=<<
en el contexto de lista:s=snd.span(==0).m abs.(zipWith(-)=<<tail)
. Finalmente,(==0)
es(<1)
porque estamos trabajando con enteros no negativos.s
tiene puntos, no hay necesidad de ponerle un nombre. Llámalo directamente:iterate(snd.span ... tail))
=<<
se usa en el contexto de la función, no en el contexto de la lista, lo siento.NoMonomorphismRestriction
también me dejará tener un puntod
libre.chr
yord
están ambos adentroData.Char
, así que no puedes omitir elimport
. Los indicadores del compilador también se cuentan como bytes, por lo queNoMonomorphismRestriction
aumenta su puntuación en 25.K5, 50 bytes
fuente
APL (22)
Explicación:
⍵≤9:⍵
: si ⍵ ≤ 9, devuelve ⍵ sin cambios.⍎¨⍕⍵
: convierte ⍵ a una cadena, luego evalúa cada carácter2-/
: resta cada dos números adyacentes|
: tomar los valores absolutos10⊥
: convierte la matriz en un número base 10⍵+∇
: llame a la función recursivamente con este nuevo valor y agregue el resultado a la entradafuente
Mathematica,
726965 bytesEstoy abierto a sugerencias aquí.
fuente
Tr@FixedPointList[FromDigits@*Abs@*Differences@*IntegerDigits,#]&
JavaScript ES6, 73 bytes
Esto no se está acortando: / Intentaré más enfoques, pero este es el más corto hasta ahora
fuente
t
sigue siendo válido y le ahorra 2 bytes.JavaScript (ES6), 69
Pruebe a ejecutar el fragmento a continuación en un navegador compatible con EcmaScript 6 (pero no Chrome, ya que todavía no es compatible con el operador de propagación
...
) ¿Quizás MS Edge?Alternativa, utilizando la comprensión de matriz que ahora está dirigida a EcmaScript 2016 (ES7), 67 bytes:
fuente
Python 3, 125 bytes
Me gustaba la brevedad de la expresión regular hasta que intenté usarlo para este desafío ... no
re.findall('\d\d',s,overlapped=True)
está activado ;)Saludos @Todd :)
fuente
J, 70 bytes
fuente
C 162 bytes
golfizado:
sin golf:
fuente
R, 134 bytes
Código
Pruébalo en línea .
Sin golf
Aquí está la gráfica de la diferencia de la serie "Suma de diferencia de dígitos de un número" de f (1) a f (1m). Solo porque me encanta diferir.
Código de trama
fuente
MATLAB
(141)(137)El programa está sumando dígitos de la misma fila antes de los dígitos en línea, significa que usó la división entera "n / 10" log_10 (n) veces solamente, la complejidad es O (N).
Si
n= a b c d
Mi programa calcula:
Uso:
a =
1
fuente
,end
de lafunction
declaración.Prólogo, 143 bytes
Código:
Explicado:
q realiza los cálculos que convierten un número en su diferencia de dígitos.
r llama recursivamente q y resume los resultados para encontrar la suma de diferencia de dígitos.
p es el punto de entrada. Toma un número, llama a r e imprime la respuesta.
Ejemplo:
Pruébelo en línea aquí .
fuente
PHP - 198 bytes
Sin golf
fuente
Perl 6 , 56 bytes
uso:
fuente