Çoktan seçmeli bir testi aldatma


41

Giriş

Okurken çoktan seçmeli bir testi aldatmanın birkaç yolunu bulmaya çalıştım. Temelde çoktan seçmeli cevapların sıkıştırılmış bir versiyonudur. Yöntem aşağıdaki gibi gider:

Teste verilen cevaplar:

BCAABABA

Bunlar, geçerli harf cevap ise doğru veya yanlış olduğunu gösteren 3 farklı diziye dönüştürülebilir:

    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]

Bu sayıları ikili olarak yorumlamak, bunu çok sıkıştırabilir. Ancak bu aslında biraz daha sıkıştırılabilir. A ve B pozisyonlarını biliyorsanız, C pozisyonlarına ihtiyacınız yoktur. Bu bit bit NOT operatörüyle yapılabilir:

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]

A ve B dizilerinin ikili sayılara dönüştürülmesi aşağıdakilerle sonuçlanır:

A: 00110101
B: 10001010

Bu, 8 çoktan seçmeli cevabın iki bayta sıkıştırılabileceği anlamına gelir!


Görev

İkilik olarak iki sayı veya aynı uzunluktaki sadece 0 ve 1 'den oluşan iki dizi göz önüne alındığında, çoktan seçmeli cevapların çıktısını alın


kurallar

  • Giriş, istediğiniz [1, 0, 0, 1]veya istediğiniz şekilde olabilir 1001.
  • Bir program veya işlev sunabilirsiniz.
  • Girişin her zaman geçerli olduğunu varsayabilirsiniz.
  • Ayrıca boşluk, vb. İle ayrılmış bir liste halinde çıktı alabilirsiniz.
  • Çoktan seçmeli cevaplar sadece A, B ve C'lerden ibarettir. Ancak bunun yerine küçük harf kullanabilirsiniz.
  • Bu , bu yüzden en az sayıda bayt olan gönderim kazanıyor!

Test durumları

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

Liderler Sıralaması

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>


75
İşte benim çözümüm. İngilizce (nerede olursanız olun serbestçe kullanılabilir tercüman ) İngilizce dilinde yazılmıştır Study.. Altı bayt. Bunun üstesinden gel.
Conor O'Brien,

58
@ CᴏɴᴏʀO'Bʀɪᴇɴ Maalesef, İngilizce bir programlama dili standartlarımıza uymuyor ve bu nedenle geçerli bir başvuru değil: p
Adnan

17
Aslında, sekiz çoktan seçmeli soruyu cevapları temel 3 olarak yorumlayarak 1.625 byte'a (13 bit) sıkıştırabilirsiniz, bu yüzden teknik olarak bu en verimli yöntem değildir. : P
Doorknob

4
A, b, c veya d cevabı için iki bitin (00, 01, 10, 11) dört kombinasyonunu da kullanarak aynı alana başka bir cevap ekleyebilirsiniz. 11'i kullanmıyorsunuz.
Filip Haglund

5
İngilizce tüm kriterleri karşılar. Tek sorun, bu soru sorulmadan önce tercüman bulunmamasıdır.
jimmy23013

Yanıtlar:


50

Jöle, 7 6 bayt

_/ị“ḃ»

Telefonla yazarak. Açıklama ekleyecektir.

(1,0)gider A, (0,1)için B, ve (0,0)için C. Jelly'teki diziler 1 tabanlıdır ve indeksleme işlevi döngüsel olarak çalışır. Bu nedenle girişin üzerinden çıkarmayı katlayabiliriz.

_              [vectorized] subtraction
_/             Fold subtraction over the input
   “ḃ»         "ABC" compressed. '»' terminates a compressed string.
  ị            Vectorized cyclic index.

Burada dene .


54
Bunu bir telefona nasıl yazdın? oO
Conor O'Brien,

34
Samsung'un panoya geçmişi. Kolay değildi.
lirtosiast,

9
: -DD Ve 10k için tebrikler!
Luis Mendo,

7
Lol, şimdi İngilizce olarak aynı boyutta @ CᴏɴᴏʀO'Bʀɪᴇɴ
RK.

13
Cevabımı "Eğitim" e atıyorum; Dilbilgisi hataları olan bir tercüman kullanıyorum. @RK.
Conor O'Brien,

12

Retina , 44 bayt

