Estás desarrollando un código para generar números de identificación. La política requiere que ningún número de identificación incluya la secuencia de dígitos 666 .
Cree una función (o el equivalente de su idioma) que tome un parámetro entero positivo y devuelva el siguiente entero que no incluye 666 cuando ese entero se expresa en decimal. (60606 está bien, 66600 no lo está).
Su código no debe usar un bucle que agregue uno hasta que encuentre un resultado que se ajuste a las reglas.
f(1) returns 2.
f(665) returns 667.
f(665999999) returns 667000000 without having looped a million times.
(Following examples added since the question was first posed.)
f(666666666) also returns 667000000.
f(66600) returns 66700.
f(456667) returns 456670.
ACTUALIZACIÓN:
Reemplazar 666 con 667 no funcionará si hay más de un 666 en la entrada.
66700
.Respuestas:
Python, sin manipulación de cadenas
Funciona encontrando poderes de 10,
p
donde aparece 666, y agregandop - n % p
a losn
que reemplaza666xxxxx
con66700000
.fuente
m /= 10
am //= 10
. Si no lo hace, m se convertirá en un flotador y la condiciónm % 1000 == 666
será continuamente falsa y otros "666" en n no se modificarán.JavaScript (actualizado para funcionar con todos los casos de prueba)
La verdad poco conocida es que en realidad hay cuatro
6
s, pero uno de los traicionó a los demás y se transformó en forma de código para erradicarlos de los dígitosmundialesde los números. Aquí está ese traidor seis:Aquí hay una explicación. Primero, embellezca el código y elimine cosas inútiles como
''+'string'
y((code))
:Convierta anotaciones extrañas (como
~indexOf
y['replace']
) en otras más comunes:Y ahora simplemente entienda que el algoritmo es así:
Si ya hay un 666 en la entrada,
más,
Versión anterior (no funciona
666666666
) :Para entender esto, primero hay que embellecerlo:
Ahora vamos a quitar cosas inútiles como
'' + string
y'str' + 'ing'
, eliminar lo innecesarios
variable y rarezas como el cambio-~![]
en1
:'l ength'['replace'](/ /g,'')
es simplemente"length"
:Y
"undefined"[0]
es"u"
, y"u".length
es1
:Ahora hemos terminado! Debería ser bastante fácil de entender ahora.
fuente
666666666
666666666
, y la fuente de la6
es más elegante;)~1
para!= -1
es muy bueno.~a.indexOf('b')
genera el JS correcto, ¡pruébalo en livescript.net!Applescript
Este sitio no tiene suficientes respuestas de Applescript. ¡Vamos a desterrar a algunos demonios!
Salida de registro:
Quería obtener algunas de las citas más poderosas de The Exorcist en esto, pero eso habría hecho que esto se publicara decididamente NSFW. Puede leer la página IMDB en su lugar.
fuente
Perl
Dijiste que no debemos incrementar en un bucle. ¡No estoy usando ningún operador matemático en absoluto! Aquí hay un enfoque puro de sustitución de expresiones regulares (no hay garantías de que sea seguro para su cordura).
Las primeras tres sustituciones incrementan el número en uno. Resolví ese problema yo mismo una vez, pero incluía una sustitución que tenía que colocarse en bucle hasta que no se realizaran más sustituciones, así que utilicé el enfoque de Andrew Cheong .
La cuarta sustitución convierte todos los dígitos que siguen a a
666
en ceros. La sustitución final convierte el resto666
en a667
.Como beneficio adicional, esto funcionará con múltiples enteros en la entrada, siempre que estén separados por caracteres que no sean dígitos.
fuente
LiveScript
Esto está doblando las reglas. Verás, dijiste que no debo usar un bucle que agregue uno hasta que encuentre un resultado correcto. ¡Entonces resto menos uno en su lugar!
Una versión de golf en
534845 bytes para divertirse:Gracias a user1737909 por ayudarnos a seguir jugando al golf.
Pruebas
Requiere Node.js con el
LiveScript
módulo npm o una biblioteca de aserciones compatible.fuente
Rubí
Esta es (creo) la primera respuesta que funciona para 666666666. (Excepto la trampa restando -1 respuesta.)
Tengo prisa ahora; La explicación se agregará más tarde.
Actualización : versión mucho más eficiente (tiempo de ejecución casi constante, creo):
fuente
Potencia Shell
fuente
J
Finalmente, un buen uso para
E.
!En esencia, encontramos la primera posición en la que el argumento tiene una posición completa
666
, y reemplazamos esa subcadena y todo lo posterior con66700000...
hasta el final.Explicado en detalle:
":@>:
- Incrementar en uno y convertir a cadena.'666'&E.
- Haga un vector de booleanos, verdadero en cada lugar que '666' comience en la cadena.i.1:
- Encuentra el índice del primer verdadero en el vector, de lo contrario, devuelve la longitud del vector.#@[-]
- Longitud de la cadena (que también es la longitud del vector) menos el resultado dei.
.'667'{.!.'0'~
- Tome una subcadena de '667' con una longitud de ese resultado, rellenando a la derecha con '0' si es necesario.{.~
- Tome una subcadena con la longitud del resultado original dei.
.,
- Agregar los dos juntos.En uso:
Y dado que este no es un código de golf, no es necesario jugar golf con optimizaciones locas. ¡Todos ganan!
fuente
C#
148137 caracteresPude eliminar algunos caracteres gracias a @recursive
Sin golf:
Violín: http://dotnetfiddle.net/XB83bf
fuente
Int32
puede ser reemplazado porint
.Pitón
fuente
Perl
Código en línea que cambia el contenido dentro
$_
, una ideología bastante estándar en perl. Se puede usar junto con una-p
bandera como esta:fuente
J
Sin cadenas, bucles o condicionales:
De manera similar a la solución de cartón_box, esto separa el número en grupos de tres dígitos dividiéndolo por potencias de diez. Utiliza el índice de la primera aparición de 666 para redondear el número adecuadamente.
fuente
Haskell (70 caracteres)
Aquí hay una implementación simple en Haskell.
map digitToInt . show
para convertir una identificación posiblemente malvada en una lista de dígitos.purge
coincide con el patrón malvado y lo reemplaza por su buen equivalente.foldl' ((+).(*10)) 0
reduce la lista de dígitos a unoInteger
.¡A ver si funciona!
Se ve bien. Y solo por diversión, una versión de golf.
fuente
Java
¿No es suficiente hacer esto?
fuente
String.valueOf(currentId + 1)
.return Integer.parseInt(String.valueOf(currentId + 1).replace("666", "667"));
R
Sustitución de 666 por 667 obras.
Resultados
fuente
3 respuestas diferentes de JavaScript:
1. JavaScript (ECMAScript 6)
Convierte el número en una cadena, luego itera sobre cada carácter hasta que encuentra y
666
luego cambia lo último6
a7
ay genera0
los siguientes caracteres.2. JavaScript (borrador de ECMAScript 6)
Función recursiva sin manipulación de cadenas:
O más detalladamente:
Pruebas:
3. JavaScript
Usando expresiones regulares:
O (lo mismo pero usando ECMAScript 6)
fuente
6.667
modo que técnicamente todavía está allí. Sin embargo, no creo que se pueda evitar.1e20
es el orden de magnitud más grande que JavaScript (al menos en Firefox) imprimirá como un entero sin recurrir a la notación científica.AWK
da
editar: segunda solución
rendimientos
fuente
awk
indexa cadenas basadas en 1.f(665) returns 667
ya que pide "el próximo entero que no incluye 666"awk
ish yb) minimiza el uso de funciones de cadena.Pitón:
O:
fuente
666666
en667667
lugar de667000
?Java
Usando la función recursiva para encontrar el 666 más a la izquierda y calcular cuánto ajustar el número al volver a abrir la pila de llamadas.
fuente
f(666666666) -> 667000000
popularity-contest
, no uncode-golf
.Lote
Manipulación de cadena iterada simple.
Comienza en los primeros tres caracteres del número (como una cadena) y avanza hasta el final hasta que encuentra 666, luego reemplaza ese 666 con 667 y recorre la longitud de la cadena agregando ceros.
Todos los casos de prueba producen los resultados correctos.
fuente
perl, 45 bytes
Una expresión regular única con la bandera / e hace todo el trabajo aquí:
fuente
SQL
Para ser precisos, SQL Server 2012 Transact-SQL.
fuente
Pitón
fuente
Julia
Resultados REPL
fuente
C#
Lo estoy haciendo bien
fuente
vba
En acción:
resultado:
fuente
C ++
Sé que esto no es código golf, pero (a) algunas personas han sugerido que es un buen desafío de golf, y (b) esta es mi primera respuesta de desafío / golf, pensé que sería divertido, y si lo hago esto aquí no me aparece en un desafío de golf real por ser un golfista terrible. X)
Básicamente, reemplazar '666' por '667' funciona si lo hace por primera vez en el número y luego escribe ceros al final.
Golfed (
175155 caracteres):Sin golf:
fuente
x+=c=='6'?1:0
, puedes salirte con la tuyax+=c=='6'
. Sin embargo, no lo he probado.std::
antesstringstream
. No se compila sin eso.x+=c=='6'
reducción, así como el cuidado en hacer esto con los dígitos int en lugar de caracteres sstream ...Rubí
fuente
perl, 36 solo un sub, sin bytes
Una versión más corta que mi última solución, usando una combinación de operaciones aritméticas y expresiones regulares.
fuente
C
OK, no hay verificación de límites y demasiado espacio en blanco, pero no es golf. También un poco divertido de formateo en "while (d -> 0)".
fuente