Dies basiert auf xkcd # 153 .
Erstellen Sie ein Programm oder eine benannte Funktion, die zwei Parameter akzeptiert, von denen jeder eine Zeichenfolge oder eine Liste oder ein Array von Bytes oder Zeichen ist. Der zweite Parameter enthält nur Zeichen lrfu
(oder die entsprechenden ASCII-Bytes). Es sollte als eine Reihe von Anweisungen interpretiert werden, die an einer durch den ersten Parameter dargestellten Bitfolge ausgeführt werden sollen.
Die durchgeführte Verarbeitung muss der folgenden entsprechen:
- Konvertieren Sie den ersten Parameter in einen einzelnen Bitstring, der durch Verketten der Bits jedes Zeichens gebildet wird (interpretiert als einer von 7-Bit-ASCII, einem 8-Bit-erweiterten ASCII oder einer Standard-Unicode-Codierung). Wenn beispielsweise der erste Parameter lautet,
"AB"
ist dies einer von 10000011000010
(7-Bit), 0100000101000010
(8-Bit oder UTF-8) 00000000010000010000000001000010
oder 01000001000000000100001000000000
(UTF-16 in den beiden Endiannessen) usw.
- Führen Sie für jedes Zeichen im zweiten Parameter der Reihe nach die entsprechende Anweisung aus:
l
dreht den Bitstring nach links. ZB 10000011000010
wird 00000110000101
.
r
dreht den Bitstring nach rechts. ZB 10000011000010
wird 01000001100001
.
f
kippt (oder invertiert) jedes Bit in der Bitfolge. ZB 10000011000010
wird 01111100111101
.
u
kehrt die Bitfolge um. ZB 10000011000010
wird 01000011000001
.
- Konvertieren Sie den Bitstring in einen ASCII-String, der ein Zeichen pro Bit verwendet. ZB
10000011000010
wird "10000011000010"
. Dies liegt daran, dass nicht allen Sätzen von 7/8 Bits ein Zeichen zugewiesen ist.
Beispiel (in Python):
>>> f("b", "rfu")
01110011
Es verwandelt sich "b"
in seine 8-Bit-ASCII-Binärdarstellung 01100010
, dreht es nach rechts ( 00110001
), dreht jedes Bit ( 11001110
) um und kehrt es um ( 01110011
).
Flexibilität
Andere Zeichen anstelle der Zeichen verwendet werden können l
, r
, f
, und u
, aber sie müssen eindeutig dokumentiert werden.
Anzeigetafel
Vielen Dank an @Optimizer für die Erstellung des folgenden Code-Snippets. Klicken Sie zur Verwendung auf "Code-Snippet anzeigen", scrollen Sie nach unten und klicken Sie auf "► Code-Snippet ausführen".
var QUESTION_ID = 45087; var answers = [], page = 1;var SCORE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;function url(index) {return "http://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=votes&site=codegolf&filter=!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";}function getAnswers() {$.ajax({url: url(page++),method: "get",dataType: "jsonp",crossDomain: true,success: function (data) {answers.push.apply(answers, data.items);if (data.has_more) getAnswers();else process()}});}getAnswers();function shouldHaveHeading(a) {var pass = false;try {pass |= /^(#|<h).*/.test(a.body_markdown);pass |= ["-", "="].indexOf(a.body_markdown.split("\n")[1][0]) > -1;} catch (ex) {}return pass;}function shouldHaveScore(a) {var pass = false;try {pass |= SCORE_REG.test(a.body_markdown.split("\n")[0]);} catch (ex) {}return pass;}function getRelDate(previous) {var current = Date.now();var msPerMinute = 60 * 1000;var msPerHour = msPerMinute * 60;var msPerDay = msPerHour * 24;var msPerMonth = msPerDay * 30;var msPerYear = msPerDay * 365;var elapsed = current - previous;if (elapsed < msPerMinute) {return Math.round(elapsed/1000) + ' seconds ago';}if (elapsed < msPerHour) {return Math.round(elapsed/msPerMinute) + ' minutes ago';}if (elapsed < msPerDay ) {return Math.round(elapsed/msPerHour ) + ' hours ago';}if (elapsed < msPerMonth) {return 'approx. ' + Math.round(elapsed/msPerDay) + ' days ago';}if (elapsed < msPerYear) {return 'approx. ' + Math.round(elapsed/msPerMonth) + ' months ago';}return 'approx. ' + Math.round(elapsed/msPerYear ) + ' years ago';}function process() {answers = answers.filter(shouldHaveHeading);answers = answers.filter(shouldHaveScore);answers.sort(function (a, b) {var aB = +(a.body_markdown.split("\n")[0].match(SCORE_REG) || [Infinity])[0],bB = +(b.body_markdown.split("\n")[0].match(SCORE_REG) || [Infinity])[0];return aB - bB});answers.forEach(function (a) {var answer = $("#answer-template").html();answer = answer.replace("{{BODY}}", a.body).replace("{{NAME}}", a.owner.display_name).replace("{{REP}}", a.owner.reputation).replace("{{VOTES}}", a.score).replace("{{DATE}}", new Date(a.creation_date*1e3).toUTCString()).replace("{{REL_TIME}}", getRelDate(a.creation_date*1e3)).replace("{{POST_LINK}}", a.share_link).replace(/{{USER_LINK}}/g, a.owner.link).replace('{{img}}=""', "src=\"" + a.owner.profile_image + '"');answer = $(answer);if (a.is_accepted) {answer.find(".vote-accepted-on").removeAttr("style");}$("#answers").append(answer);});}
body { text-align: left !important}
<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="answers"></div><div id="answer-template" style="display: none"><div class="answer" ><table><tbody><tr><td class="votecell"><div class="vote"><span style="cursor: pointer;" title="Total Votes" itemprop="upvoteCount" class="vote-count-post ">{{VOTES}}</span><span style="display: none" class="vote-accepted-on load-accepted-answer-date" title="The question owner accepted this as the best answer">accepted</span></div></td><td class="answercell"><div class="post-text" itemprop="text">{{BODY}}</div><table class="fw"><tbody><tr><td class="vt"><div class="post-menu"><a href="{{POST_LINK}}" title="short permalink to this answer" class="short-link">share</a></div></td><td class="post-signature" align="right"><div class="user-info "><div class="user-action-time">answered <span title="{{DATE}}" class="relativetime">{{REL_TIME}}</span></div><div class="user-gravatar32"></div><div class="user-details"><br></div></div></td><td class="post-signature" align="right"><div class="user-info user-hover"><div class="user-action-time"></div><div class="user-gravatar32"><a href="{{USER_LINK}}"><div class="gravatar-wrapper-32"><img {{img}} alt="" height="32" width="32"></div></a></div><div class="user-details"><a href="{{USER_LINK}}">{{NAME}}</a><br><span class="reputation-score" title="reputation score " dir="ltr">{{REP}}</span></div></div></td></tr></tbody></table></td></tr></tbody></table></div></div>
"rrfrburb"
? Wenn man Bits verschiebt oder umkehrt, macht man das auch für jeden einzelnen Buchstaben oder die Zeichenfolge als Ganzes? Weitere Testfälle würden es klarer machen.Antworten:
CJam,
3432 BytesFür Anweisungen werden die folgenden Zeichen verwendet:
Die Eingabe erfolgt von STDIN mit dem Wort in der ersten Zeile und der Anweisungszeichenfolge in der zweiten Zeile.
Testen Sie es hier.
Erläuterung
Das Abrufen der Bitfolge ist eigentlich nur eine Frage der Interpretation der Zeichencodes als Ziffern einer Basis-256-Zahl (und des Abrufs ihrer Basis-2-Darstellung). Das Schwierige ist, dass die letztere Basiskonvertierung das Ergebnis nicht mit Nullen auf der linken Seite auffüllt. Daher füge ich der anfänglichen Eingabe eine führende 1 hinzu und spalte diese 1 dann in der Binärdarstellung erneut ab. Als ein Beispiel, wenn der Eingang ist
ab
, I wiederum , dass in einer Anordnung[1 'a 'b]
, interpretieren , dass als Base-256 (Zeichen automatisch in Zeichencodes umgewandelt werden), der90466
und der zur Basis 2, die ist[1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0]
. Wenn ich jetzt nur diese Leitung entferne,1
habe ich den Bitstream, den ich suche.Das macht dieser Teil des Codes:
Jetzt lese ich die Liste der Anweisungen und führe einen Block für jedes Zeichen in der Anweisungszeichenfolge aus:
Das erste , was zu tun ist , den Charakter und die tatsächlichen Zahlen zu bewerten
0
,1
,2
oder3
. Nun die wahre Golfmagie ... Abhängig von der Anweisung möchte ich einen kurzen Code ausführen, der die Operation implementiert:Ich könnte diese in einem Array von Blöcken speichern und den richtigen Block zum Ausführen auswählen, aber das Codieren in einer Zeichenfolge ist tatsächlich kürzer:
Zuerst verwende ich die mit der Anweisung verknüpfte Ganzzahl, um den Anfang der Zeichenfolge abzuschneiden. Bei Linksdrehung bleibt die Zeichenfolge unverändert, bei Rechtsdrehung wird das erste Zeichen verworfen und so weiter. Dann wähle ich jedes vierte Zeichen aus der Zeichenfolge aus, beginnend mit dem ersten, mit
4%
. Beachten Sie, wie die vier Codefragmente in der Zeichenfolge verteilt sind. Zum Schluss bewerte ich den String einfach als Code mit~
.Die Bitfolge wird am Ende des Programms automatisch gedruckt.
quelle
1m<
eher als(+
? Sie arbeiten eher an einem Array als an einer Zahl, nicht wahr?CJam, 34 Bytes
Ein anderer Ansatz in CJam.
Der Eingabetext befindet sich in der ersten Zeile und die Anweisungen in der zweiten Zeile.
Anleitung:
quelle
f~
aber nicht umgesetzt wird, oder? ;)Pyth 33
Verwendet:
Pyth Github
Probieren Sie es hier online aus.
Dies ist ein Programm, das die Zeichenfolge als erstes Argument und die Befehlszeichenfolge als zweites Argument verwendet. In der Online-Version sollten Sie die Zeichenfolgen durch einen Zeilenumbruch trennen, wie folgt:
Erläuterung:
Etwas, in das ich mich nicht ganz hineinquetschen konnte: Pyth's verwendet
reduce
automatischG
für den vorherigen Wert undH
für den nächsten Wert.quelle
lrfu
, aber sie müssen klar dokumentiert werden." (Hervorhebung von mir)Scala - 192
quelle
Matlab (166 Bytes)
Dies verwendet Buchstaben
abcd
anstelle vonlrfu
jeweils.Einige hier verwendete Tricks, um Platz zu sparen:
abcd
Buchstaben läßt mich subtrahieren97
einmal, und dann die Buchstaben werden0
,1
,2
,3
. Dies spart Platz in denswitch
-case
Klauseln.circshift
als anonyme Ein-Buchstaben-Funktion spart außerdem Platz, da sie zweimal verwendet wird.D
aus'0'
und'1'
Zeichen (ASCII-Codes48
und49
) besteht, entspricht die AnweisungD=char(97-D)
der Inversion zwischen'0'
und'1'
Werten. Beachten Sie, dass dies97
nichts mit dem oben genannten zu tun hat.'
wird anstelle von Transponierung verwendet.'
.quelle
Python 2 - 179
quelle
C #, 418 Bytes
Formatiert:
quelle
J, 164
Formatiert:
Beispiel
quelle
JavaScript (E6), 163
167Vollständige Nutzung der Eingabeflexibilität, eine benannte Funktion mit 2 Array-Parametern.
Die Funktion gibt eine Zeichenfolge zurück, die aus '1' und '0' besteht.
Beispiel
f("b", "rfu")
übersetzen inF([98],[82,70,85])
, Ergebnis ist0111001
Beachten Sie, dass die Verwendung von Zeichenfolgen in Javascript viel länger dauert! Bytezahl 186
Beispiel
F("b", "RFU")
, Ergebnis ist0111001
wiederquelle
Ruby, 151
Ziemliech direkt. Schleifen durch die Charaktere
s
und führen eine Aktion für einen von ihnen aus.quelle
Python 2, 142
Ähnlich wie bei meiner Python-Antwort im Ansatz: Ich erstelle eine Liste aller Zeichenfolgen und indiziere sie basierend auf dem Wert der Anweisungszeichenfolge, die ich mit reduct iteriere.
Verwendet:
quelle