Motivation
Dans ce défi, votre tâche consistait à multiplier deux chaînes, ce qui introduit naturellement un moyen de prendre la racine carrée d'une chaîne.
Comment ça marche?
Étant donné une chaîne (par exemple pub
), la première chose que vous devez faire est de déterminer le code ASCII pour chaque caractère:
"pub" -> [112, 117, 98]
Ensuite, vous mappez ces codes à la plage [0..94]
en soustrayant 32
chaque valeur:
[112, 117, 98] -> [80, 85, 66]
Maintenant, vous devez trouver pour chaque valeur son module racine 95
(par exemple 40*40 % 95 = 80
, vous pouvez également choisir 55
):
[80, 85, 66] -> [40, 35, 16]
Et enfin, vous allez le mapper à la plage [32..126]
et le reconvertir en chaîne:
[40, 35, 16] -> [72, 67, 48] -> "HC0"
En effet, "HC0" ⊗ "HC0" = "pub"
comme vous pouvez le vérifier avec une solution de l'autre défi ici .
Ceux qui connaissent l'arithmétique modulaire ont probablement remarqué que la racine carrée modulo 95
n'existe pas toujours, par exemple il n'y a pas de racine pour 2
. Dans un tel cas, la racine carrée d'une chaîne n'est pas définie et votre programme / fonction peut se bloquer, boucler indéfiniment, etc.
Pour votre commodité, voici la liste des caractères qui ont une racine carrée (la première est un espace):
!$%&)+03489:>CDGLMQVW]`bjlpqu
Règles
- Vous écrirez un programme / fonction qui prend une chaîne (ou une liste de caractères) comme argument et renvoie toute racine carrée si elle existe
- Vous pouvez supposer que l'entrée a toujours une racine carrée
- L'entrée peut être constituée d'une chaîne vide
- L'entrée sera dans la plage imprimable (
[32..126]
) - La sortie est imprimée sur la console ou vous retournez une chaîne si la racine carrée existe
- Dans le cas où la racine carrée n'existe pas, le comportement de votre programme / fonction n'est pas défini
- Si vous choisissez d'imprimer la racine sur la console, les sauts de ligne ou les espaces blancs sont corrects
Cas de test
Notez que ce ne sont pas nécessairement les seules solutions:
'' -> ''
'pub' -> 'HC0'
'pull!' -> 'HC33!'
'M>>M' -> '>MM>'
'49' -> '4%'
'64' -> undefined
'Hello, World!' -> undefined
0-94
(c'est la plage imprimable), c'est une faute de frappe - désolé.Réponses:
sh + coreutils, 58 octets
Essayez-le en ligne!
La racine carrée modulaire n'est généralement pas unique; nous avons 2 ou 4 choix pour chaque personnage sauf
. On n'a pas besoin de traduire
,
!
,4
,l
puisque chacun est déjà une racine carrée de lui - même. Pour les caractères restants, nous choisissons des images qui n'ont pas besoin d'être échappées pour le shell outr
.la source
Python 3,
5756 octetstranslate
utilise un mappage des "ordinaux Unicode aux ordinaux Unicode". Ainsi, nous n'avons pas besoinchr
/ord
conversions. Remarque: il ne plante pas lorsque le caractère n'a pas de racine.1 octet enregistré grâce à @ jonathan-allan
La valeur du mappage est la plus grande racine dans la plage 0..94 de la clé. Pour avoir le moins de racine (comme dans les exemples), utilisez:
(61 octets)
la source
32
etfor
.Python 2 , 80 octets
Essayez-le en ligne!
Lève IndexError si aucune racine n'existe.
la source
Japt ,
1615 octetsEssayez-le en ligne!
Enregistré un octet en regardant la réponse 05AB1E (en utilisant
L
= 100 au lieu de95
). Maintenant, Japt est le plus court, une occurrence assez rare :-DExplication
la source
Mathematica, 94 octets
Essayez-le en ligne!
la source
Gelée ,
181716 octetsEssayez-le en ligne!(livré avec le pied de page de la suite de tests)
Sauvegardé 2 octets en effectuant une réécriture complète.
Aussi la première fois que j'ai trouvé une utilisation pour}
.Explication
Le code calcule d'abord tous les caractères carrés, puis les mappe à leurs racines carrées respectives.
la source
95Ḷ²%95+32iЀO+31Ọ
est essentiellement ce que fait ma réponse Japt, bien que votre solution soit plus courte de deux octets ...JavaScript, 82 octets
Collaboration avec @ETHproductions
L'entrée et la sortie se présentent sous la forme d'un tableau de caractères.
Extrait de test
Afficher l'extrait de code
la source
05AB1E , 17 octets
L'algorithme est très similaire à la réponse de Jelly et Japt (il y avait autre chose auparavant mais cela ne m'a fait que 19 octets)
Explication
Essayez-le en ligne!
la source
Mathematica, 60 octets
Fonction anonyme. Prend une chaîne en entrée et renvoie une chaîne en sortie. Erreurs sur une entrée invalide.
la source
Perl 6 , 53 octets
Essayez-le en ligne!
la source
Mathematica 82 octets
Utiliser la capacité de Solve à faire de l'arithmétique modulaire.
la source