Ziel dieser Herausforderung ist es, die kürzeste Funktion / das kürzeste Programm zu schreiben, um Eingabetext zu erfassen, ihn mit der folgenden Methode zu verschlüsseln und das Ergebnis zurückzugeben.
Als Beispiel verwende ich die Zeichenfolge hello world
.
Holen Sie sich zunächst den Eingabetext.
hello world
Zweitens konvertieren Sie die Zeichenfolge in ternäre (Basis 3). Verwenden Sie diesen Schlüssel:
a = 000
b = 001
c = 002
d = 010
e = 011
f = 012
g = 020
...
w = 211
x = 212
y = 220
z = 221
[space] = 222
Mit dieser Taste hello world
wird 021011102102112222211112122102010
, wie unten zu sehen.
h e l l o w o r l d
021 011 102 102 112 222 211 112 122 102 010
Verschieben Sie drittens die erste Ziffer an das Ende.
021011102102112222211112122102010
becomes
210111021021122222111121221020100
Viertens konvertieren Sie die Zahl mit demselben Schlüssel wieder in eine Zeichenfolge.
210 111 021 021 122 222 111 121 221 020 100
v n h h r n q z g j
Zuletzt geben Sie den verschlüsselten Text zurück.
vnhhr nqzgj
Hier sind einige Beispieltexte und deren Ausgabe:
the turtle ==> dvo fh ego
python ==> uudwqn
code golf ==> hpjoytqgp
Da dies Codegolf ist, gewinnt der kürzeste Eintrag in Bytes . Fehler sind zulässig, wenn einige der Zeichen keine Kleinbuchstaben oder Leerzeichen sind. Dies ist meine erste Herausforderung, daher wären Vorschläge mehr als hilfreich.
Viel Glück!
Bestenliste:
var QUESTION_ID=54643;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>
quelle
uint64
mit zunehmenden Potenzen von in eine große Ganzzahl ( ) zu packen27
. Die Verschiebung um eine Ziffer würde dann dem Multiplizieren dieser großen ganzen Zahl mit entsprechen3
, und die Einführung der ersten Ziffer am anderen Ende wäre einfach eine Addition. Aber es gibt Komplikationen, wie das Verwerfen des letzten "Carry" (möglicherweise über einemod
Operation), und ich konnte es nicht mit wenigen Bytes zum Laufen bringenAntworten:
Pyth,
2322 BytesProbieren Sie es online aus: Regular Input / Test Suite
Vielen Dank an @isaacg für ein Byte.
Erläuterung:
quelle
G
anstattN
z=+Gd
.Pyth, 26 Bytes
Versuchen Sie es online im Pyth Compiler / Executor: demo | Testfälle
Idee
Angenommen, alle eingegebenen Zeichen wurden bereits den in Schritt 2 angegebenen Ganzzahlen zugeordnet.
Für jede dreistellige ternäre Zahl gilt xyz 3 = 9x + 3y + z , sodass die modulare Division durch 9 den Quotienten x und den Rest 3y + z ergibt .
Wenn die Eingabe abc 3 def 3 ghi 3 ist , ergibt das Anwenden einer modularen Division auf jedes a, 3b + c, d, 3e + f, g, 3h + i .
Nachdem Sie die Liste um eine Einheit nach links gedreht haben, können Sie die ganzen Zahlen in Paare gruppieren. Dies ergibt die Liste (3b + c, d), (3e + f, g), (3h + i, a) .
Wenn wir nun (3y + z, w) von der Basis 3 in eine ganze Zahl konvertieren , erhalten wir 3 (3y + z) + w = 9y + 3z + w = zyw 3 .
Daher von Paaren zu der Liste Basisumwandlung Anwendung gibt uns bcd 3 efg 3 HIA 3 , die zum Drehen der verketteten ternären Ziffern eine Einheit nach links genau das Ergebnis ist.
Sie müssen nur noch die resultierenden Ganzzahlen den Zeichen zuordnen.
Code
quelle
Python 2, 96
Wandelt ein Zeichen
c
auf einen Wertx
alsx=(ord(c)-97)%91
mit dem Modulo nur Raum beeinflusst es die umgekehrte Umwandlung zu 26 zu konvertieren isti
zuchr((i-26)%91+32)
, mit der Modulo nur beeinflusseni=26
, um es Räume worden.Wir durchlaufen die Zeichen und notieren den aktuellen Wert
x
und den vorherigen Werty
. Wir verwenden die letzten beiden ternären Ziffern vony
, gefunden alsy%9
und die erste ternäre Ziffer vonx
, gefunden alsx/9
. Der Wert der Verkettung isty%9*3+x/9
. Es gibt wahrscheinlich einige Optimierungen, die diese Arithmetik mit dem Verschieben97
und Fixieren des Raums kombinieren .Wir machen diese Schleife um, wir kehren zum ersten Zeichen der Zeichenkette am Ende zurück. Wir führen auch eine Vorbereitungsschleife durch, um einen vorherigen Wert
y
einzuschreiben, wobei das Zeichen für die erste Schleife unterdrückt wird, wenny
es noch nicht initialisiert wurde.quelle
CJam,
3929 BytesDas Coole an diesem ist, dass es nicht einmal eine Basiskonvertierung verwendet.
Probieren Sie es online aus .
Mir wurde gerade klar, dass ich genau die gleiche Idee hatte wie Jakubes Pyth-Antwort. Ich habe diesen CJam-Code tatsächlich nach Pyth portiert, bevor ich seinen Beitrag gesehen habe, der 25 Bytes umfasst. Da es mein erstes Pyth-Golf war, denke ich, ist es nicht so schlimm.
Erläuterung
quelle
CJam,
302927 BytesProbieren Sie es online im CJam-Interpreter aus .
Der Ansatz ist der gleiche wie in meiner anderen Antwort , die ein Port dieses Codes zu Pyth ist.
Wie es funktioniert
quelle
Pyth,
3029 Bytes1 Byte dank @Jakube gespeichert.
Live-Demo und Testfälle.
quelle
Javascript (ES6), 175 Byte
Ein Einzeiler!
"Überbeanspruchung der variablen
v
Auszeichnung, jemand?"Update: Verwendet jetzt nur die genannten Variablen
v
, für völlige Verwirrung!Danke @vihan für das Speichern von 6 Bytes!
Danke @Neil für das Speichern von 27 Bytes !!
Definiert eine anonyme Funktion. Fügen Sie zur Verwendung
v=
vor dem Code einen Namen für die Funktion ein und nennen Sie sie wie folgtalert(v("hello world"))
quelle
.slice(-3)
6 Bytes speichern. An diesem Punkt können Sie ein"00"+v
weiteres Byte speichern. (Sie könnten mit einer Vorlage verketten, aber die resultierende Länge ist die gleiche.).map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))
then becomes.map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1))
.Julia,
149137 bytesMy first golf!
(partially) ungolfed:
quelle
=
rather thanin
for loops and you can useb[1]
in place ofb[1:1]
. You also don't need a space between closing parens andfor
.=
, butb[1]
returns a character, which can't be appended to a string with*
.for
trick is nifty. You can also have it directly after a close quote. I didn't realize the parser was that flexible.end
.Javascript (ES6),
178,172, 170Replaced Math.floor with a bitwise or. Created an anonymous function. If I'm understanding correctly, this should fix my noobishness somewhat (thanks Dennis!) and get me another 2 bytes down.
quelle
Julia,
169166 bytesUngolfed + explanation:
quelle
Haskell, 160 bytes
Ugh, this feels way too lengthy, but at least I'm... beating Python somehow. And Ruby.
quelle
Javascript (ES6),
141124120 bytesBelieve it or not.... :-)
As with my other answer, this is an anonymous function, and needs to be assigned to a variable before it can be used. Try it here:
Show code snippet
I thought I might be able to shave a couple bytes off my previous answer by using a different technique, so I started out with one similar to Tekgno's and golfed my head off from there. I initialized some variables in the function's argument section, and again stuffed everything into a
.map
function. Then I realized theString.fromCharCode
would be much more efficient outside the.map
. After all was said and done, I had shaved off more than3045 bytes!Edit 1: 17 Bytes gespart
.replace
, indem das s mit einer Technik entfernt wurde, die der Python-Lösung von xnor ähnelt.OK, vielleicht ist es Zeit, sich einer anderen Herausforderung zu stellen ...
quelle
Python 2,
182180 BytesDiese Lösung ist nicht ideal, da das Ersetzen sehr kostspielig ist. Versuchen Sie herauszufinden, wie Sie dies vermeiden können.
Eingabe ist wie
"hello world"
.quelle
Mathematica, 162 Bytes
(Re) Verwenden von a
Rule
zum Konvertieren der Ziffernlisten in Zeichen und zurück.quelle
Javascript (ES6), 179 Byte
Requisiten an Vihan für den
.match
Regex.quelle
Rubin, 177
Benötigt mindestens Ruby 1.9 für die
each_char
Methodequelle
Java,
458449 BytesEs hat mich ein wenig traurig gemacht, festzustellen, dass ich 10 Bytes abschneiden kann, wenn ich keine Java 8 - Streams verwende
map()
Methode verwendete.Hier ist die Golfversion:
Hier ist eine viel weniger golfene Version. Es soll lesbar sein, aber ich gebe keine Garantie.
Dieses Programm verwendet die zu konvertierende Zeichenfolge als Befehlszeilenargument. Wenn Ihre Eingabe Leerzeichen enthalten soll, müssen Sie sie in doppelte Anführungszeichen setzen.
Ich wollte ein Beispiel für die Verwendung dieses Befehls über die Befehlszeile bereitstellen, konnte diesen Code jedoch nicht für die Arbeit außerhalb von Eclipse verwenden. Ich habe nie gelernt, Java von der Kommandozeile aus zu benutzen ^ _ ^; Sie können dies wahrscheinlich problemlos in der IDE Ihrer Wahl zum Laufen bringen.
quelle
Javascript (ES6),
181180 BytesDies ist eine anonyme Funktion, daher muss ihr ein Name zugewiesen werden, bevor sie verwendet werden kann. (ZB
encrypt=t=>...
) Probieren Sie es hier aus:Code-Snippet anzeigen
Ich begann mit der Verwendung mehrerer Variablen und
for
Schleifen anstelle von.map
. Ich habe es dann auf jede erdenkliche Weise ausprobiert, ohne den Algorithmus zu ändern, wodurch ich ungefähr 217 Bytes hatte. Nachdem ich mir die Antwort von UndefinedFunction angesehen hatte, schaffte ich es, sie auf 195 zu bringen, und einige Überprüfungen von Dendrobiums Antwort ergaben, dass weitere 14 Golfspieler verloren hatten.Soweit ich weiß, kann ich nicht weiter gehen, oder mein Ergebnis wäre praktisch identisch mit dem von Dendrobium (außer, dass es ein Zeichen kürzer ist!). Kann jemand den Ort finden, an dem ich ein Zeichen gespeichert habe? :-)
Vorschläge sind wie immer gerne willkommen!
quelle
Matlab, 113 Bytes
Die Eingabe erfolgt über stdin.
Beispiel:
quelle
Julia -
92876154 BytesUngolfed:
Der Trick kann Sie verwirren. Das Subtrahieren von 6 verschiebt 'a' nach dem Mod auf Null. Das Hinzufügen von 9 * 65 entspricht dem Hinzufügen von 65 zu v1 + v2, was Teil des Prozesses zum Wiederherstellen der Werte auf ihre ASCII-Werte ist. Sie könnten ersetzen
i=t%91+579
miti=t%91-6
, und ersetzen Sie dannN=(v1+v2)%91+32
mitN=(v1+v2+65)%91+32
dem gleichen Ergebnis zu bekommen, aber es erfordert ein zusätzliches Zeichen.quelle