Inspiriert von dieser Herausforderung (danke an @cairdcoinheringaahing für den Titel!) Besteht Ihre Aufgabe darin, zwei druckbare ASCII-Zeichenfolgen zu nehmen und sie mit den folgenden Regeln elementweise zu multiplizieren.
Wie funktioniert es?
Bei zwei gegebenen Zeichenfolgen (zum Beispiel split
und isbn
) kürzen Sie zuerst die längere Zeichenfolge so, dass sie die gleiche Länge hat, und bestimmen dann ihren ASCII-Code :
split -> spli -> [115, 112, 108, 105]
isbn -> isbn -> [105, 115, 98, 110]
Der nächste Schritt besteht darin, sie [0..94]
durch Subtrahieren 32
jedes Codes dem Bereich zuzuordnen :
[115, 112, 108, 105] -> [83, 80, 76, 73]
[105, 115, 98, 110] -> [73, 83, 66, 78]
Jetzt multiplizieren Sie sie elementweise modulo 95
(um im druckbaren Bereich zu bleiben):
[83, 80, 76, 73] ⊗ [73, 83, 66, 78] -> [74, 85, 76, 89]
Hinzufügen 32
, um zum Bereich zurückzukehren [32..126]
:
[74, 85, 76, 89] -> [106, 117, 108, 121]
Und der letzte Schritt ist, sie wieder ASCII-Zeichen zuzuordnen:
[106, 117, 108, 121] -> "july"
Regeln
- Sie schreiben ein Programm / eine Funktion, die die beschriebenen Schritte in zwei Zeichenfolgen implementiert und die resultierende Zeichenfolge entweder ausgibt oder zurückgibt
- Das Eingabeformat ist flexibel: Sie können zwei Zeichenfolgen, ein Tupel von Zeichenfolgen, eine Liste von Zeichenfolgen usw. verwenden.
- Die Eingabe kann aus einer oder zwei leeren Zeichenfolgen bestehen
- Die Eingabe erfolgt in Zeichen im druckbaren Bereich (
[32..126]
) - Die Ausgabe wird entweder auf die Konsole gedruckt oder Sie geben eine Zeichenfolge zurück
- Die Ausgabe darf abschließende Leerzeichen enthalten
Testfälle
"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>"
Hinweis : Die Zitate sind nur zur besseren Lesbarkeit, ich im 6. Testfall verwendet '
statt "
.
abc, def -> [['a', 'b', 'c'], ['d', 'e', 'f']]
Antworten:
MATL , 12 Bytes
Probieren Sie es online!
Erläuterung
quelle
Jelly ,
1512 BytesProbieren Sie es online!
-3 Danke an Jonathan Allan .
quelle
ØṖ
mitz⁶O_32P€‘ịØṖ
- Sie würden am besten überprüfen , dass die Arithmetik funktioniert aber.Python 3 ,
807471 BytesVielen Dank an @shooqie für das Golfen mit 3 Bytes!
Probieren Sie es online!
quelle
(s, t)
als Tupel nehmen:lambda t:''.join(map(lambda x,y:chr((ord(x)-32)*(ord(y)-32)%95+32),*t))
Python 2 ,
75-70Bytes-3 Bytes dank Dennis 'Vorschlag von Shooqies Vorschlag. -2 Bytes dank Zacharýs Vorschlag.
Probieren Sie es online!
quelle
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
. Ich war nur etwas spät dran.Haskell ,
6057 BytesProbieren Sie es online!
Die erste Zeile ist eine anonyme Funktion mit zwei Argumenten.
Dies ist eine einfache Implementierung des Algorithmus:
zipWith
Nimmt beide Zeichenfolgen und wendet eine gegebene Funktion auf die Zeichenpaare an. Es behandelt das Abschneiden und funktioniert auch für leere Zeichenfolgen.fromEnum
undtoEnum
sind Alternativen zuord
undchr
zum Umschalten zwischen Zeichen und ihren ASCII-Werten, für die kein langer Import erforderlich ist.Edit: -3 Bytes dank Bruce Forte.
quelle
3
Bytes sparen, indem Sie-32
diese Klammern herausziehen und speichern (siehe hier) .C ++,
331291282270268 Bytes, Version 2 =178176150148 BytesOriginalfassung :
-40 Bytes dank Bruce Forte
-39 Bytes dank Zacharý
Version 2, inspiriert von den Antworten anderer
Wenn die erste Version ein Lambda verwendet, liegt es daran, dass ich die C ++ 11-Funktion std :: async testen wollte, die ich gerade erst gelernt habe, also habe ich sie ohne Grund beibehalten ...
Mehr lesbare Version:
quelle
#include <string>
=>#include<string>
und#include <algorithm>
=>#include<algorithm>
?string
und es entsprechend zu verwenden.Dyalog APL,
3634332524 BytesProbieren Sie es online aus (TryAPL)!
Probieren Sie es online (TIO)!
Die Eingabe ist eine Liste von Zeichenfolgen mit nachgestellten Leerzeichen.
So funktioniert das:
quelle
tryapl.org
, also hier ist ein TIO für diejenigen, die es ausprobieren wollen.FSharp 275 Bytes
quelle
CJam , 23 Bytes
Probieren Sie es online!
quelle
C # (.NET Core) ,
100 9695 BytesProbieren Sie es online!
-4 Bytes dank @ Zacharý
-1 Byte durch Verschieben des Inkrements
Verwendet ein Lambda und missbraucht die Tatsache, dass Zeichen grundsätzlich Ints sind.
quelle
(l[i]-32)*(n[i]-32)%95+32
?Console
und Sie können currying verwenden, um ein Byte zu speichern. Kompilieren Sie zu einemAction<string, Action<string>>
Likel=>n=>
und rufen Sie Like an("word")("string")
Mathematica, 114 Bytes
Eingang
quelle
Gestapelt , 52 Bytes
Probieren Sie es online!
Funktion, die zwei Argumente vom Stapel nimmt.
Erläuterung
Schauen wir uns den ersten Teil an, vorausgesetzt, die beiden obersten Elemente sind
'split'
und'isbn'
:Dieser Teil führt das Zuschneiden durch.
Dann:
Dann der letzte Teil:
quelle
R 88 Bytes
anonyme Funktion; nimmt die Eingabe als zwei Zeichenfolgen auf; Das dritte Argument ist nur, um sicherzustellen, dass dies eine einzeilige Funktion ist, und um einige Bytes zu sparen.
Der unten stehende TIO-Link gibt ein Array mit Einträgen zurück, die mit der ersten Eingabe benannt wurden.
Probieren Sie alle Testfälle aus!
quelle
Perl 5 , 65 Bytes
64 Byte Code +
-p
Flag.Probieren Sie es online!
quelle
D, 113 Bytes
Dies ist eine Portierung der C ++ - Lösung von HatsuPointerKun. Vergessen Sie nicht, sie zu verbessern!
Probieren Sie es online!
quelle
05AB1E ,
1615 BytesProbieren Sie es online!
-1 für Emigna unter Hinweis auf
₃
drückt95
.ist ein anderer.
quelle
₃
Speichert ein Byte. Schade um die leere Zeichenketteneingabe. Sonstø
würden sich noch ein paar sparen.Java 8,
1271159795 BytesErläuterung:
Probieren Sie es hier aus.
quelle
C #, 166 Bytes
Ich bin sicher, es gibt noch viel zu golfen, aber ich habe gerade keine Zeit.
Probieren Sie es online!
Voll / Formatierte Version:
quelle
(((c-32)*(t.Substring(0,l)[i]-32))%95)+32)
kann sein((c-32)*(t.Substring(0,l)[i]-32)%95+32)
(könnte die Eltern dort vermasselt haben ... es sieht aus wieCommon Lisp, 99 Bytes
Probieren Sie es online!
quelle
Japt , 24 Bytes
Gibt eine Zeichenfolge mit nachgestellten Nullzeichen (
\u0000
) zurück, wenn die erste Eingabe länger als die zweite ist.Probieren Sie es online! mit dem
-Q
Flag, um die formatierte Ausgabe einschließlich der Nullzeichen anzuzeigen.Führen Sie alle Testfälle mit meinem WIP-CodePen aus.
quelle
Python 2 ,
9573 BytesProbieren Sie es online!
quelle
(((ord(x[i])-32)*(ord(y[i])-32))%95)+32
=>(ord(x[i])-32)*(ord(y[i])-32)%95+32
Kohle , 30 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Ich habe die Berechnung tatsächlich so geschrieben,
(32 - ord(q)) * (32 - ord(h))
weil sie fortlaufende numerische Literale vermeidet, aber ich denke, ich hätte(ord(q) - ord(" ")) * (ord(h) - ord(" "))
stattdessen einfach schreiben können .quelle
Perl 5 , 95 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Pip , 19 Bytes
Nimmt die Zeichenfolgen als Befehlszeilenargumente. Probieren Sie es online!
Erläuterung
quelle
Faktor 45
Es ist ein Zitat (Lambda),
call
das mit zwei Zeichenfolgen auf dem Stapel die neue Zeichenfolge auf dem Stapel belässt.Als ein Wort:
quelle
K (oK) , 26 Bytes
Lösung:
Probieren Sie es online!
Beispiel:
Erläuterung:
Die Auswertung erfolgt von rechts nach links:
quelle
PHP, 112 Bytes
quelle
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);
Ich bin mir auch nicht ganz sicher, ob das Ersetzen&&
durch&
möglicherweise auch in PHP möglich ist, und reduziere es um ein anderes Byte auf 108 .JavaScript (ES6), 89 Byte
Javascript und der Fluch der langen Funktionsnamen ...
Mit currying und die Tatsache , dass
charCodeAt
Erträge ,NaN
wenn sie mit einer ungültigen Position genannt. In der Ausgabe können Nullen nachgestellt sein.Prüfung
quelle