Wprowadzenie
Podczas nauki próbowałem wymyślić kilka sposobów, aby oszukać test wielokrotnego wyboru. Zasadniczo jest to skompresowana wersja odpowiedzi wielokrotnego wyboru. Metoda wygląda następująco:
Odpowiedzi na test:
BCAABABA
Można je przekonwertować na 3 różne tablice, co wskazuje prawda lub fałsz, jeśli bieżąca litera jest odpowiedzią:
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]
Interpretacja tych liczb jako binarnych bardzo by to skompresowała. Ale można to nieco bardziej skompresować. Jeśli znasz pozycje A i B, nie potrzebujesz pozycji dla C. Można to zrobić za pomocą bitowego operatora NOT:
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]
Konwersja tablic A i B na liczby binarne spowoduje:
A: 00110101
B: 10001010
Oznacza to, że 8 odpowiedzi wielokrotnego wyboru można skompresować do dwóch bajtów!
Zadanie
Biorąc pod uwagę dwie liczby binarne lub dwie tablice składające się tylko z zer i jedynek o tej samej długości, wypisz odpowiedzi wielokrotnego wyboru
Zasady
- Dane wejściowe mogą mieć dowolną formę, taką jak
[1, 0, 0, 1]
lub1001
. - Możesz podać program lub funkcję.
- Możesz założyć, że dane wejściowe są zawsze prawidłowe.
- Możesz również wyprowadzać dane jako listę, oddzielone spacjami itp.
- Odpowiedzi wielokrotnego wyboru składają się tylko z A, B i C. Zamiast tego możesz jednak użyć małych liter.
- To jest golf golfowy , więc wygrywanie z najmniejszą ilością bajtów wygrywa!
Przypadki testowe
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
Tabela liderów
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.
. Sześć bajtów. Pobij to.Odpowiedzi:
Galaretka,
76 bajtówPisanie na telefonie. Dodanie opisu.(1,0)
idzie doA
,(0,1)
doB
i(0,0)
doC
. Tablice w galarecie są oparte na 1, a funkcja indeksowaniaị
działa cyklicznie. Dlatego możemy po prostu złożyć odejmowanie na wejściu.Wypróbuj tutaj .
źródło
Siatkówka , 44 bajty
Końcowe podawanie linii jest znaczące. Dane wejściowe są jak
Wypróbuj online!
Wyjaśnienie
Zacznij od zamiany
0
s naB
i1
s naA
. To sprawia, że pierwsza połowa jest poprawna, z wyjątkiem tego, że podaje,B
kiedy powinna ona zawieraćC
. Możemy zidentyfikować te błędneB
s, sprawdzając, czy jestB
w tej samej pozycji drugiego ciągu:Lookahead to klasyczna technika liczenia grup bilansujących, która dopasowuje pozycje dwóch
B
s. Do(.)*
liczy przyrostek po pierwszeB
przez naciśnięcie jednego wychwytywanie na grupy1
dla każdego znaku. Potem(?<-1>.)*
znowu wyskakuje z tej grupy. W$
gwarantuje, że możemy dotrzeć do końca łańcucha tak, i(?(1)!)
zapewnia, że mamy rzeczywiście wyczerpany całą grupę.Wreszcie pozbywamy się przestrzeni oddzielającej i drugiego ciągu:
źródło
J, 8 bajtów
Stosowanie:
Wypróbuj online tutaj.
źródło
JavaScript ES6, 36 bajtów
Bardzo prosty i pewnie oczywiste, wystarczy, aby zrozumieć: Mapa każdy element i wskaźnik w
a
do char w pozycji (x*2
+ pozycja w indeksiey
wb
) w"CBA"
.źródło
CBA
to zrobić. Poza tym nie może, bodo
to słowo zastrzeżone, więc to nieprawidłowa składnia.MATL ,
149 bajtówWykorzystuje aktualną wersję (10.1.0)
Wypróbuj online!
Wyjaśnienie
Podsumowanie działania kodu
Szczegółowe wyjaśnienie, jak to działa
źródło
Java, 81 bajtów
Nie ma reputacji, aby komentować już istniejące rozwiązanie Java, więc oto:
źródło
pieprzenie mózgu, 52 bajty
Wymaga interpretera, który pozwala odejść w lewo od komórki 0 i ma 8-bitowe zawijanie komórek. W przeciwieństwie do większości moich odpowiedzi zachowanie EOF nie ma znaczenia.
Pobiera dane bajtowe, z
0xFF
ogranicznikiem. Strumień bajtów reprezentujących pierwsze dane wejściowe w „Przypadkach testowych” wyglądałby tak:Mógłbym zaoszczędzić kilka bajtów przez posiadające
0x00
jako ogranicznik i korzystania0x01
i0x02
jako 0 i 1, odpowiednio, ale czułem się jak oszukuje: PPo opracowaniu strategii napisanie tego programu było bardzo łatwe. Aby znaleźć n-tą literę na wyjściu, zacznij od
0x43
(duża C w ASCII) i odejmij ((n-ty element pierwszej sekwencji) * 2 + n-ty element drugiej sekwencji)Oto, co warto, oto 52-bajtowy program podzielony na 3 linie i kilka słów obok nich:
źródło
Haskell, 29 bajtów
Anonimowa funkcja. Użyj jak:
Próbowałem sprawić, by funkcja nie była punktowa, ale dostałem totalny bałagan.
źródło
zipWith((!!).(["CB","AC"]!!))
Pyth,
181610 bajtów3 rd próby: 10 bajtów
Dziękujemy FryAmTheEggman za przypomnienie mi o istnieniu
G
!Dane wejściowe mają postać [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], która jest zasadniczo macierzą: wiersz do wyboru i kolumna dla numeru pytania.
Ręcznie skompilowany pseudokod pythonowy:
2 nd próba: 16 bajtów
Dane wejściowe mają postać [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], która jest zasadniczo macierzą: wiersz do wyboru i kolumna dla numeru pytania.
To kompiluje się do
Ok, wiem, że to wygląda na bałagan, więc skompilujmy ręcznie do pseudokodu pythonowego
1 st próba: 18 bajtów
Po wprowadzeniu formularza [0,0,1,1,0,1,0,1,1,0,0,0,1,0,1,0], zasadniczo połączenie dwóch list. To kompiluje się do
Ponownie, kompilacja ręcznie
I jest pierwszy codegolf w moim życiu !!! Właśnie wczoraj nauczyłem się Pyth i po raz pierwszy uczestniczyłem w golfie kodowym.
źródło
.)
w golfae
i myślę, że można grać w golfa jeszcze bardziej. Rozważ zmienną,G
która zawiera małe litery, uważam, że możesz uzyskać do niej około 10 bajtów, życząc udanej gry w golfa! :)Python 3, 39 bajtów.
Zaoszczędzono 1 bajt dzięki FryAmTheEggman.
Zaoszczędzono 2 bajty dzięki histocratowi.
Od jakiegoś czasu nie byłem w stanie rozwiązać problemu za pomocą jednej wkładki!
Oto moje przypadki testowe. Pokazuje także sposób, w jaki zakładam, że ta funkcja jest wywoływana.
Używa
zip
do iteracji parami tablic, a następnie indeksuje w łańcuch, aby wybrać odpowiednią literę. Wszystko to dzieje się na liście, więc automatycznie staje się listą. Rdzeniem tego rozwiązania jest to, że jedynymi możliwymi kombinacjamia
ib
są[0, 1], [1, 0], [0, 0]
. Więc jeśli je odejmiemy, otrzymamy jeden,-1, 0, 1
który dostanie odpowiednio ostatni, pierwszy, środkowy element.źródło
Mathematica,
30242219 bajtów3 bajty zapisane z powodu @alephalpha .
Całkiem proste.
źródło
{A,B,C}[[3-2#-#2]]&
Rubin, 35 bajtów
Stosowanie:
Pobiera (xy) znak „CAB” o indeksie zero. (1-0) daje 1, a zatem A. (0-0) daje 0, a zatem C. (0-1) daje -1, co otacza B.
Alternatywne krótsze rozwiązanie z wyjściem Weirdera:
Dane wyjściowe są cytowane ciągami oddzielonymi znakami nowej linii, co wydaje się w jakiś sposób za daleko pomostem.
źródło
Japt, 13 bajtów
Wypróbuj online!
Jak to działa
źródło
Oktawa, 19 bajtów
Test:
Wyjaśnię to później, gdy będę miał przed sobą komputer. Zostało to napisane i przetestowane w oktawie online w mojej komórce.
źródło
TI-BASIC,
5957503736 bajtówPobiera jedną listę z
Ans
, a drugą zPrompt L₁
. Oszczędność 13 bajtów dzięki sugestii Thomasa Kwy, aby przejść z rozgałęzienia nasub(
.Muszę poszukać tego, co powiedział Thomas Kwa w komentarzach jutro. ¯ \ _ (ツ) _ / ¯
źródło
Prompt L₁
sięPrompt X
iL₁
z∟X
. Jest jeszcze więcej, ale pozwolę ci to znaleźć.Rdza, 79
Zaoszczędzono 8 bajtów dzięki Shepmaster.
Zaoszczędzono 23 bajty dzięki ker.
Jestem przekonany, że można to bardzo pograć w golfa, ale po raz pierwszy piszę pełny program Rust.
Oto niepoznany kod i przypadki testowe na wypadek, gdyby ktoś chciał spróbować go zmniejszyć.
Podejście jest dość podobne do mojej odpowiedzi w Pythonie. Główną różnicą jest to, że nie mogę bezpośrednio indeksować ciągów, więc nie mogę tego zrobić
c-d
.źródło
a[0]
ia[1]
jako dwa oddzielne argumenty.64-y-2*x
triku z rozwiązania Octave pozwala zaoszczędzić sporo bajtów, ponieważ możnau8
zamiast tego użyćusize
: is.gd/GNPK76Vitsy, 40 bajtów
westchnienie Moje dziecko nie zostało stworzone do manipulacji tablicami.
Oczekuje wkładu poprzez STDIN (coś, czego nigdy nie robię) z prowadzeniem
"
.Objaśnienie w (wkrótce dostępnym) trybie pełnym:
Ludzie stają się coraz lepsi. Przykro mi z powodu jego obecnej długości.
Zasadniczo traktuję dane wejściowe jako ciąg, a następnie manipuluję stamtąd.
Wypróbuj online!
źródło
W
!W
technicznie jest to konieczne).CJam, 10 bajtów
Wprowadź jako listę dwóch list, np
Sprawdź to tutaj.
Wyjaśnienie
Traktując pary jako bity liczby bazowej 2, otrzymujemy
2
zaA
,1
zaB
i0
zaC
.źródło
Python 3,
4845 bajtówMyślałem, że mam eleganckie rozwiązanie, a potem zobaczyłem odpowiedź @ Organ Thrapp ...
edycja: Zapisano trzy bajty dzięki wyżej wymienionym.
lambda *x:[a*'A'or b*'B'or'C'for a,b in zip(*x)]
źródło
lamba*x:
. Zawsze myślę, że jest tak kompaktowy, jak to tylko możliwe, wtedy dostaję informacje / znajduję jeszcze więcej sztuczek. Naprawdę podoba mi się twoje rozwiązanie przy okazji, bardzo fajnie.Java,
13112211090 bajtówEDYCJA: Podziękowania dla Bifz / FlagAsSpam za pomoc i inspirację
Pierwsze przesłanie, naiwne rozwiązanie Java. Można prawie na pewno poprawić :)źródło
==1
może być>0
; byłoby również lepiej, abyś wrócił o niż drukował.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 bajty)? Nie potrzebujesz deklaracji statycznej dla funkcji.R
2916 bajtówusunąłem deklarację funkcji, ponieważ widziałem, że jest to powszechne w innych konkursach.
źródło
PowerShell, 40 bajtów
Pobiera dane wejściowe jako dwie wyraźne tablice, np.
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)
i przechowuje je w$a
i$b
. Następnie pętli$a
z$a|{...}
. W każdej pętli wyprowadzamy znak zindeksowany do łańcucha"CBA"
, przy czym indeks jest określany przez dwukrotność bieżącej wartości$_
, plus wartość$b
indeksowana przez naszą zmienną pomocniczą, która została dodana, a następnie odjęta.Na przykład dla pierwszego przypadku testowego
$a = @(1,0,0,1,0,0,1)
i$b = @(0,1,0,0,1,0,0)
. Pierwsza pętla iteracji$_ = 1
,$d = $null
(ponieważ$d
nie został wcześniej zadeklarowanej). Dodaliśmy do$d
tego teraz$_ = 1
i$d = 1
(w PowerShell,$null + 1 = 1
), co oznacza, że$b[1-1] = $b[0] = 0
. Następnie2 * 1 + 0 = 2
indeksujemy"CBA"[2]
lubA
.źródło
𝔼𝕊𝕄𝕚𝕟, 12 znaków / 22 bajty
Try it here (Firefox only).
Wyjaśnienie
Tłumaczy na Javascript ES6 as
źródło
R
3634 bajtówZapisano dwa bajty, usuwając niepotrzebne nawiasy klamrowe
źródło
Perl 5–47
Masz już 30 odpowiedzi i żadnego perla? Oto naiwna pierwsza próba :-) Tylko funkcja:
Stosowanie:
Jestem prawie pewien, że przy pomocy wyrażeń regularnych można zrobić coś lepszego, ale nie mogłem znaleźć sposobu.
źródło
JavaScript ES6, 75 bajtów
Poszedłem o krok dalej, aby zaakceptować argumenty całkowite zamiast argumentów tablicowych.
Wyjaśnienie:
Podziękowania dla @ETHproductions za logikę indeksowania ciągów.
Przetestuj tutaj
Pssst
W przypadku 3 dodatkowych bajtów może wyświetlić reprezentację maksymalnie 30 odpowiedzi:
źródło
Siatkówka, 46 bajtów
Łączy dwa ciągi i wybiera litery zgodnie z parami cyfr.
Wypróbuj online tutaj.
źródło
Lua, 87 bajtów
Po prostu testujemy wartości w tablicach i łączymy
A
,B
lubC
.źródło
F #, 33 bajtów
Jest to częściowo zastosowana funkcja, która pobiera dwie sekwencje int - dwie tablice działają dobrze - i zwraca nową sekwencję znaków reprezentujących poprawne odpowiedzi. =)
źródło
Poważnie, 14 bajtów
Wypróbuj online
Prawdopodobnie z powodu błędu w wersji interpretera w trybie awaryjnym, musisz dodać znak
X
, aby działał poprawnie w wersji online. Pobierz wersję lokalną, aby powyższy program działał poprawnie w obecnej postaci.Jest za krótki, aby uzasadnić pełne wyjaśnienie, więc powiem tylko: używa tego samego algorytmu, co odpowiedź Jelly.
źródło