T`d`BA
B(?=(.)* .*B(?<-1>.)*(?(1)!)$)
C
 .+

Sondaki satır besleme kayda değerdir. Giriş gibidir

001101010 100010100

Çevrimiçi deneyin!

açıklama

T`d`BA

Çevirerek başlayın 0içine ler Bve 1içine s A. Bu, ilk yarısını doğru yapar, Bne zaman içermesi gerektiğini listeler C. İkinci dizgide aynı konumda Bolup olmadığını kontrol ederek bu hatalıları tespit edebiliriz B:

B(?=(.)* .*B(?<-1>.)*(?(1)!)$)
C

Görünüş, iki Bsaniyenin konumlarını eşleştirmek için kullanılan klasik bir dengeleme grubu sayma tekniğidir . (.)*Sayımları ilk sonra sonek Bgrubunun üzerine bir yakalama iterek 1her karakter için. Sonra (?<-1>.)*yine o gruptan çıkar. Bu $şekilde dizenin sonuna ulaşmamızı ve (?(1)!)gerçekte tüm grubu tüketmemizi sağlar.

Son olarak, ayırma alanından ve ikinci dizgiden kurtuluruz:

 .+


1
İlk 15 saniyede 3 kez oy verir; Bu bir tür rekor olmalı.
Conor O'Brien,

8
@ CᴏɴᴏʀO'Bʀɪᴇɴ Gurur duyuyorum ama bu üç saldırganın kaç tanesinin 15 saniyede cevabı okuduğunu ve anladığını merak ediyorum. : /
Martin Ender

4
Yaptım. Regex ve retina okuma konusunda akıcıyım.
Conor O'Brien,


11

JavaScript ES6, 36 bayt

(a,b)=>a.map((x,y)=>"CBA"[x*2+b[y]])

Çok basit ve muhtemelen belirgin yeterince anlamak için: Harita her öğe ve dizin akonumundaki char ( x*2endeksinde + madde yiçinde bolarak) "CBA".


7
Lütfen bunu ungolfed versiyonunuz olarak ekleyin: 3
Conor O'Brien,

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Bunu CBAyapmak için. Ayrıca, yine de yapamaz, çünkü doayrılmış bir anahtar kelimedir, bu yüzden bu geçersiz sözdizimi.
Patrick Roberts

@Patrick basit düzeltme: Yap (...)
Conor O'Brien,

11

MATL , 14 9 bayt

2*+ 67w-c

Geçerli sürümü kullanır (10.1.0)

Çevrimiçi deneyin!

açıklama

Kodun ne yaptığının özeti

2*       % implicitly input array and multiply it by 2
+        % implicitly input array and add it to the first one
67w-    % subtract from 67
c        % convert to char. Implicitly display

Nasıl çalıştığını ayrıntılı açıklama

2        % Push number 2 onto the stack
*        % Multiply the top two stack elements. Since there's only one
         % element, this triggers implicit input of a (yet inexistent)
         % element below the existing one. This is the first input array,
         % which will be called "A". Both "A" and number 2 are consumed,
         % and the array 2*A is left on the stack.
+        % Add the top two stack elements. Again, since there's only
         % one element (namely array 2*A) this triggers implicit input
         % of the second array, call it "B". Both 2*A and B are consumed
         % and 2*A+B is left on the stack
         % A blank space is needed after the "+" symbol to prevent it from
         % being interpreted as part of number "+67"
67       % Push number 67 onto the stack. The stack now contains, bottom
         % to top, 2*A+B and 67.
w        % Swap top two elements. The stack now contains 67 and 2*A+B
-        % Subtract top two elements. These are consumed and the result
         % 67-A*B is left on the stack
c        % Convert to char array, interpreting each number as ASCII code.
         % Number 67 corresponds to letter 'C'. Therefore at positions
         % where both arrays A and B were 0 this gives 'C' as result.
         % Where A was 1 and B was 0, i.e. 2*A+B is 2, this gives 'A'.
         % Where A was 0 and B was 1, i.e. 2*A+B is 1, this gives 'B'.
         % The stack contents, namely this char array, are implicitly
         % displayed at the end of the program.

Bu harika! Bunun neden işe yaradığı hakkında biraz daha yazabilir misiniz? Neden 67 Ve giriş dizisini 2 ile çarpıp sonra girdi dizisini eklemek 'giriş dizisini 3 ile çarp' seçeneğinden ne kadar farklıdır?
Vincent

