En 1946, Erdos y Copeland demostraron que cierto número es un número normal , es decir, los dígitos en su expansión decimal están distribuidos uniformemente.
Los usuarios ingresarán una secuencia de dígitos y encontrará el primo más pequeño que contiene esa cadena en la base 10.
Ejemplo:
input -> output
"10" -> 101
"03" -> 103
"222" -> 2221
"98765" -> 987659
El código más corto en bytes gana. Sé que algunos lenguajes (Mathica, Sage, Pari-GP ...) vienen con funciones integradas relacionadas con números primos. -50 bytes si su programa no se basa en tales funciones. No intentes engañar a esto, por favor, si tu idioma ya tiene una gran ventaja, no reclames el bono.
Editar
Según algunos comentarios a continuación, el primo más pequeño que contiene "03" es 3. ¿Esto realmente hace la diferencia? Lo único en lo que puedo pensar es que quizás los números son más fáciles de manejar que las cadenas.
En casos como "03", el resultado preferido sería 103. Sin embargo, no considero que sea la parte fundamental de su programa, por lo que puede ignorar cualquier cero inicial si le otorga un recuento de bytes más bajo.
Respuestas:
Golfscipt
3332 bytes = -18 puntajeExplicación:
2{...}{)}/
- comenzando con2
, mientras algo es cierto, incremente la parte superior de la pila;;x
- descarte los valores intermedios recopilados por{}{}/
y la entrada, luego coloque el último valor probado allí:x,2>
- almacenar el valor comox
, luego generar una lista de2
ax-1
{x\%!},!!
- mantenga aquellos quex
es divisible por, luego coaccionar a booleano (no vacío)x`3?)!
- busque la entrada en forma de texto dex
(-1
si no se encuentra), incrementar, negar.|
- ofuente
Programa Haskell, 97 caracteres = 47 puntos
Función Haskell, 75 caracteres = puntaje 25
El tipo de
p
es(Integral a, Show a) => [Char] -> a
. Si proporciona su propio tipo integral, puede buscar por infijo en su propia representación de esos valores. El estándarInteger
usa la notación decimal esperada para enteros.No muy rapido. Cuadrático en el valor (no tamaño) de la salida.
versión sin golf:
ejemplo:
fuente
Java: 175 caracteres.
fuente
indexOf(a[0])>=0)
y{System.out.println(n)
.boolean p=true
por algo asíint p=1
y así sucesivamente.Mathematica 58
Tiempos relativos en mi Mac (2.6 GHz i7 con 8 GB de memoria).
Encuentra el primo más pequeño que contiene "01".
Encuentra el primo más pequeño que contiene "012345".
Encuentra el primo más pequeño que contiene "0123456".
fuente
StringFreeQ
para hacerlo más corto.Sabio , 72
Se ejecuta en el mensaje interactivo
Primes().unrank(i)
da eli
número primo th, siendo el 0 primo 2.fuente
R, 56 caracteres -50 = 6
Tome la entrada como stdin. Incrementa k hasta que k es primo (probado sumando las instancias para las cuales k mod 2 a k son ceros, por lo tanto FALSO ya que 0 convertido en lógico es FALSO) y contiene la cadena dada como entrada (probada con un grep simple, aquí grepl ya que queremos un resultado lógico).
Uso:
fuente
Shell oneliner (coreutils): 45 caracteres
No se define una función aquí ... solo una línea que toma un argumento
$n
y escanea el rango entero (en realidad un poco más para acortar el código). La versión de 55 caracteres:Ni siquiera es demasiado lento. Para
n=0123456
vuelve201234563
en81.715s
. Eso es impresionantemente rápido para una larga tubería con dos procesadores de cadena.Eliminando dos caracteres (hasta 53) y una tubería, podemos hacer que funcione aún más rápido:
Y finalmente, un poco de
sed
magia para reducirlo a 45 caracteres , aunque la impresión es fea:fuente
J - 38 caracteres -50 = -12 pts
Normalmente en J, estarías usando los builtins muy optimizados dedicados a los números primos, por lo que no voy a pedir disculpas por la lentitud en la ejecución.
Explicado:
>:@]^:(...)^:_&2
- Comenzando con 2, incremente hasta que(...)
devuelva falso.(+.i.)@]
- Tome el MCD del contador con cada número entero más pequeño que él. (Usamos la convención GCD (X, 0) = X.)]=*/@
- Tome el producto de todos estos números y pruebe la igualdad en el mostrador. Si el contador es primo, la lista era todo 1, excepto el MCD con 0; de lo contrario, habrá al menos un MCD mayor que 1, por lo que el producto será mayor que el contador.>./@(E.":)
- Pruebe si la representación de cadena del contador (":
) contiene la cadena (E.
) en cualquier punto.>./
es la función max, y la usamos porqueE.
devuelve un vector booleano con un 1 donde la subcadena comienza en la cadena principal.*:
- NAND lógico los resultados juntos. Esto será falso solo si ambas entradas eran verdaderas, es decir, si el contador era primo y contenía la subcadena.Uso:
Para la posteridad, aquí está la versión que usa el primer incorporado (30 caracteres de largo, pero sin bonificación):
1 p:]
prueba el contador de primalidad, en lugar del truco GCD.fuente
Brachylog (v2), 3 bytes en la codificación de Brachylog
Pruébalo en línea!
Envío de funciones, tomando datos del argumento de la derecha, dando salida al mutar el argumento de la izquierda. (Esto es lo opuesto a la convención normal de Brachylog; vea esta meta publicación para más discusión. Cambiar los argumentos en el orden más habitual costaría tres bytes). El enlace TIO tiene un contenedor que llama a la función con la convención de llamada apropiada e imprime el resultado.
Explicación
Lamentablemente, Brachylog es tan apropiado para este problema que, de acuerdo con las reglas del problema, ni siquiera puedo intentar obtener el bono (lo que irónicamente significa que es incapaz de ganar).
Una de las razones por las que me gusta tanto Brachylog es que la programación es una comunicación entre humanos y computadoras, y por lo tanto un lenguaje "perfecto" le permitiría traducir directamente la especificación del problema al inglés; las ideas a través de las cuales se planteó el problema y a través de las cuales se escribe el programa serían las mismas. Brachylog puede alcanzar este ideal sorprendentemente a menudo; la pregunta aquí es "encontrar el primo más pequeño que contiene una subcadena dada", y literalmente puedo encadenar los conceptos de "subcadena más pequeña, primo, que contiene" en el orden correcto y tener un programa de trabajo. Como tal, Brachylog dice mucho más sobre la naturaleza de la comunicación que un lenguaje en el que tenía que especificar explícitamente un algoritmo para resolver el problema; a veces cuando hablas con otros humanos, tratamos de explicar un problema explicando los pasos que tomaría para resolverlo, pero eso es raro. Entonces, ¿por qué nuestros idiomas deberían ser diferentes?
fuente
JavaScript 83 bytes = 33 puntaje
Golfizado:
Sin golf (un poco):
fuente
Javascript (Node.JS) - 93 bytes = 43 puntos
En forma extraída con nombres de variables sensibles:
fuente
Óxido 0.9 136 bytes = 86 puntos
Muy explícito a pesar de la compacidad. Demasiado espacio gastado en la cadena de encontrar. :(
Aquí la versión sin espacios en blanco (136 caracteres)
fuente
Japt, 10 bytes
Intentalo
fuente
Ordenado , 37 bytes
Pruébalo en línea!
fuente
Perl 6 , 36-50 = -14 puntos
Pruébalo en línea!
Teniendo en cuenta
$_%%one ^$_
es el único 2 bytesmás pequeñomás grande que.is-prime
, creo que vale la pena para el bono. Esto agota el tiempo para el último caso de prueba.Explicación:
fuente
:$
Python 3 ,
8079 bytes - 50 =3029 puntaje-1 byte gracias al uso creativo de @ ASCII-only de en
%s
lugar destr
El caso de prueba "98765" aún no se ha confirmado debido a cuánto tiempo se tarda en realizar la prueba.Confirmado para el caso de prueba "98765" después de un par de horas, pero con un enfoque similar que utiliza la evaluación de cortocircuito para evitar algunas pruebas de primalidad, funciona. mucho mas rápido. Alternativamente, esto puede ser ~ 2 veces más rápido si sabemos que "2" no es una entrada (podemos evitar verificar los números pares de primalidad) configurandoi=3
inicialmente yi+=2
en el bucle, sin costo adicional de bytes.Pruébalo en línea!
Explicación de la
while
condición ((x in"%s"%i)*all(i%j for j in range(2,i))-1
):(x in"%s"%i)
:True
/1
si el contador actual contiene la secuencia deseada de números en él;False
/ de lo0
contrario.all(i%j for j in range(2,i))
:True
/1
si el contador actual siempre tiene un resto cuando se divide por cualquier número entero de 2 (inclusive) a sí mismo (exclusivo), es decir, es primo;False
/ /0
contrario.Los
*
multiplica las dos condiciones juntos, y actúa como unand
operador - el producto esTrue
/1
si y sólo si ambas condiciones sonTrue
/1
.El
-1
actúa comonot
operador:False
/0
- 1 resulta en-1
, lo que se considera verdadero, mientras queTrue
/1
- 1 da como resultado0
, lo que se considera falso. Por lo tanto, el ciclo continúa mientras el número no contiene la secuencia de números deseada o no es primo.Reemplace la
*
conand
y agregue paréntesis alrededor de todo menos el-1
para obtener una solución equivalente mucho más rápida (que es un poco más larga).Una solución de 76 bytes - 50 = 26 en Python 2 dada por @ ASCII-only (utiliza en
``
lugar destr()
,Pruébalo en línea!
fuente
return I
JavaScript, 65-50 = 15 puntos
Pruébalo en línea!
fuente