Einführung
Während des Studiums habe ich versucht, mehrere Möglichkeiten zu finden, um einen Multiple-Choice-Test zu betrügen. Es ist im Grunde eine komprimierte Version der Multiple-Choice-Antworten. Die Methode sieht wie folgt aus:
Die Antworten zum Test:
BCAABABA
Diese können in 3 verschiedene Arrays konvertiert werden, was "wahr" oder "falsch" anzeigt, wenn der aktuelle Buchstabe die Antwort ist:
B C A A B A B A
A: [0, 0, 1, 1, 0, 1, 0, 1]
B: [1, 0, 0, 0, 1, 0, 1, 0]
C: [0, 1, 0, 0, 0, 0, 0, 0]
Das Interpretieren dieser Zahlen als binär würde dies sehr komprimieren. Dies kann aber tatsächlich etwas mehr komprimiert werden. Wenn Sie die Positionen von A und B kennen, brauchen Sie die Positionen für C nicht. Dies kann mit einem bitweisen NOT-Operator erfolgen:
A: [0, 0, 1, 1, 0, 1, 0, 1]
B: [1, 0, 0, 0, 1, 0, 1, 0]
A+B: [1, 0, 1, 1, 1, 1, 1, 1]
C: [0, 1, 0, 0, 0, 0, 0, 0]
Das Konvertieren der Arrays A und B in Binärzahlen würde ergeben:
A: 00110101
B: 10001010
Das bedeutet, dass 8 Multiple-Choice-Antworten auf zwei Bytes komprimiert werden können!
Aufgabe
Bei zwei binären Zahlen oder zwei Arrays, die nur aus Nullen und Einsen mit derselben Länge bestehen, werden die Multiple-Choice-Antworten ausgegeben
Regeln
- Die Eingabe kann in jeder beliebigen Form erfolgen, wie
[1, 0, 0, 1]
oder1001
. - Sie können ein Programm oder eine Funktion bereitstellen.
- Sie können davon ausgehen, dass die Eingabe immer gültig ist.
- Sie können auch eine Liste ausgeben, die durch Leerzeichen usw. getrennt ist.
- Die Multiple-Choice-Antworten bestehen nur aus A, B und C. Sie können jedoch stattdessen Kleinbuchstaben verwenden.
- Das ist Code-Golf , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!
Testfälle
Input: [1, 0, 0, 1, 0, 0, 1] [0, 1, 0, 0, 1, 0, 0]
Output: ABCABCA
Input: [0, 0, 0, 0, 1, 0, 1, 1] [1, 0, 1, 0, 0, 0, 0, 0]
Output: BCBCACAA
Input: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Output: CCCCCCCCCC
Bestenliste
var QUESTION_ID=69770,OVERRIDE_USER=34388;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 commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important;font-family:Arial}#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>
Study.
. Sechs Bytes. Schlag das.Antworten:
Gelee,
76 BytesTippen am Telefon. Beschreibung wird hinzugefügt.(1,0)
geht zuA
,(0,1)
zuB
und(0,0)
zuC
. Arrays in Jelly basieren auf 1, und die Indexierungsfunktionị
arbeitet zyklisch. Deshalb können wir die Subtraktion einfach über die Eingabe klappen.Probieren Sie es hier aus .
quelle
Retina , 44 Bytes
Der Zeilenvorschub am Ende ist signifikant. Eingabe ist wie
Probieren Sie es online!
Erläuterung
Beginnen Sie, indem Sie
0
s inB
und1
s in drehenA
. Das macht die erste Hälfte richtig, abgesehen davon, dass es auflistet,B
wann es enthalten sollteC
. Wir können diese fehlerhaftenB
s identifizieren, indem wir prüfen, ob sich einB
in derselben Position der zweiten Zeichenfolge befindet:Der Lookahead ist eine klassische Zählmethode für Bilanzkreise, um die Positionen der beiden
B
Sektoren abzugleichen. Das(.)*
Suffix nach dem erstenB
wird gezählt, indem1
für jedes Zeichen ein Capture auf die Gruppe gedrückt wird. Dann(?<-1>.)*
taucht die Gruppe wieder auf. Die$
sorgt dafür , dass wir das Ende der Schnur so erreichen können, und die(?(1)!)
sicherstellt , dass wir haben die ganze Gruppe tatsächlich erschöpft.Zum Schluss werden der Trennungsraum und die zweite Zeichenkette entfernt:
quelle
J, 8 Bytes
Verwendungszweck:
Probieren Sie es hier online aus.
quelle
JavaScript ES6, 36 Byte
Sehr einfach und wahrscheinlich verständlich genug: Ordnen Sie jedes Element und jeden Index
a
dem Zeichen an der Position (x*2
+ Element am Indexy
inb
) in zu"CBA"
.quelle
CBA
das machen. Außerdem kann er es sowieso nicht, dado
es sich um ein reserviertes Schlüsselwort handelt. Das ist also eine ungültige Syntax.MATL ,
149 BytesVerwendet die aktuelle Version (10.1.0)
Probieren Sie es online!
Erläuterung
Zusammenfassung der Funktionen des Codes
Detaillierte Erklärung, wie es funktioniert
quelle
Java, 81 Bytes
Kein Ruf, die bereits vorhandene Java-Lösung zu kommentieren, also hier geht's:
quelle
Brainfuck, 52 Bytes
Benötigt einen Interpreter, mit dem Sie von Zelle 0 nach links gehen können und der 8-Bit-Umbruchzellen hat. Im Gegensatz zu den meisten meiner Antworten spielt das EOF-Verhalten keine Rolle.
Übernimmt die Byteeingabe
0xFF
als Begrenzer. Ein Bytestrom, der die erste Eingabe unter "Testfälle" darstellt, würde folgendermaßen aussehen:Ich könnte ein paar Bytes sparen, indem ich
0x00
als Begrenzer und mit0x01
und0x02
als 0 und 1, aber das fühlte sich an wie Betrug: PSobald ich meine Strategie herausgefunden hatte, war es sehr einfach, dieses Programm zu schreiben. Um den n-ten auszugebenden Buchstaben zu finden, beginnen Sie mit
0x43
(Großbuchstaben C in ASCII) und subtrahieren Sie ((n-tes Element der ersten Folge) * 2 + n-tes Element der zweiten Folge).Für das, was es wert ist, ist hier das 52-Byte-Programm, aufgeteilt in 3 Zeilen und mit einigen Wörtern daneben:
quelle
Haskell, 29 Bytes
Eine anonyme Funktion. Verwenden Sie wie:
Ich habe versucht, die Funktion ohne Punkte zu machen, aber es gab ein totales Durcheinander.
quelle
zipWith((!!).(["CB","AC"]!!))
Pyth,
181610 Bytes3 rd versuchen: 10 Bytes
Vielen Dank an FryAmTheEggman, der mich an die Existenz von erinnert hat
G
!Die Eingabe hat die Form [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], die im Wesentlichen eine Matrix: Zeile ist zur Auswahl und Spalte zur Fragennummer.
Handkompilierter pythonischer Pseudocode:
2 nd Versuch: 16 Bytes
Die Eingabe hat die Form [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], die im Wesentlichen eine Matrix: Zeile ist zur Auswahl und Spalte zur Fragennummer.
Dies kompiliert zu
Ok, ich weiß, dass das chaotisch aussieht, also lassen Sie uns per Hand zu pythonischem Pseudocode kompilieren
1 st Versuch: 18 Bytes
Bei Eingabe der Form [0,0,1,1,0,1,0,1,1,0,0,1,0,1,0] im wesentlichen Verkettung zweier Listen. Dies kompiliert zu
Wieder von Hand kompilieren
Und da geht der erste Codegolf in meinem Leben !!! Ich habe gestern gerade Pyth gelernt und dies ist das erste Mal, dass ich an einem Codegolf teilgenommen habe.
quelle
.)
seine
, und ich denke , es kann ein bisschen mehr sein golfed. Betrachten Sie die Variable,G
die das Kleinbuchstaben enthält. Ich glaube, Sie können mit ihr bis zu 10 Bytes erreichen, viel Spaß beim Golfen! :)Python 3, 39 Bytes.
1 Byte dank FryAmTheEggman gespeichert.
2 Bytes dank Histokrat gespeichert.
Konnte seit einiger Zeit nicht mehr mit einem Einzeiler gelöst werden!
Hier sind meine Testfälle. Es zeigt auch, wie ich davon ausgehe, dass diese Funktion aufgerufen wird.
Es wird verwendet
zip
, um die Arrays paarweise zu durchlaufen und dann in eine Zeichenfolge zu indexieren, um den richtigen Buchstaben auszuwählen. Dies alles geschieht in einem Listenverständnis, sodass es automatisch zu einer Liste wird. Der Kern dieser Lösung ist, dass die einzig möglichen Kombinationen vona
undb
sind[0, 1], [1, 0], [0, 0]
. Wenn wir sie also subtrahieren, erhalten wir eines,-1, 0, 1
das uns das letzte, erste bzw. mittlere Element gibt.quelle
Mathematica,
30242219 Bytes3 Bytes aufgrund von @alephalpha gespeichert .
Ziemlich einfach.
quelle
{A,B,C}[[3-2#-#2]]&
Ruby, 35 Bytes
Verwendungszweck:
Nimmt das (xy) -te mit Nullen versehene Zeichen von "CAB". (1-0) ergibt 1 und damit A. (0-0) ergibt 0 und damit C. (0-1) ergibt -1, was sich um B dreht.
Alternative kürzere Lösung mit weirder Ausgabe:
Die Ausgabe erfolgt in Anführungszeichen, die durch Zeilenumbrüche getrennt sind, was irgendwie zu weit entfernt zu sein scheint.
quelle
Japt, 13 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Oktave, 19 Bytes
Prüfung:
Ich werde später eine Erklärung hinzufügen, wenn ich einen Computer vor mir habe. Dies wurde auf meinem Handy auf octave-online geschrieben und getestet .
quelle
TI-BASIC,
5957503736 BytesNimmt eine Liste aus
Ans
und die andere ausPrompt L₁
. 13 Bytes gespart dank des Vorschlags von Thomas Kwa, von der Verzweigung auf zu wechselnsub(
.Ich muss nach Thomas Kwa Ausschau halten, den er morgen in den Kommentaren gefunden hat. ¯ \ _ (ツ) _ / ¯
quelle
Prompt L₁
mitPrompt X
undL₁
mit∟X
. Es gibt noch mehr, aber ich lasse dich es finden.Rust, 79
8 Bytes dank Shepmaster eingespart.
23 Bytes dank Ker gespeichert.
Ich bin mir sicher, dass dies eine Menge Abstriche machen könnte, aber ich schreibe zum ersten Mal ein vollständiges Rust-Programm.
Hier ist der ungolfed Code und die Testfälle, falls jemand versuchen möchte, ihn zu verkleinern.
Der Ansatz ist meiner Python-Antwort ziemlich ähnlich. Der Hauptunterschied besteht darin, dass ich Strings nicht direkt indizieren kann, also kann ich den
c-d
Trick nicht ausführen.quelle
a[0]
unda[1]
als zwei separate Argumente übergeben.64-y-2*x
Trick aus der Octave-Lösung werden einige Bytes gespart, dau8
stattusize
: is.gd/GNPK76Vitsy, 40 Bytes
seufz Mein Baby wurde nicht dazu gebracht, Arrays zu manipulieren.
Erwartet eine Eingabe durch STDIN (was ich nie mache) mit einem Lead
"
.Erklärung im (bald verfügbaren) ausführlichen Modus:
Das wird bald besser, Leute. Es tut mir so leid für seine aktuelle Länge.
Grundsätzlich behandle ich die Eingabe als Zeichenfolge und bearbeite sie dann von dort aus.
Probieren Sie es online!
quelle
W
!W
technisch gesehen ist dies eine Eingabeaufforderung).CJam, 10 Bytes
Eingabe als Liste von zwei Listen, z
Teste es hier.
Erläuterung
Wenn wir die Paare als Bits einer Basis-2-Zahl behandeln, erhalten wir
2
fürA
,1
fürB
und0
fürC
.quelle
Python 3,
4845 BytesIch dachte, ich hätte eine elegante Lösung, dann sah ich die Antwort von @ Morgan Thrapp ...
edit: Speichert drei Bytes dank der oben genannten.
lambda *x:[a*'A'or b*'B'or'C'for a,b in zip(*x)]
quelle
lamba*x:
. Ich denke immer, dass es so kompakt ist, wie es nur geht, dann erfahre ich, dass ich noch mehr Tricks finde. Ihre Lösung gefällt mir übrigens sehr gut, sehr schön.Java,
13112211090 BytesEDIT: Danke an Bifz / FlagAsSpam für die Hilfe und Inspiration
Erste Einreichung, naive Java-Lösung. Kann mit ziemlicher Sicherheit verbessert werden :)quelle
==1
kann sein>0
; Es wäre auch besser für Sie, o zurückzugeben, als zu drucken.void x(int[]a,int[]b){for(int i=0;i<a.length;i++)System.out.print(a[i]>0?"A":b[i]>0?"B":"C");}
(94 Bytes)? Sie benötigen keine statische Deklaration für Funktionen.R
2916 BytesDie Funktionserklärung wurde entfernt, da ich sah, dass sie in anderen Wettbewerben üblich ist.
quelle
PowerShell, 40 Bytes
Nimmt Eingaben als zwei explizite Arrays an, z.
PS C:\Tools\Scripts\golfing> .\cheating-a-multiple-choice-test.ps1 @(1,0,0,1,0,0,1) @(0,1,0,0,1,0,0)
und speichert sie in$a
und$b
. Als nächstes durchschleifen$a
mit$a|{...}
. In jeder Schleife wird ein in die Zeichenfolge indiziertes Zeichen ausgegeben"CBA"
, wobei der Index um das Zweifache des aktuellen Werts$_
plus dem$b
von unserer Hilfsvariablen indizierten Wert , der vorab hinzugefügt und dann abgezogen wurde, festgelegt wird.Als Beispiel für den ersten Testfall
$a = @(1,0,0,1,0,0,1)
und$b = @(0,1,0,0,1,0,0)
. Die erste Schleifeniteration$_ = 1
wurde ausgeführt$d = $null
(da$d
dies zuvor nicht deklariert wurde). Wir fügen$d
dies jetzt$_ = 1
und$d = 1
(in PowerShell$null + 1 = 1
) vorab hinzu , was bedeutet, dass$b[1-1] = $b[0] = 0
. Dann2 * 1 + 0 = 2
indizieren wir also"CBA"[2]
, oderA
.quelle
𝔼𝕊𝕄𝕚𝕟 12 Zeichen / 22 Bytes
Try it here (Firefox only).
Erläuterung
Übersetzt in Javascript ES6 als
quelle
R
3634 BytesZwei Bytes gespart, um unnötige Klammern zu entfernen
quelle
Perl 5 - 47
Schon 30 Antworten und kein Perl? Hier ist dann ein naiver erster Versuch :-) Nur die Funktion:
Verwendungszweck:
Ich bin mir ziemlich sicher, dass man mit Regex etwas Besseres machen kann, aber ich konnte nicht herausfinden, wie.
quelle
JavaScript ES6, 75 Byte
Ich habe mir die Mühe gemacht, Integer-Argumente anstelle von Array-Argumenten zu akzeptieren.
Erläuterung:
Dank an @ETHproductions für die String-Indizierungslogik.
Hier testen
Pssst
Für 3 zusätzliche Bytes kann die Darstellung für bis zu 30 Antworten angezeigt werden:
quelle
Netzhaut, 46 Bytes
Führt die beiden Zeichenfolgen zusammen und wählt die Buchstaben entsprechend den Ziffernpaaren aus.
Probieren Sie es hier online aus.
quelle
Lua, 87 Bytes
Testen einfach die Werte in den Arrays und Verketten
A
,B
oderC
.quelle
F #, 33 Bytes
Dies ist eine teilweise angewendete Funktion, die zwei int-Sequenzen verwendet - zwei Arrays funktionieren einwandfrei - und eine neue Folge von Zeichen zurückgibt, die die richtigen Antworten darstellen. =)
quelle
Im Ernst, 14 Bytes
Probieren Sie es online
Wahrscheinlich aufgrund eines Fehlers in der abgesicherten Version des Interpreters müssen Sie eine hinzufügen
X
, damit dieser in der Online-Version ordnungsgemäß funktioniert. Laden Sie die lokale Version herunter, damit das obige Programm wie besehen funktioniert.Es ist zu kurz, um eine vollständige Erklärung zu geben, daher sage ich nur: Es wird derselbe Algorithmus wie für die Gelee-Antwort verwendet.
quelle