1
@ Vincent Elbette! Günün ilerleyen saatlerinde daha ayrıntılı bir açıklama ekleyeceğim
Luis Mendo

@ Vincent Done! Şimdi daha açıksa bana haber verin
Luis Mendo

10

Java, 81 bayt

Mevcut Java çözümünü yorumlayacak ün yok, bu yüzden işte:

void x(int[]a,int[]b){int j=0;for(int i:a)System.out.printf("%c",67-2*i-b[j++]);}

1
Bu akıllıca. : DI gibi. Yine de bir sürü ilhamın olduğunu anlıyorum. ;)
Addison Crump

1
Kahretsin, bu zekice.
Yaşlarımı

9

brainfuck, 52 bayt

,+[->>----[<--->----],+]<[<[>--<-]<]>>[<,[>-<-]>.>>]

Hücre 0'dan ayrılmanıza izin veren ve 8 bitlik sarma hücreleri olan bir tercüman gerektirir. Cevaplarımın çoğundan farklı olarak, EOF davranışı önemli değil.

0xFFAyırıcı olarak bayt girişi alır . "Test senaryoları" altındaki ilk girişi temsil eden bir bayt akışı şöyle görünür:

0x01 0x00 0x00 0x01 0x00 0x00 0x01 0xFF 0x00 0x01 0x00 0x00 0x01 0x00 0x00

Ben alarak birkaç bayt kurtarabilecek 0x00ayırıcı olarak kullanarak 0x01ve 0x02sırasıyla 0 olarak ve 1 ama hile gibi bir his olduğunu: P

Stratejimi öğrendikten sonra, bu programı yazmak çok kolaydı. Çıktılan n harfi bulmak için, 0x43(ASCII’deki büyük harf C) ile başlayın ve ((ilk dizinin nth elemanı) * 2 + sequence dizinin ikinci elemanı) ile başlayın

Buna değer, işte 52 baytlık program 3 sıraya bölünmüş ve yanlarında bazı kelimeler yer almaktadır:

Get input until hitting a 255 byte; put a 67 byte to the right of each one
,+[->>----[<--->----],+]

For each 67 byte: Subtract (value to the left)*2 from it
<[<[>--<-]<]

For each byte that used to contain 67: Subtract input and print result
>>[<,[>-<-]>.>>]

9

Haskell, 29 bayt

zipWith(\x y->"BCA"!!(x-y+1))

Anonim bir işlev. Gibi kullanın:

>> zipWith(\x y->"BCA"!!(x-y+1)) [1, 0, 0, 1, 0, 0, 1] [0, 1, 0, 0, 1, 0, 0]
"ABCABCA"

Fonksiyonu noktasız hale getirmeye çalıştım ama toplamda karışıklık var.


6
eşit uzunlukta bir zipWith((!!).(["CB","AC"]!!))
noktasuz

8

Pyth, 18 16 10 bayt

3 rd girişimi: 10 bayt

Bana varlığını hatırlattığın için teşekkürler FryAmTheEggman G!

VCQ@<G3xN1

Girdi, [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]] biçiminde olup, esasen bir matrisdir: satır soru numarası için seçim ve sütun için.

El ile derlenmiş pythonic sözde kodu:

              G = "abcdefghijklmnopqrstuvwxyz"    // preinitialized var
VCQ           for N in transpose(Q):    // implicit N as var; C transposes 2D lists
   @<G3           G[:3][                // G[:3] gives me "abc"
       xN1            N.index(1)        // returns -1 if no such element
                  ]

2 nd girişimi: 16 bayt

VCQ?hN\A?.)N\B\C

Girdi, [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]] biçiminde olup, esasen bir matrisdir: satır soru numarası için seçim ve sütun için.

Bu derler

assign('Q',Pliteral_eval(input()))
for N in num_to_range(Pchr(Q)):
   imp_print(("A" if head(N) else ("B" if N.pop() else "C")))

Tamam, dağınık göründüğünü biliyorum, öyleyse hadi pythonic sözde kodunu derleyelim

                 Q = eval(input())
VCQ              for N in range transpose(Q): // implicit N as var; transposes 2D lists
   ?hN               if head(N):              // head(N)=1st element of N
      \A                 print("A")           // implicit print for expressions
                     else:
        ?.)N             if pop(N):
            \B               print("B")
                         else:
              \C             print("C")

