Motivación
En este desafío, su tarea consistía en multiplicar dos cadenas, esto naturalmente introduce una forma de sacar la raíz cuadrada de una cadena.
¿Como funciona?
Dada una cadena (por ejemplo pub
), lo primero que debe hacer es determinar el código ASCII para cada carácter:
"pub" -> [112, 117, 98]
A continuación, asigna estos códigos al rango [0..94]
restando 32
cada valor:
[112, 117, 98] -> [80, 85, 66]
Ahora necesita encontrar para cada valor su módulo raíz 95
(por ejemplo 40*40 % 95 = 80
, también podría elegir 55
):
[80, 85, 66] -> [40, 35, 16]
Y finalmente lo volverá a asignar al rango [32..126]
y lo convertirá de nuevo en una cadena:
[40, 35, 16] -> [72, 67, 48] -> "HC0"
En efecto "HC0" ⊗ "HC0" = "pub"
como puede verificar con una solución del otro desafío aquí .
Los que están familiarizados con la aritmética modular. probablemente notaron que el módulo de raíz cuadrada 95
no siempre existe, por ejemplo, no hay raíz 2
. En tal caso, la raíz cuadrada de una cadena no está definida y su programa / función puede fallar, repetirse indefinidamente, etc.
Para su comodidad, aquí está la lista de caracteres que tienen una raíz cuadrada (el primero es un espacio):
!$%&)+03489:>CDGLMQVW]`bjlpqu
Reglas
- Escribirás un programa / función que tome una cadena (o lista de caracteres) como argumento y devuelva cualquier raíz cuadrada si existe
- Puede suponer que la entrada siempre tiene una raíz cuadrada
- La entrada puede consistir en una cadena vacía
- La entrada estará en el rango imprimible (
[32..126]
) - El resultado se imprime en la consola o devuelve una cadena si existe la raíz cuadrada
- En caso de que la raíz cuadrada no exista, el comportamiento de su programa / función se deja sin definir
- Si elige imprimir la raíz en la consola, las líneas nuevas o espacios en blanco finales están bien
Casos de prueba
Tenga en cuenta que estas no son necesariamente las únicas soluciones:
'' -> ''
'pub' -> 'HC0'
'pull!' -> 'HC33!'
'M>>M' -> '>MM>'
'49' -> '4%'
'64' -> undefined
'Hello, World!' -> undefined
0-94
(ese es el rango imprimible), es un error tipográfico, lo siento.Respuestas:
sh + coreutils, 58 bytes
Pruébalo en línea!
La raíz cuadrada modular generalmente no es única; Tenemos 2 o 4 opciones para cada personaje excepto
. No necesitamos traducir
,
!
,4
,l
ya que cada uno es ya una raíz cuadrada de sí mismo. Para los caracteres restantes, elegimos imágenes que no necesitan escapar para el shell otr
.fuente
Python 3,
5756 bytestranslate
utiliza una asignación de "ordinales Unicode a ordinales Unicode". Por lo tanto, no necesitamoschr
/ord
conversiones. Nota: no se bloquea cuando el carácter no tiene raíz.Guardado 1 byte gracias a @ jonathan-allan
El valor de la asignación es la raíz más grande en el rango 0..94 de la clave. Para tener la menor raíz (como en los ejemplos), use:
(61 bytes)
fuente
32
yfor
.Python 2 , 80 bytes
Pruébalo en línea!
Lanza IndexError si no existe una raíz.
fuente
Japt ,
1615 bytesPruébalo en línea!
Guarda un byte mirando la respuesta 05AB1E (usando
L
= 100 en lugar de95
). Ahora Japt es el más corto, una ocurrencia bastante rara :-DExplicación
fuente
Mathematica, 94 bytes
Pruébalo en línea!
fuente
Jalea ,
181716 bytesPruébalo en línea!(viene con el pie de página de la suite de pruebas)
Ahorró 2 bytes haciendo una reescritura completa.
También la primera vez que he encontrado uso para}
.Explicación
El código primero calcula todos los caracteres cuadrados y luego los asigna a sus respectivas raíces cuadradas.
fuente
95Ḷ²%95+32iЀO+31Ọ
es básicamente lo que hace mi respuesta de Japt, aunque su solución es dos bytes más corta ...JavaScript, 82 bytes
Colabora con @ETHproductions
La entrada y la salida tienen la forma de una matriz de caracteres.
Fragmento de prueba
Mostrar fragmento de código
fuente
05AB1E , 17 bytes
El algoritmo es muy similar a la respuesta de Jelly y Japt (tenía algo más antes, pero eso solo me llevó a 19 bytes)
Explicación
Pruébalo en línea!
fuente
Mathematica, 60 bytes
Función anónima. Toma una cadena como entrada y devuelve una cadena como salida. Errores en entrada inválida.
fuente
Perl 6 , 53 bytes
Pruébalo en línea!
fuente
Mathematica 82 Bytes
Usando la capacidad de Solve para hacer aritmética modular.
fuente