Esto fue inspirado por parte de la competencia ARML 2016 Equipo Problema # 6.
Aquí está el desafío:
Te dan una "secuencia comodín", que es una secuencia de dígitos y otro carácter. Una cadena coincide con esta secuencia comodín mediante el siguiente pseudocódigo:
w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]
Dónde '?' es un personaje de tu elección.
En términos de expresiones regulares, solo imagínense el '?'
ser '.'
.
El desafío es encontrar todos los números cuadrados (el requisito es de hasta 1 millón) cuyas representaciones de cadenas decimales coinciden con esta secuencia comodín. El "carácter comodín" puede ser cualquier carácter ASCII de su elección, siempre que no sea un dígito, obviamente.
Por ejemplo, 4096
partidos 4**6
y 4*9*
aunque 4114
no coincide tampoco.
Entrada
La entrada se dará como una secuencia que coincida con la expresión regular [0-9?]+
. Puede ser una cadena, una matriz de caracteres o una matriz de bytes de los caracteres en ASCII.
Salida
La salida será una lista / conjunto / conjunto de números delimitados por lo que desee que sean cuadrados perfectos y coincidan con la secuencia de comodines.
Ejemplos de entradas válidas:
1234567*90
1234567?90
1234567u90
['1', '2', '3', '4', '5', '6', '7', '*', '9', '0']
[49, 50, 51, 52, 53, 54, 55, 42, 57, 48]
[1, 2, 3, 4, 5, 6, 7, '*', 9, 0]
Ejemplos de salidas válidas:
[1, 4, 9]
1 4 9
1, 4, 9
1-4-9
etc.
Especificaciones
- No puede usar los builtins para encontrar una lista de cuadrados en un cierto rango
- Se aplican lagunas estándar
- Debe poder manejar hasta 1 000 000 (1 millón)
- Si se proporciona con la entrada
1******
, es correcto imprimir[1000000]
. También es correcto imprimir[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...]
- Las secuencias comodín nunca comenzarán con el carácter comodín; es decir, siempre coincidirán con cadenas de la misma longitud.
Casos de prueba
4**6 -> [4096, 4356]
1**1 -> [1521, 1681]
1** -> [100, 121, 144, 169, 196]
9****9 -> [908209, 915849, 927369, 935089, 946729, 954529, 966289, 974169, 986049, 994009]
9*9*** -> [919681, 929296]
1**0* -> [10000, 10201, 10404, 10609, 12100, 14400, 16900, 19600]
9***4 -> [91204, 94864, 97344]
Victorioso
Envío más corto (válido) (en funcionamiento) antes del 14 de febrero, desempate por el ganador más temprano.
?
será elegido por el respondedor.25
una respuesta válida para***
pero no para*2*
?{4, "w", "w", 6}
(o mejor aún{4, w, w, 6}
), en lugar de una matriz de caracteres, como{"4", "w", "w", "6"}
?Respuestas:
05AB1E , 22 bytes
Probablemente hay mucho margen de mejora aquí.
Cualquier no dígito está bien como comodín.
Pruébalo en línea!
Explicación por venir después de más golf.
fuente
Mathematica, 44 bytes
La entrada es una lista de dígitos con un
_
(sin comillas) como comodín. p.ej{4, _, _, 6}
Explicación
Generar lista
{1, 2, 3, ... , 1000}
Encuadrelo. (lista de todos los cuadrados del 1 al 1,000,000)
Divide cada cuadrado en una lista de dígitos.
Encuentra los que coinciden con el patrón especificado por la entrada.
Imprimirlos.
fuente
Brachylog , 23 bytes
Pruébalo en línea!
Explicación
Formato de entrada diferente, 13 bytes
Dependiendo de lo que considere válido como entrada, puede hacer esto:
Pruébalo en línea!
que es básicamente la segunda parte de la respuesta anterior, con una lista como entrada que contiene dígitos y variables donde están los comodines.
Sin embargo, no considero esto válido porque solo hay 26 nombres de variables en Brachylog (las letras mayúsculas), por lo que esto no funcionaría si tuviera más de 26 wilcards.
fuente
true.
), pero no he usado idiomas que lo requieran antes. Trataré de encontrar alguna referencia para determinar cómo debo calificar esto, pero tendría sentido calificarlo como 23, así que lo mantendré así.Perl 6 ,
3026 bytes¡Gracias a @ b2gills por -4 bytes!
Utiliza el punto como carácter comodín, de modo que la entrada puede usarse como una expresión regular:
Pruébalo en línea .
Una variante que acepte el asterisco como comodín (como sugiere una revisión previa de la descripción de la tarea) sería de 42 bytes:
fuente
{ ... }("9*9***")
. ej. ) o asignarlo a una variable / símbolo para su uso posterior. Tenga en cuenta que Perl 6 es un idioma separado de Perl, por lo que no funcionará con un intérprete de Perl.sudo apt-get install rakudo
tener un supuesto intérprete de Perl6 ... Cuando pongoperl6
un comando en mi terminal, comienza lo que parece ser un intérprete de Perl6, pero no sé cómo usarlo. Sé que es una lambda, pero no sé cómo llamarlo.perl6 foo.p6
. También puedes probarlo en un shell oneliner, comoperl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
Ruby, 54 bytes
Función que toma un argumento de cadena. Pruébalo en línea.
fuente
#
está haciendo que el resto de la línea sea un comentario.Lote, 109 bytes
Usos
?
como comodín. Funciona creando 1000 archivos. El nombre del archivo es el número cuadrado y la extensión del archivo es el número cuadrado con un$
sufijo. Esto se debe a que la coincidencia de patrones de Batch cuenta los?
s finales como opcionales, por1?
lo que coincidirá con ambos1
y16
;$
Por lo tanto, obliga a que la coincidencia sea exacta. Sin embargo, no queremos generar el$
, por lo que solo mostramos el nombre del archivo sin extensión.fuente
JavaScript (ES6),
6866 bytesEDITAR: Actualicé mi solución a continuación después de inspirarme con la respuesta de JungHwan Min . Ahora es compatible con ES6.
Toma entrada en el formato
'1..4'
donde.
está el comodín.En lugar de iterar a 1e6 y enraizamiento cuadrado, este itera a 1e3 y cuadrados.
Mostrar fragmento de código
JavaScript (ES7),
7169 bytesCrea una matriz de números del 0 al 1e6 y luego la filtra por números que son cuadrados y coinciden con el patrón.
Es terriblemente lento porque siempre itera a 1e6.
Mostrar fragmento de código
fuente
**
esté funcionando, porque me está dando un"SyntaxError: expected expression, got '*'"
.1e6
...**
operador no existe, al menos no con mi sistema.**
. Sí, es ES7. Actualizaré el título. Aquí hay una lista de los navegadores compatibles actualmente developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Perl,
424538 bytesEDITAR: aclaración de Alex, podemos usar el punto como carácter comodín que elimina la operación y //.
EDITAR: solución que utiliza el asterisco como carácter comodín y espera la secuencia comodín en STDIN
Sin duda, esto deja mucho margen de mejora, es bastante sencillo. La expresión comodín se espera como argumento de línea de comando, con el carácter comodín de punto (¿qué más?).
fuente
Python 3 -
9897 bytesRequiere una entrada como '4..6'.
fuente
import re
yre.findall
; la optimización con el enfrom...import *
realidad no lo optimiza en este caso.1....
, da1 4 9
y16 25
como respuestas válidas, lo que no es correcto. Por favor corrija su programa.1......
. Regresa[]
, pero debería ceder[1000000]
. Esto se puede solucionar a un costo de 0 bytes utilizando enrange(0, 1001)
lugar derange(0, 1000)
.k - 28 caracteres
Se utiliza
?
como carácter comodín. Lalike
función se usa?
como comodín, y esta función hace una lista de los primeros 1001 cuadrados (para incluir 1M), los convierte a todos en cadenas y luego comprueba dónde coinciden con el patrón.fuente
type error {s(&:)($:s:s*s:!1001)like x} "1" at execution instance 2 of ":"
. ¿Podría proporcionar un enlace a un conjunto de pruebas en funcionamiento o ver si hay un problema?bash + utilidades Unix, 33 bytes
Esto usa '.' como el carácter comodín.
El programa de CC imprime los números cuadrados en un bucle infinito:
La salida de CC se canaliza a grep, que imprime solo los cuadrados que coinciden con el patrón requerido.
Esto funciona cuando lo ejecuto en un sistema Linux o OS X real (pero no funciona en TIO, probablemente porque el programa de CC intenta repetirse para siempre, y sospecho que TIO se queda sin espacio de pila para la recursión y / o tiene un problema con la tubería interminable).
fuente
dc
comando interminable .--line-buffered
a cada lado de la^$1$
, pero no funciona de ninguna manera.sed s/./0/g<<<$1
| grep ^ $ 1 $ Esto usa la longitud de patrón para limitar los números que se prueban (los patrones de 4 caracteres verifican solo hasta 9999, etc.). Aquí hay un enlace TIO: tio.run/nexus/…grep
. Sin embargo, como actualmente no es la solución más corta, la mantendré en 33 bytes para la puntuación. Parece funcionar para todas las entradas, ¡así que buen trabajo!