En honor a la repetición que tuve hace varias horas, cuando pensé por primera vez en este desafío:
Los números como este que se componen de un solo dígito que se repite se llaman repdigits . ¡Los repdigits son divertidos! Todo el mundo sería más feliz si la cantidad de repeticiones que tenían era un repdigit ¹ , pero estoy impaciente, por lo que necesita para ayudar a encontrar el camino más rápido para llegar a un repdigit.
Aquí está tu desafío:
Dado un número entero positivo que representa la reputación, genere la cantidad mínima de repeticiones que necesitan ganar para llegar a un digito de rep . Por ejemplo, al momento de escribir este desafío, el usuario Martin Ender tenía 102,856 rep. El dígito de rep más cercano es 111,111, por lo que necesitaría ganar: 8255 rep para estar en un repdigit.
Dado que a las personas no les gusta perder reputación, solo consideraremos cambios no negativos. Esto significa que, por ejemplo, si alguien tiene 12 repeticiones, en lugar de perder 1 repetición, la solución es ganar 10 repeticiones. Esto permite que '0' sea una salida válida, ya que cualquiera que tenga 111 rep ya está en un repdigit.
La entrada y la salida pueden estar en cualquier formato razonable , y dado que es imposible tener menos de 1 repetición en cualquier sitio de Stack Exchange, puede asumir que ninguna entrada será menor que 1.
Una esquina para tener en cuenta:
Si un usuario tiene menos de 10 rep, ya está en un digito de rep, por lo que también necesita '0'.
Prueba IO:
#Input #Ouput
8 0
100 11
113 109
87654321 1234567
42 2
20000 2222
11132 11090
Se aplican lagunas estándar, ¡y gana la solución más corta en bytes!
110
lo tanto, debería dar1
, a pesar de que no hay una manera de ganar una repetición.Respuestas:
Jalea , 6 bytes
La salida es una matriz singleton.
Pruébalo en línea! o verificar la mayoría de los casos de prueba . El caso de prueba 87654321 es demasiado lento para TIO.
Cómo funciona
fuente
Haskell, 39 bytes
Pruébalo en línea
fuente
Brachylog , 9 bytes
Pruébalo en línea!
Esto es bastante eficiente ya que utiliza restricciones aritméticas.
Explicación
fuente
This is the answer you're looking for. Figure it out for me
:)call_reside_vars/2
, busque las variables CLP (FD) y etiquételas. Por ejemplo:call_residue_vars(Program, Vs0), include(fd_var, Vs0, Vs), label(Vs)
. ¿Qué piensas?Python 2,
4140 bytesNo es el enfoque más corto, pero muy eficiente. Pruébalo en Ideone .
Cómo funciona
Para
10**len(`n`)
rondas de entrada n hasta la potencia más cercana de 10 . Luego, dividimos el resultado entre 9 . Esto devuelve el repdigit 1 ... 1 que tiene tantos dígitos como n . Guardamos el resultado en r . Por ejemplo, si n = 87654321 , entonces r = 11111111 .El repdigit deseado será un múltiplo o r . Para decidir cuál, realizamos la división del techo de n por r . Desde los
/
pisos de operador de división de Python 2 , esto se puede lograr con-n/r
, lo que arrojará el valor absoluto correcto, con signo negativo. Por ejemplo, si n = 87654321 , esto devolverá -8 .Finalmente, multiplicamos el cociente calculado por -r para repetir el cociente una vez por cada dígito en n . Por ejemplo, si n = 87654321 , esto devuelve 88888888 , que es el digito deseado.
Finalmente, para calcular el incremento requerido, restamos n del resultado anterior. Para nuestro ejemplo n = 87654321 , esto devuelve 1234567 , como se desee.
fuente
lambda n:10**len(`n`)/9*-~int(`n*9`[0])-n
. Casi funcionalambda n:int(`n*9`[0]*len(`n`))-n
, pero el dígito es demasiado pequeño y no veo una buena manera de solucionarlo.O(1)
.O(1)
, pero supongo que tiene sentido.Python 2, 37 bytes
Pruébalo en Ideone . Tenga en cuenta que este enfoque es demasiado ineficiente para el caso de prueba 87654321 .
Cómo funciona
Si n ya es un repdigit,
1-len(set(`n`))
devolverá 0 ya que la longitud del conjunto de dígitos de n en la base 10 será 1 . En este caso, f devuelve 0 .Si n no es un repdigit,
f(n+1)
recurrentemente llama f con el siguiente valor posible de n .-~
incrementos el valor de retorno de f ( 0 cuando se encuentra una repdigit) por 1 cada vez que f se llama de forma recursiva, por lo que el valor de retorno final es igual al número de veces f que se ha llamado, es decir, el número de veces n tuvieron que ser incrementado a obtener un repdigit.fuente
L
largos necesitan ser manejados.-~
permite que la función para contar el número de llamadas que hizo.Perl 6 , 23 bytes
Una lambda que toma el número de entrada como argumento y devuelve el resultado.
Explicación:
...
operador de secuencia para incrementar el número de entrada hasta que alcanza un dígito repetido (probado al dividir su representación de cadena en caracteres y ver si son todos iguales) .fuente
/(.)$0*/
Java 7,
11676 bytesSe utilizó el sorprendente enfoque de @Dennis para reducir el conteo de bytes en la friolera de 40 bytes.
Sin golf y casos de prueba:
Pruébalo aquí.
Salida:
fuente
2222
y la cuarta salida12345678
?2222
lugar de222
. Solucioné un error en el código, pero por accidente todavía usé la salida anterior aquí. Ya está arreglado. En cuanto al cuarto, no, debería serlo123467
(como también se puede ver en la pregunta de OP).Pyth,
987 bytes1 byte gracias a @FryAmTheEggman.
Pruébalo en línea.
Muy ineficiente, recorre todos los números desde la entrada hasta el siguiente repdigit.
fuente
Brain-Flak
690358bytesAquí está mi intento
Pruébalo en línea
Explicación
Comience por hacer una segunda copia de la entrada que sea una menos que la original. Usaremos la copia para buscar el próximo repdigit. Restamos uno en caso de que el número en sí fuera un digito
Presione uno para satisfacer el bucle que viene. (no tiene que ser uno simplemente no cero)
Este bucle se ejecutará hasta que haya un dígito en la parte superior de la pila.
Pop the crap. Su es un "booleano" en la parte superior que impulsa el bucle, ya que ya no es necesario lo sacamos.
Agrega uno y duplica la parte superior. La copia se descompondrá en sus dígitos.
Si bien la copia no es cero ...
Copiar de nuevo
Mod 10 y muévete a la otra pila
Dividir por 10 (división entera)
Pop the zero que era nuestra copia
Ahora hemos descompuesto el número en su base de 10 dígitos, por lo que cambiamos a la pila con todos los dígitos.
Mientras que el dígito inicial no es cero
Recogemos una copia de la altura de la pila (es decir, el número de dígitos) ...
Silenciosamente reste uno de cada número en la pila
Ponga la altura de la pila que recogimos. (y cambiar a la otra pila)
Usamos la altura de la pila para volver a colocar todos los dígitos que colocamos en la otra pila en la pila adecuada.
Pop el cero que era nuestra altura de pila
Vuelva a cambiar a la pila con los dígitos (o cuáles fueron los dígitos)
Bucle final
Ahora hemos restado el dígito superior de todos los otros dígitos. Si todos los dígitos son cero, el número original (no la entrada sino el número que estamos verificando) fue un digito. [cita requerida] . Por lo tanto, debemos verificar que no sean ceros.
Mientras que la altura de la pila no es cero
Si el dígito no es cero, muévalo a la otra pila y reemplácelo con un cero.
Pop it (ahora es un cero)
Bucle final
Cambia a la otra pila (duh ..)
Tome una copia de la altura de la pila menos dos
Mientras que la altura de la pila no es dos (el original y el acumulador)
Pop the top
Termina el rato
Anote nuestra copia de la altura de la pila menos dos. Esto termina siendo el número de dígitos que no son iguales al primer dígito. En otras palabras, si es cero, es un digito.
Si este ciclo termina, hemos encontrado un repdigit
Pop el "booleano"
Resta el original del repdigit
fuente
Python 2, 52 bytes
Python 2 tiene varios trucos que lo hacen más corto. Por ejemplo, la entrada es numérica, por lo que no necesitamos convertir a int. (-5 bytes) Tampoco necesitamos poner paréntesis alrededor del
a-b
(-1 byte)Use este script para verificar todos los casos de prueba:
¡También puedes probarlo en línea!
fuente
GNU sed, 223 + 1 (r flag) = 224 bytes
Correr:
Salida:
Esta es una solución sed pura , la aritmética se simula utilizando solo expresiones regulares. El algoritmo funciona de la siguiente manera:
^current_reputation:needed_reputation%$
a)
%:
se aplica el incremento a needed_reputationb)
:%
se aplica el incremento a current_reputationfuente
Java,
7472 bytes(Si la otra entrada de Java tiene 76 bytes, esta es
7472, ya que esdoscuatro bytes más cortos).De todos modos, solo incremente la entrada hasta que sea un dígito de repetición mientras incrementa un contador. Devuelve el mostrador.
Sí, son tres más en una fila, dos para incrementar la entrada, una para concatenar una cadena vacía para convertirla en una cadena.
No, tampoco pensé que sería legal sin un espacio intermedio, pero ahí lo tienes. Eso es lo que un error tipográfico hará por usted: un byte más corto.
Usar un bucle for en lugar de un tiempo requiere exactamente la misma cantidad de bytes:
Editar:
Una versión anterior tenía
matches("^(\\d)\\1*$")
que verificar un repdigit, pero como acabamos de convertir un int en una cadena,.
basta con usar un para que coincida.Sin golf y casos de prueba:
Pruébalo aquí.
}
Salida:
fuente
R,
1029891 bytesSin golf:
Jugar con el formato (
) agrega algunos bytes, ¡pero R no es realmente flexible!as.numeric
yas.character
fuente
Perl, 40 + 1 (
-n
) = 41 bytesSi no se imprime nada en lugar de
0
cuando el número ya es un digito de repetición, entonces 37 bytes son suficientes:Ejecutar con
-n
(1 byte) y-E
o-M5.010
(gratis):Explicaciones : hay dos partes principales en el código:
/^(.)\1*$/&&say$v
y$_++&&++$v&&redo
. La primera prueba si$_
es un repdigit; en caso afirmativo, imprime el número que agregamos al número original para que sea un repdigit ($v
), y si no, teníamos 1 para ambos$_
y$v
, y comenzamos de nuevo.fuente
perl -pe '@x=sort/./g;//;$_=(($x[-1]>$&)+$&)x+@x-$_'
JavaScript (ES6), 42 bytes
Explicación: Calcula recursivamente
p
como la próxima potencia de10
aftern
. El dígito que se repetirá se calcula como1+floor(9n/p)
, y la repunidad es simplemente(p-1)/9
, de donde se deriva el resultado.fuente
05AB1E ,
106 bytesPruébalo en línea!
Explicación
fuente
§
y cambiar¹-
aα
. Y aquí una alternativa bastante similar de 8 bytes:∞+.ΔÙg}α
Pyke,
1311 bytesPruébalo aquí!
fuente
En realidad, 15 bytes
Pruébalo en línea!
Explicación:
fuente
Medusa , 20 bytes
Pruébalo en línea! TIO no puede manejar los casos de prueba más largos, pero dado suficiente tiempo y memoria, también deberían funcionar.
Explicación
i
es entrada, y lo<
disminuye. Este valor se alimenta a la función de la izquierda.\>
incrementa el valor (al menos una vez) hasta que la función a la derecha da un valor verdadero.&
s) de cuatro funciones.0~j
se convierte en cadena.u
elimina dígitos duplicados.>
elimina la cabeza de la cadena resultante.N
es negación lógica: da1
una cadena vacía y0
no vacía. Por lo tanto, la función prueba un dígito rep, y el resultado de\
es el siguiente recuento de dígitos rep<i
.)-
resta el resultado de la entrada de la función, es decir,<i
.<
disminuye. Finalmente,p
imprime el resultado.fuente
PowerShell v2 +, 66 bytes
El lanzamiento de PowerShell, que generalmente es bueno para el golf, es una gran desventaja aquí.
Toma la entrada
$n
como una cadena y entra en unfor
bucle. Para el paso de configuración, extraemos el primer carácter$n[0]
, pero tenemos que convertirlo de nuevo en una cadena"$(...)"
antes de convertirlo en int+
y guardarlo en$x
. De lo contrario, la aritmética posterior utilizará el valor ASCII del código de caracteres.El condicional verifica si una cadena construida a partir de
$n.length
"$x"
s, almacenada temporalmente en$y
, es menor que$n
. Mientras no sea así, incrementamos$x++
, configurando el condicional para el siguiente ciclo.Por ejemplo, para la entrada
123
, el valor de$y
cuando el condicional se verifica por primera vez será111
, que es menor que$n
, por lo que el ciclo continúa. No hay nada en el cuerpo del bucle, por lo que ocurre el incremento de paso$x++
, luego se vuelve a verificar el condicional. Esta vez$y
es igual222
, que es mayor que$n
, entonces el ciclo termina. Si la entrada ya es un repdigit, el condicional no se cumple, porque en ese punto$y
es igual a$n
.Una vez fuera del ciclo, convertimos
$y
a un entero+
, luego restamos$n
. Ese resultado se deja en la tubería y la salida es implícita.fuente
PHP 5.6,
59535150 bytesGuardado
68 bytes gracias a @manatwork.Prueba con:
La
count_chars()
función con 3 como segundo parámetro devuelve una cadena con los distintos caracteres en una cadena. Cuando esta cadena tiene 1 carácter de longitud ([1]
devolverá falso cuando es longitud 1), luego repita$b
, de lo contrario incremente$b
y repita nuevamente.fuente
count_chars()
. ¿Qué pasa con 3 como parámetro $ mode? Por lo que esta sería lawhile
condición:count_chars($argv[1]+$b,3)[1]
.count
ostrlen
resultó ser de la misma longitud.echo$b?:0;
MATL , 10 bytes
Pruébalo en línea!
Esto sigue incrementando la entrada hasta que todos los dígitos sean iguales, por lo que es lento. El caso de prueba para la entrada
87654321
agota el tiempo en el compilador en línea.fuente
Ruby, 42 caracteres.
Espera entrada de cadena.
Ejecución de muestra:
Ruby, 39 caracteres
Llamada recursiva, se encuentra con "SystemStackError: nivel de pila demasiado profundo" en resultados más grandes.
Ejecución de muestra:
fuente
Matlab,
6564 bytesDebido al ciclo while es bastante lento ...
Explicación
Ahorrando un byte gracias a @Luis Mendo .
fuente
+0
?diff
arroja automáticamente caracteres a los númerosdiff
trata la cadena como sym e intenta diferenciarla.Excel,
8579 bytesPonga la siguiente fórmula en cualquier celda, excepto en la celda,
N
ya que es un nombre para la celda de referencia de entrada:Explicación:
N
es la entrada y también el nombre de la celda de referencia .LEFT(N)
tome el primer dígito del valor de entrada.LEN(N)
Devuelve la longitud del valor de entrada.REPT(LEFT(N),LEN(N))
repita el primer dígito de los valores de entradaLEN(N)
y multiplíquelo por 1 para convertir el formato de texto a formato de número para que podamos usarlo para la comparación de números.fuente
Num_chars
enLEFT
y guardar 4 bytes:LEFT(N)
IF
condición en1
o0
usando,--
por lo tanto, no necesita repetirse solo para+1
:=REPT(LEFT(N)+(--1*(REPT(LEFT(N),LEN(N)))<N),LEN(N))-N
=REPT(LEFT(N)+(1*(REPT(LEFT(N),LEN(N)))<N),LEN(N))-N
ahorrando 27 bytes para obtener un total de 52.Brachylog v2, 6 bytes
Pruébalo en línea!
El byte de 5 bytes
+↙.=∧
se sale con la omisiónℕ
porque no prueba salidas no positivas en absoluto, pero también falla cuando se le da un número que ya es un digito porque no prueba salidas no positivas en absoluto.fuente
Java, 59 bytes
(Todavía no estoy seguro de cómo contar las entradas de Java, pero de acuerdo con el estándar establecido por la primera entrada de Java , esta entrada es de 59 bytes, ya que es 17 bytes más corta).
De todos modos, si tenemos un repdigit, devuelve 0, de lo contrario agregue 1 a la entrada, llámese a sí mismo y agregue 1 al resultado.
Sin golf y casos de prueba:
Pruébalo aquí.
Salida:
Como puede ver, la última entrada se queda sin memoria antes de que pueda terminar. Se
StackOverflowError
arroja el (muy apropiado)java.util.regex.Pattern.sequence(Pattern.java:2134)
, pero estoy bastante seguro de que no hay nada de malo en la expresión regular en sí, ya que es la misma que usé en mi entrada anterior .fuente
C #, 82 bytes
fuente
C, 84 bytes
Prueba principal:
fuente
Prólogo, 120 bytes
Pruébalo en línea!
fuente