1 st girişimi: 18 bayt

V8?@QN\A?@Q+8N\B\C

Formun girişi ile [0,0,1,1,0,1,0,1,1,0,0,0,0,1,0,1,0], aslında iki listenin birleştirilmesi. Bu derler

assign('Q',Pliteral_eval(input()))
for N in num_to_range(8):
   imp_print(("A" if lookup(Q,N) else ("B" if lookup(Q,plus(8,N)) else "C")))

Yine elle derleme

                   Q = eval(input())
V8                 for N in range(8):
  ?@QN                 if Q[N]:
      \A                  print("A")
                       else:
        ?@Q+8N            if Q[N+8]:
              \B              print("B")
                          else:
                \C            print("C")

Ve hayatımdaki ilk codegolf var !!! Dün Pyth'i yeni öğrendim ve ilk defa golf koduna katıldım.


Programlama Bulmacaları ve Code Golf'a Hoş Geldiniz! Bu ilk defa çok güzel görünüyor, +1
Adnan

Pyth öğrenen birini görmek her zaman güzeldir! .)Olmak için golf oynayabilir eve bence biraz daha golf oynayabilir. Küçük Gharfli alfabe içeren değişkeni göz önünde bulundurursanız , mutlu golf oynayarak 10 bayta ulaşabileceğinizi düşünüyorum! :)
FryAmTheEggman

@FryAmTheEggman oh e! Birkaç dakikadır onu arıyordum! Ayrıca, bana G.'yi hatırlattığın için teşekkür ederim. Haklısın, 10 bayt!
busukxuan

7

Python 3, 39 bayt.

FryAmTheEggman sayesinde 1 bayt kaydedildi.
Histocrat sayesinde 2 bayt kurtarıldı.

Bir süredir bir liner ile çözemedim!

lambda*x:['CBA'[b-a]for a,b in zip(*x)]

İşte sınav durumlarım. Ayrıca, bu işlevin çağrıldığını varsaydığım yolu da gösterir.

assert f([1,0,0,1,0,0,1], [0,1,0,0,1,0,0]) == ['A', 'B', 'C', 'A', 'B', 'C', 'A']
assert f([0, 0, 0, 0, 1, 0, 1, 1], [1, 0, 1, 0, 0, 0, 0, 0]) == ['B', 'C', 'B', 'C', 'A', 'C', 'A', 'A']
assert f([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) == ['C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C']

zipDizilerde çiftler halinde yinelemeyi kullanır ve ardından doğru harfi seçmek için dizgeye dizlenir. Bunların hepsi bir liste kavrayışında olur, böylece otomatik olarak bir liste haline gelir. Bu çözeltiye çekirdek yalnızca mümkün olduğunu ave bvardır [0, 1], [1, 0], [0, 0]. Bu yüzden eğer onları çıkarırsak, bunlardan birini -1, 0, 1sırasıyla son, ilk, orta eleman alan biz alırız .



5

Ruby, 35 bayt

->a,b{a.zip(b).map{|x,y|:CAB[x-y]}}

Kullanımı:

->a,b{a.zip(b).map{|x,y|:CAB[x-y]}}[[1,0,0],[0,1,0]]
=> ["A", "B", "C"]

"CAB" nin (xy) sıfır dizine eklenmiş karakterini alır. (1-0) 1 verir ve böylece A. (0-0) 0 verir ve böylece C (0-1) -1 verir, bu da B'ye sarılır.

Savak çıkışlı alternatif kısa çözüm:

->a,b{a.zip(b){|x,y|p :CAB[x-y]}}

Çıktı, bir şekilde çok uzak bir köprü gibi görünen, yeni satırlarla ayrılmış dizelerden alıntılanır.


4

Japt, 13 bayt

¡#C-X*2-VgY)d

Çevrimiçi deneyin!

Nasıl çalışır

¡#C-X*2-VgY)d  // Implicit: U, V = input lists
¡              // Map each item X and index Y in U to:
 #C-X*2        //  The char code of C (67), minus 2X,
       -VgY)   //  minus the item at index Y in V.
            d  //  Convert to a char code.

4

Octave, 19 bayt

@(x,y)[67-y-2*x,'']

