En 4chan, un juego popular es get. Cada publicación en el sitio obtiene una identificación de publicación secuencial. Dado que no puede influir en ellos o determinarlos, las personas intentan adivinar (al menos una parte de) su propio número de publicación, generalmente los primeros dígitos. Otra versión del juego se llama dubs, y su objetivo es obtener dígitos repetidos al final del número (es decir, 1234555).
Su tarea, si desea aceptarla, es escribir un programa que tome una identificación de entrada como entrada (entero estándar, puede suponer debajo de 2 ^ 32), y devuelve cuántos dígitos repetidos hay al final.
Reglas
- Las lagunas estándar no están permitidas .
- El programa puede ser una función, un programa completo, un comando REPL, lo que funcione, realmente, siempre que no se necesiten códigos / argumentos externos sin contar para ejecutarlo.
- La entrada puede provenir de STDIN, argumentos de función, argumento de línea de comando, archivo, lo que más le convenga.
Casos de prueba
Input: 14892093
Output: 1
Input: 12344444
Output: 5
Input: 112311
Output: 2
Input: 888888
Output: 6
Input: 135866667 //Post number I got on /pol/ few days ago, rip
Output: 1
code-golf
number
number-theory
counting
sagiksp
fuente
fuente
Respuestas:
Mathematica, 29 bytes
¿Qué tal una solución aritmética?
Estoy muy contento de ver que esto supera el enfoque directo de Mathematica.
Explicación
El código mismo calcula 9 * n + n% 10 y luego encuentra la mayor potencia de 10 que divide la entrada, o en otras palabras, cuenta los ceros finales. Necesitamos mostrar si n termina en k dígitos repetidos, que 9 * n + n% 10 tiene k ceros al final.
Los dígitos de repetición se expresan matemáticamente más fácilmente dividiendo un número como 99999 (que es 10 5 -1 ) por 9 y luego multiplicándolo por el dígito repetido. Entonces podemos escribir n = m * 10 k + d * (10 k -1) / 9 , donde m ≢ d (mod 10) , para asegurarnos de que n no termine en más de k dígitos repetidos. Tenga en cuenta que d = n% 10 .
Vamos a conectar eso a nuestra fórmula 9 * n + n% 10 . Obtenemos 9 * m * 10 k + d * (10 k -1) + d . La d al final se cancela, por lo que nos queda: 9 * m * 10 k + d * 10 k = (9 * m + d) * 10 k . Pero 9 ≡ -1 (mod 10) , entonces 9 * m + d ≡ d - m (mod 10) . Pero hemos afirmado que m ≢ d (mod 10) y, por lo tanto, d - m ≢ 0 (mod 10) .
En otras palabras, hemos demostrado que 9 * m + d no es divisible por 10 y, por lo tanto, la mayor potencia de 10 que divide 9 * n + n% 10 = (9 * m + d) * 10 k es k , El número de dígitos repetidos finales.
Como
∞
beneficio adicional, esta solución imprime el resultado correcto , como entrada0
.fuente
Retina , 9 bytes
Pruébalo en línea!
Cuenta el número de coincidencias superpuestas, de las
(.)\1*$
cuales es una expresión regular que coincide con un sufijo de caracteres idénticos.fuente
(.)(?=\1*$)
.(?=(.)\1*$)
(básicamente el mismo que el tuyo).Brachylog , 4 bytes
Pruébalo en línea!
Explicación
Si
ḅ
funcionó directamente en enteros (y no estoy seguro de por qué no lo implementé para que lo haga), esto solo sería de 3 bytes, yaẹ
que no sería necesario.fuente
Python 2 ,
4741 bytesPruébalo en línea!
36 bytes: para una entrada más flexible
Pruébalo en línea!
fuente
dir(object)
es nuestro amigo c:Javascript (ES6),
55523230 bytesUsar una expresión regular para que coincida con el último grupo del último dígito
Nota: Publicación por primera vez. No dudes en hacer comentarios.
fuente
/(.)\1*$/
f=
.C,
62564847 bytes¡Ahorré un byte gracias a @Steadybox!
Pruébalo en línea!
fuente
PHP,
474540 bytesCorre con
echo <n> | php -nR '<code>
Parece que un bucle es aún más pequeño que mi primera respuesta. simplemente cuente los caracteres que son iguales al último. Esto utiliza compensaciones de cadena negativas de PHP 7.1 .
-5 bytes por Titus. Gracias !
Vieja respuesta:
elimina de la derecha todos los caracteres que coinciden con el carácter de la derecha y calcula la diferencia en la longitud.
fuente
-R
y$argn
podría ahorrar 5 bytes.05AB1E , 4 bytes
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
CJam , 7 bytes
Pruébalo en línea!
Explicación
fuente
Jalea , 5 bytes
Pruébalo en línea!
Explicación
fuente
Perl 5 , 22 bytes
21 bytes de código +
-p
bandera.Pruébalo en línea!
/(.)\1*$/
obtiene los últimos números idénticos y luego$_=length$&
asigna su longitud a$_
, que se imprime implícitamente gracias a la-p
bandera.fuente
C (gcc) ,
3229 bytesEste es un puerto de mi respuesta de Python .
Esto funciona con gcc, pero la falta de una
return
declaración es un comportamiento indefinido.Pruébalo en línea!
fuente
return
que hace la declaración es almacenar el valor de retorno en EAX. Con gcc, asignarlo a una variable pasa a hacer lo mismo. En cuanto a la aritmética del puntero, cuando agrega 1 a un puntero int, se mueve al siguiente int, no al siguiente byte.Python 2, 51 bytes
Toma un entero como entrada. Pruébalo en línea
48 bytes para la cadena como entrada. Pruébalo en línea
fuente
C # ,
6362 bytesGolfed
Sin golf
Legible sin golf
Código completo
Lanzamientos
- 1 byte
- Gracias al comentario de Kevin .63 bytes
- Solución inicial.Notas
Nada que añadir
fuente
i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}
Python 2 ,
3832 bytes¡Gracias a @xnor por guardar 6 bytes!
Pruébalo en línea!
fuente
MATL ,
65 bytes1 byte guardado gracias a @Luis
Pruébalo en MATL Online
Explicación
fuente
&
hacía esoY'
:-D ¿Por qué no tomar la entrada como una cadena entre comillas y deshacerse de ellaj
?Cubix,
2419 bytesNota
Pruébalo aquí
Explicación
Primero, expandamos el cubo
Los pasos en la ejecución se pueden dividir en tres fases:
Fase 1: entrada
Los dos primeros caracteres que se ejecutan son
A
yB
.A
lee todas las entradas y las envía como códigos de caracteres a la pila. Tenga en cuenta que esto se hace a la inversa, el primer personaje termina en la parte superior de la pila, el último personaje casi en la parte inferior. En el fondo-1
EOF
se coloca ( ), que se utilizará como un contador para la cantidad de caracteres consecutivos al final de la cadena. Como necesitamos que la parte superior de la pila contenga los dos últimos caracteres, invertimos la pila antes de ingresar al bucle. Tenga en cuenta que la parte superior de la pila ahora se ve así:..., C[n-1], C[n], -1
.El lugar de la IP en el cubo es donde
E
está, y apunta a la derecha. Todas las instrucciones que aún no se han ejecutado, fueron reemplazadas por no-ops (paradas completas).Fase 2: Comparación de personajes
La pila es
..., C[a-1], C[a], counter
, dondecounter
está el contador para aumentar cuando los dos caracteres para verificar (C[a]
yC[a-1]
) son iguales. La IP primero ingresa a este bucle en elS
personaje, moviéndose hacia la derecha. ElE
carácter es la posición en la que la IP terminará (apuntando a la derecha) cuandoC[a]
yC[a-1]
no tenga el mismo valor, lo que significa que restarC[a]
deC[a-1]
no produce0
, en cuyo caso!
se omitirá la instrucción que sigue a la (que es aw
).Aquí están las instrucciones que se ejecutan durante un ciclo completo:
Y luego da vueltas.
Fase 3: resultado de la impresión
Desde que salimos del bucle temprano, las miradas se encaja como esto:
counter, ..., C[a-1]-C[a]
. Es fácil imprimir el contador, pero tenemos que incrementar el contador una vez porque no lo hicimos en la última iteración del ciclo, y una vez más porque comenzamos a contar en-1
lugar de0
. El camino en el cubo se ve así, comenzando enS
, apuntando a la derecha. Los dos no-ops que son ejecutados por la IP son reemplazados por flechas que apuntan en la dirección de la IP.Las instrucciones se ejecutan en el siguiente orden. Tenga en cuenta que las
B)
instrucciones al final cambian la pila, pero no afectan el programa, ya que estamos a punto de terminarlo, y ya no usamos la pila.Alea iacta est.
fuente
Lote, 91 bytes
Esto
-
evita que la prueba se ejecute desde el inicio de la cadena.fuente
JavaScript (ES6), 34 bytes
No más corto que la solución regex.
Función recursiva que evalúa los dígitos de derecha a izquierda, deteniéndose cuando se encuentra un dígito diferente. El resultado es el número de iteraciones.
p
estáundefined
en la primera iteración, lo que significan%10-p
devolucionesNaN
(falsedad). Después de eso,p
es igual al dígito anterior conn%10
. Cuando el dígito actual (n%10
) y el anterior (p
) son diferentes, el ciclo finaliza.fuente
Röda , 12 bytes
Pruébalo en línea!
Esta es una función anónima que espera que cada carácter de la cadena de entrada se envíe a la secuencia (creo que esto es válido en espíritu de una meta pregunta reciente ).
Utiliza dos incorporados:
count
ytail
:count
lee valores de la secuencia y empuja el número de elementos consecutivos a la secuencia.tail
devuelve el último valor en la secuencia.fuente
T-SQL,
238214 bytesO:
fuente
Java 7, 78 bytes
Pruébalo aquí
Intenté algunas cosas usando recursividad o un bucle, pero ambas terminaron por encima de los 100 bytes.
fuente
Powershell, 41 bytes
bucle directo hacia atrás hasta que un carácter no coincida con el último carácter de la cadena, devuelva el índice de ese carácter -1.
-3 gracias a @AdmBorkBork - usando un bucle for en lugar de un tiempo.
fuente
Mathematica,
3330 bytesGracias a Greg Martin por guardar 3 bytes.
Toma la entrada como una cadena.
Obtiene los dígitos decimales (en forma de caracteres), los divide en series de elementos idénticos, obtiene la última serie y calcula la longitud con el truco estándar de tomar la suma del vector
1^list
.fuente
Characters
en lugar deIntegerDigits
?Bash + Unix utilidades, 34 bytes
Pruébalo en línea!
fuente
JavaScript (ES6),
39383727 bytesTal vez no sea más corto que la solución basada en expresiones regulares, pero no pude resistirme a escribir una solución completamente basada en aritmética. La técnica consiste en tomar
n % 100 % 11
y dividir repetidamente entre 10 hasta que el resultado no sea cero, luego contar las iteraciones. Esto funciona porque si los dos últimos dígitos son iguales,n % 100 % 11
lo será0
.fuente
f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)
Haskell , 33 bytes
Pruébalo en línea!
Toma entrada de cadena. Corta repetidamente el primer carácter y agrega 1 si todos los caracteres del sufijo son iguales al primero.
fuente
R, 35 bytes
Breve explicacion
fuente
Befunge-98 , 19 bytes
Pruébalo en línea!
Esto podría acortarse si solo lograra usar la pila.
Cómo funciona:
fuente
Python 3 -
5044 bytesPrograma completo (en Python 3,
input()
devuelve una cadena, sin importar la entrada):fuente