Inspiré par ce défi (merci @cairdcoinheringaahing pour le titre!), Votre tâche consiste à prendre deux chaînes ASCII imprimables et à les multiplier élément par élément avec les règles suivantes.
Comment ça marche?
Étant donné deux chaînes (par exemple split
et isbn
), vous allez d'abord tronquer la plus longue de sorte qu'elles aient une longueur égale, puis déterminer leurs codes ASCII :
split -> spli -> [115, 112, 108, 105]
isbn -> isbn -> [105, 115, 98, 110]
La prochaine étape consistera à les mapper à la plage [0..94]
en soustrayant 32
chaque code:
[115, 112, 108, 105] -> [83, 80, 76, 73]
[105, 115, 98, 110] -> [73, 83, 66, 78]
Vous allez maintenant les multiplier par élément modulo 95
(pour rester dans la plage imprimable):
[83, 80, 76, 73] ⊗ [73, 83, 66, 78] -> [74, 85, 76, 89]
Ajoutez 32
pour revenir à la gamme [32..126]
:
[74, 85, 76, 89] -> [106, 117, 108, 121]
Et la dernière étape consiste à les mapper en caractères ASCII:
[106, 117, 108, 121] -> "july"
Règles
- Vous allez écrire un programme / fonction qui implémente les étapes décrites sur deux chaînes et imprime ou renvoie la chaîne résultante
- Le format d'entrée est flexible: vous pouvez prendre deux chaînes, un tuple de chaînes, une liste de chaînes, etc.
- L'entrée peut consister en une ou deux chaînes vides
- L'entrée sera constituée de caractères dans la plage imprimable (
[32..126]
) - La sortie est imprimée sur la console ou vous retournez une chaîne
- La sortie peut avoir des espaces de fin
Cas de test
"isbn", "split" -> "july"
"", "" -> ""
"", "I don't matter" -> ""
" ", "Me neither :(" -> " "
"but I do!", "!!!!!!!!!" -> "but I do!"
'quotes', '""""""' -> 'ck_iKg'
"wood", "hungry" -> "yarn"
"tray", "gzip" -> "jazz"
"industry", "bond" -> "drop"
"public", "toll" -> "fall"
"roll", "dublin" -> "ball"
"GX!", "GX!" -> "!!!"
"4 lll 4", "4 lll 4" -> "4 lll 4"
"M>>M", "M>>M" -> ">MM>"
Remarque : Les citations sont juste pour la lisibilité, dans le 6ème cas de test que j'ai utilisé à la '
place de "
.
abc, def -> [['a', 'b', 'c'], ['d', 'e', 'f']]
Réponses:
MATL , 12 octets
Essayez-le en ligne!
Explication
la source
Gelée ,
1512 octetsEssayez-le en ligne!
-3 merci à Jonathan Allan .
la source
ØṖ
, avecz⁶O_32P€‘ịØṖ
- vous feriez mieux de vérifier que l'arithmétique fonctionne bien.Python 3 ,
807471 octetsMerci à @shooqie d'avoir joué au golf sur 3 octets!
Essayez-le en ligne!
la source
(s, t)
comme tuple:lambda t:''.join(map(lambda x,y:chr((ord(x)-32)*(ord(y)-32)%95+32),*t))
Python 2 ,
7570 octets-3 octets grâce à la suggestion de Dennis de la suggestion de shooqie. -2 octets grâce à la suggestion de Zacharý.
Essayez-le en ligne!
la source
lambda*t:''.join(chr(((ord(i)-32)*(ord(j)-32))%95+32)for i,j in zip(*t))
((ord(i)-32)*(ord(j)-32))%95+32
=>(ord(i)-32)*(ord(j)-32)%95+32
...map
. J'étais juste un peu en retard.Haskell ,
6057 octetsEssayez-le en ligne!
La première ligne est une fonction anonyme prenant deux arguments.
Il s'agit d'une implémentation simple de l'algorithme:
zipWith
prend les deux chaînes et applique une fonction donnée aux paires de caractères. Il gère la troncature et fonctionne également pour les chaînes vides.fromEnum
ettoEnum
sont des alternatives àord
etchr
pour basculer entre les caractères et leurs valeurs ASCII qui n'ont pas besoin d'une importation longue.Edit: -3 octets grâce à Bruce Forte.
la source
3
octets en extrayant-32
et en enregistrant ces parenthèses, voir ici .C ++,
331291282270268 octets, version 2 =178176150 150148 octetsVersion originale :
-40 octets grâce à Bruce Forte
-39 octets grâce à Zacharý
Version 2, inspirée des réponses des autres
Si la première version utilise un lambda, c'est parce que je voulais tester la fonction std :: async C ++ 11 que je viens d'apprendre, donc je l'ai gardée sans raison ...
Version plus lisible:
la source
#include <string>
=>#include<string>
et#include <algorithm>
=>#include<algorithm>
?string
et l'utiliser en conséquence.Dyalog APL,
3634332524 octetsEssayez-le en ligne (TryAPL)!
Essayez-le en ligne (TIO)!
L'entrée est une liste de chaînes et possède un espace de fin.
Voici comment cela fonctionne:
la source
tryapl.org
, voici donc un TIO pour ceux qui veulent l'essayer.FSharp 275 octets
la source
CJam , 23 octets
Essayez-le en ligne!
la source
C # (.NET Core) ,
100 9695 octetsEssayez-le en ligne!
-4 octets grâce à @ Zacharý
-1 octet en déplaçant l'incrément
Utilise un lambda et abuse du fait que les personnages sont essentiellement des ints.
la source
(l[i]-32)*(n[i]-32)%95+32
?Console
et vous pouvez utiliser le curry pour enregistrer un octet. Compiler vers unAction<string, Action<string>>
semblablel=>n=>
et appeler comme("word")("string")
Mathematica, 114 octets
contribution
la source
Empilé , 52 octets
Essayez-le en ligne!
Fonction qui prend deux arguments de la pile.
Explication
Regardons la première partie, en supposant que les deux premiers éléments sont
'split'
et'isbn'
:Cette partie effectue le recadrage.
Ensuite:
Ensuite, la dernière partie:
la source
R , 88 octets
fonction anonyme; prend l'entrée comme deux chaînes; le troisième argument est juste de s'assurer qu'il s'agit d'une fonction d'une ligne et d'économiser quelques octets.
Le lien TIO ci-dessous renvoie un tableau avec des entrées nommées avec la première entrée.
Essayez tous les cas de test!
la source
Perl 5 , 65 octets
64 octets de code +
-p
indicateur.Essayez-le en ligne!
la source
D, 113 octets
Ceci est un portage de la solution C ++ de HatsuPointerKun , n'oubliez pas de les voter!
Essayez-le en ligne!
la source
05AB1E ,
1615 octetsEssayez-le en ligne!
-1 pour Emigna soulignant les
₃
poussées95
.en est un autre.
la source
₃
enregistre un octet. Dommage pour l'entrée de chaîne vide. Sinon,ø
j'en économiserais quelques autres.Java 8,
1271159795 octetsExplication:
Essayez-le ici.
la source
C #, 166 octets
Je suis sûr qu'il y a beaucoup de golf à faire mais je n'ai pas le temps pour l'instant.
Essayez-le en ligne!
Version complète / formatée:
la source
(((c-32)*(t.Substring(0,l)[i]-32))%95)+32)
peut être((c-32)*(t.Substring(0,l)[i]-32)%95+32)
( ça a peut-êtreLisp commun, 99 octets
Essayez-le en ligne!
la source
Japt , 24 octets
Renvoie une chaîne avec des caractères nuls de fin (
\u0000
) lorsque la première entrée est plus longue que la seconde.Essayez-le en ligne! avec le
-Q
indicateur pour afficher la sortie formatée, y compris les caractères nuls.Exécutez tous les cas de test à l' aide de mon WIP CodePen.
la source
Python 2 ,
9573 octetsEssayez-le en ligne!
la source
(((ord(x[i])-32)*(ord(y[i])-32))%95)+32
=>(ord(x[i])-32)*(ord(y[i])-32)%95+32
Fusain , 30 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. J'ai en fait écrit le calcul
(32 - ord(q)) * (32 - ord(h))
car il évite les littéraux numériques consécutifs mais je suppose que j'aurais pu simplement écrire à la(ord(q) - ord(" ")) * (ord(h) - ord(" "))
place.la source
Perl 5 , 95 octets
Essayez-le en ligne!
Explication:
la source
Pip , 19 octets
Prend les chaînes comme arguments de ligne de commande. Essayez-le en ligne!
Explication
la source
Facteur , 45
C'est une citation (lambda),
call
elle avec deux chaînes sur la pile, laisse la nouvelle chaîne sur la pile.En un mot:
la source
K (oK) , 26 octets
Solution:
Essayez-le en ligne!
Exemple:
Explication:
L'évaluation s'effectue de droite à gauche:
la source
PHP, 112 octets
la source
for($i=0;$i<strlen($a=$argv[1])&&$i<strlen($b=$argv[2]);)echo chr((ord($a[$i])-32)*(ord($b[$i++])-32)%95+32);
De plus, je ne suis pas tout à fait sûr si le remplacement&&
par&
pourrait également être possible en PHP, en le réduisant d'un autre octet à 108 .JavaScript (ES6), 89 octets
Javascript et la malédiction des longs noms de fonctions ...
Utiliser le curry et le fait qu'il
charCodeAt
revientNaN
lorsqu'il est appelé avec une position invalide. Il peut y avoir des valeurs nulles de fin dans la sortie.Tester
la source