Ölçek:

f([1 0 0 0 1 1],[0 1 0 0 0 0])
ans = ABCCAA

Önümde bir bilgisayar varken daha sonra bir açıklama ekleyeceğim. Bu benim hücremde oktav-online yazılmıştır ve test edilmiştir .


4

TI-BASIC, 59 57 50 37 36 bayt

Birini Ansdiğerinden alır Prompt L₁. Thomas Kwa'nın dallanmadan geçiş önerisi sayesinde 13 bayt kurtarıldı sub(.

Prompt X
For(A,1,dim(∟X
Disp sub("ACB",2+∟X(A)-Ans(A),1
End

Thomas Kwa'nın yarınki yorumlarda bulduğu şeyi aramalıyım. ¯ \ _ (ツ) _ / ¯


Hala kaydetmek için bazı bayt var! Değiştir Prompt L₁ile Prompt Xve L₁ile ∟X. Dahası var, ama bulmana izin vereceğim.
lirtosiast,

@ThomasKwa L1 en son kontrol ettiğim bir baytlık belirtecidir. Listeye tekrar başvurmak + x iki bayt olur ... doğru değil miyim?
Conor O'Brien,

L1 iki bayttır.
lirtosiast,

@ThomasKwa Oh. Dang.
Conor O'Brien,

Şu anda olduğu gibi 37 bayt sayıyorum. (35 alabilirsin.)
lirtosiast

4

Pas, 79

Shepmaster sayesinde 8 byte kurtarıldı.
Ker sayesinde 23 bayt kaydedildi.

Bunun çok daha iyi golf oynayabileceğine inanıyorum, ama bu ilk kez tam bir Rust programı yazıyor.

fn b(a:&[&[u8]])->Vec<u8>{a[0].iter().zip(a[1]).map(|(c,d)|67-d-c*2).collect()}

İşte kimseyi küçültmek istemesi durumunda, kodlanmamış kod ve test durumları.

fn b(a:&[&[u8]])->Vec<u8>{
    a[0].iter().zip(a[1]).map(|(c,d)|67-d-c*2).collect()
}
fn main() {
    assert_eq!("ABCABCA", b(&[&[1, 0, 0, 1, 0, 0, 1], &[0, 1, 0, 0, 1, 0, 0]]));
    assert_eq!("BCBCACAA", b(&[&[0, 0, 0, 0, 1, 0, 1, 1], &[1, 0, 1, 0, 0, 0, 0, 0]]));
    assert_eq!("CCCCCCCCCC", b(&[&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]));
}

Yaklaşım Python cevabına oldukça benziyor. Asıl fark, dizeleri doğrudan indeksleyememem, dolayısıyla c-dhileyi yapamam .


işlev yerine bir kapanma kullanmak yasal olur mu? o zaman bildiriminde her türlü atlamak olabilir ve sadece geçmesine a[0]ve a[1]iki ayrı bağımsız değişkenleri olarak.
oli_obk

Ayrıca 64-y-2*xOctave çözümünden elde edilen numarayı kullanmak u8yerine bunun yerine kullanabilmek nedeniyle bir kaç bayt kazandırır usize: is.gd/GNPK76
oli_obk

@ker Bir kapak kullanmaktan tamamen emin değilim. Tamam olduğunu varsayardım, çünkü esasen isimsiz bir işlev, değil mi?
Morgan Thrapp

Herhangi bir çevreyi yakalamadığınız sürece, tamamen isimsiz bir fonksiyona benzer.
oli_obk

@ker O zaman evet, kapatma iyi olmalı.
Morgan Thrapp

4

Vitsy, 40 bayt

içim Bebeğim dizi manipülasyonu yapmak için yapılmamış.

Bir lider ile STDIN (asla yapmadığım bir şey) üzerinden girdi bekliyor ".

WX&WXl\[68*-1+m]
?68*-2*"C"-i*O?
"B"O?X?

(Yakında mevcut) ayrıntılı modunda açıklama:

0:
STDIN;
remove top;
make new stack;
STDIN;
remove top;
push length of stack;
repeat next instruction set top times;
begin recursive area;
push 6;
push 8;
multiply top two;
subtract top two;
push 1;
add top two;
goto top method;
end recursive area;
1:
rotate right a stack;
push 6;
push 8;
multiply top two;
subtract top two;
push 2;
multiply top two;
toggle quote;
push cosine of top; // this is character literal "C"
toggle quote;
subtract top two;
push input item;
multiply top two;
output top as character;
rotate right a stack;
2:
toggle quote;
B;
toggle quote;
output top as character;
rotate right a stack;
remove top;
rotate right a stack;

Bu, yakında daha iyi golf oynuyor, millet. Şu anki uzunluğu için çok üzgünüm.

Temel olarak girdiyi bir dizge olarak ele alıyorum ve ardından oradan manipüle ediyorum.

Çevrimiçi deneyin!


: O Ayrıntılı mod kadar bekleyemezsiniz. Bu ilginç olacak. Kullanımı gibi W!
Conor O'Brien

@Adnan tryitonline içindeki giriş sekmesidir, ancak yerel tercüman üzerinde, programı çalıştırın ve programın çalıştırılması sırasında 0 ve 1'in her birini bir satır öncüsü ile "ve sonunda yeni bir satır girin ( Wteknik olarak hızlı).
Addison Crump

Ah, argümanlar bölümünde girdi verdim: p. Güzel cevap olsa :)
Adnan

@Adnan Bunu anlayabilmem biraz zaman aldı - Vitsy, çift olduğunu kabul ederse girişini otomatik yaptı. Teknik olarak, sayılar hariç, öncü bir şeye sahip olabilirsiniz ve aynı şekilde çalışır.
Addison Crump,

Heh, bu oldukça garip, ama diğer tarafta faydalı olabilir.
Adnan

3

CJam, 10 bayt

'Cq~z2fbf-

İki listenin bir listesi olarak giriş yapın, örn.

[[1 0 0 1 0 0 1] [0 1 0 0 1 0 0]]

Burada test et.

açıklama

Bir taban-2 sayının bitleri olarak çiftleri tedavi, bundan elde 2için A, 1için Bve 0için C.

'C  e# Push the character C.
q~  e# Read and evaluate input.
z   e# Transpose the pair of lists to get a list of pairs.
2fb e# Convert each pair from base 2.
f-  e# Subtract each result from the character C.

3

Python 3, 48 45 bayt

Zarif bir çözüm bulduğumu sanıyordum, sonra @Morgan Thrapp'ın cevabını gördüm ...

düzenleme: Yukarıda belirtilenler sayesinde üç bayt kaydedildi.

lambda*x:['A'*a+b*'B'or'C'for a,b in zip(*x)]

lambda *x:[a*'A'or b*'B'or'C'for a,b in zip(*x)]


Ah güzel. Görmedik lamba*x:. Her zaman söyleyebileceğim kadar kompakt olduğunu düşünüyorum. Çözümünüzü gerçekten çok sevdim, çok hoş.
Ogaday,

3

Java, 131 122 110 90 bayt

EDIT: Yardım ve ilham için Bifz / FlagAsSpam'e teşekkürler

void x(int[]a,int[]b){int j=0;for(int i:a){System.out.print(i>0?"A":b[j]>0?"B":"C");j++;}}

İlk başvuru, saf Java çözümü. Neredeyse kesinlikle geliştirilebilir :)

static String x(int[]a,int[]b){String o="";for(int i=0;i<a.length;i++)o+=a[i]>0?"A":b[i]>0?"B":"C";return(o);} 


==1olabilir >0; yazdırmak yerine geri dönmeniz daha iyi olacaktır.
lirtosiast,

Peki ya: 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 bayt)? Fonksiyonlarla ilgili statik bildirime ihtiyacınız yoktur.
Addison Crump,

Öncelikle ilan etmelisin, +4 bayt: D
Bifz

3

R 29 16 bayt

LETTERS[3-2*A-B]

diğer yarışmalarda da yaygın olduğunu gördüğümden beri işlev bildirimini kaldırdım.


2

PowerShell, 40 Bayt

param($a,$b)$a|%{"CBA"[2*$_+$b[++$d-1]]}

Girdiyi iki açık dizi olarak alır, örn. 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)Ve depolar onları içinde $ave $b. Yoluyla sonra, döngü $aile $a|{...}. Her döngüde dizgeye dizilmiş bir karakter çıktı "CBA", dizinin şimdiki değerinin iki katı kadar karar vermesi $_, artı $bönceden eklenmiş ve çıkarılmış yardımcı değişkenimiz tarafından dizine alınmış dizinin değeri .

Örnek olarak, ilk test durumu için $a = @(1,0,0,1,0,0,1)ve $b = @(0,1,0,0,1,0,0). İlk döngü yinelemesi $_ = 1, $d = $null( $ddaha önce bildirilmemiş). Bunu $dşimdi ekledik $_ = 1ve $d = 1(PowerShell'de $null + 1 = 1), bunun anlamı $b[1-1] = $b[0] = 0. O zaman 2 * 1 + 0 = 2, biz indeksleriz "CBA"[2]ya da A.



2

R 36 34 bayt

function(a,b)c('B','C','A')[a-b+2]

Gereksiz parantezleri kaldırarak iki bayt kaydedildi


İşlev tanımındaki parantezleri kaldırarak iki bayttan tasarruf edebilirsiniz. İşlev gövdesi tek bir ifadeden oluştuğu için gerekli değildir.
Alex A.

2

Perl 5 - 47

Zaten 30 cevap ve perl yok? İşte saf bir ilk denemeden sonra :-) Sadece fonksiyon:

sub x{($g,$h)=@_;map{$_?a:$h->[$i++]?b:c}@{$g}}

Kullanımı:

@f = (0, 0, 0, 0, 1, 0, 1, 1);
@s = (1, 0, 1, 0, 0, 0, 0, 0);

print x(\@f, \@s);

Regex ile daha iyi bir şeyler yapılabileceğinden eminim, ama nasıl olduğunu bulamadım.


1

JavaScript ES6, 75 bayt

Dizi argümanları yerine tamsayı argümanlarını kabul etmek için fazladan mil kullandım.

(a,b)=>[...Array(8)].map((_,n)=>'CBA'[(a&(s=128>>n)*2+b&s)/s]).join('')

Açıklama:

(a,b)=>              // input of two integers representing 8 answers (max value 255 each)
[...Array(8)]        // generates an array with 8 indices that allows .map() to work
.map((_,n)=>         // n is each index 0-7
'CBA'[...]           // reading character from string via index reference
      (...)          // grouping for division
       (a&...)       // AND operator to test if answer is A
          (s=128>>n) // calculating binary index in integer input and storing reference
       *2            // bias index in 'CBA' so truthy is 2 instead of 1
       +(b&s)        // AND operator to test if answer is B
      /s             // divide by binary index to convert AND operators to increments of 1
.join('')            // convert to string without commas

Dizgi indeksleme mantığı için @ETHproductions ödünç alın.

Burayı Test Et

f=(a,b)=>[...Array(8)].map((_,n)=>'CBA'[((a&(s=128>>n))*2+(b&s))/s]).join('');

console.log(f(0b01001001, 0b00100100));
console.log(f(0b00001011, 0b10100000));
console.log(f(0b00000000, 0b00000000));
<!-- results pane console output; see http://meta.stackexchange.com/a/242491 -->
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

Haberiniz olsun

3 ekstra bayt için, 30 cevaba kadar gösterimi görüntüleyebilir:

(a,b)=>[...Array(30)].map((_,n)=>'CBA'[((a&(s=1<<30>>n))*2+(b&s))/s]).join('')


1

Lua, 87 Bayt

Basitçe dizilerdeki değerleri test etmek ve birleştirmek A, Bveya C.

function f(a,b)s=""for i=1,#a do s=s..(0<a[i]and"A"or 0<b[i]and"B"or"C")end print(s)end

1

F #, 33 bayt

Seq.map2(fun a b->67-a*2-b|>char)

Bu, iki int dizisi alan - iki dizi iyi işleyen - ve doğru cevapları temsil eden yeni bir karakter dizisi döndüren, kısmen uygulanan bir işlevdir. =)


1

Cidden, 14 bayt

,,Z`i-"CBA"E`M

Çevrimiçi Deneyin

Muhtemelen tercümanın güvenli mod versiyonundaki bir hata nedeniyle X, çevrimiçi versiyonda çalışabilmesi için bir eklemelisiniz . Yukarıdaki programı olduğu gibi çalışmasını sağlamak için yerel sürümü indirin.

Tam bir açıklama yapmak için çok kısa, bu yüzden şunu söyleyeyim: Jelly cevabıyla aynı algoritmayı kullanıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.