Menyontek tes pilihan ganda


41

pengantar

Saat belajar, saya mencoba menemukan beberapa cara untuk menipu tes pilihan ganda. Ini pada dasarnya adalah versi terkompresi dari jawaban pilihan ganda. Metode ini sebagai berikut:

Jawaban tes:

BCAABABA

Ini dapat dikonversi menjadi 3 array yang berbeda, yang menunjukkan benar atau salah jika huruf saat ini adalah jawabannya:

    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]

Menafsirkan angka-angka ini sebagai biner akan banyak mengompres ini. Tapi ini sebenarnya bisa dikompres lebih sedikit. Jika Anda mengetahui posisi A dan B, Anda tidak perlu posisi untuk C. Hal ini dapat dilakukan dengan operator BUKAN bitwise:

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]

Mengubah array A dan B ke angka biner akan menghasilkan:

A: 00110101
B: 10001010

Itu berarti 8 jawaban pilihan ganda dapat dikompres menjadi dua byte!


Tugas

Diberikan dua angka dalam biner, atau dua array yang hanya terdiri dari 0 dan 1 dengan panjang yang sama, menampilkan jawaban pilihan berganda


Aturan

  • Input dapat dalam bentuk apa pun yang Anda suka, suka [1, 0, 0, 1]atau 1001.
  • Anda dapat menyediakan program atau fungsi.
  • Anda dapat mengasumsikan bahwa input selalu valid.
  • Anda juga dapat menampilkan sebagai daftar, dipisahkan dengan spasi, dll.
  • Jawaban pilihan ganda hanya terdiri dari A, B dan C. Namun Anda dapat menggunakan huruf kecil sebagai gantinya.
  • Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!

Uji kasus

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

Papan peringkat

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
Ini solusinya. Ini ditulis dalam bahasa Inggris (juru bahasa tersedia secara bebas di mana pun Anda berada), dan sekarang Study.. Enam byte. Kalahkan itu.
Conor O'Brien

58
@ CᴏɴᴏʀO'Bʀɪᴇɴ Sedihnya, bahasa Inggris tidak memenuhi standar bahasa pemrograman kami dan karenanya bukan pengajuan yang valid: p
Adnan

17
Anda sebenarnya dapat mengompres delapan pertanyaan pilihan ganda menjadi 1,625 byte (13 bit) dengan menginterpretasikan jawaban sebagai basis 3, jadi secara teknis ini bukan metode yang paling efisien. : P
Gagang Pintu

4
Anda dapat menambahkan jawaban lain di ruang yang sama dengan menggunakan keempat kombinasi dua bit, 00, 01, 10, 11 untuk jawaban a, b, c atau d. Anda tidak menggunakan 11.
Filip Haglund

5
Bahasa Inggris memenuhi semua kriteria. Satu-satunya masalah adalah tidak ada juru bahasa yang tersedia sebelum pertanyaan ini diajukan.
jimmy23013

Jawaban:


50

Jelly, 7 6 byte

_/ị“ḃ»

Mengetik di ponsel. Akan menambah deskripsi.

(1,0)pergi ke A, (0,1)ke B, dan (0,0)ke C. Array dalam Jelly berbasis 1, dan fungsi pengindeksan bekerja secara siklis. Karena itu, kita bisa melipatgandakan pengurangan atas input.

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

Coba di sini .


54
bagaimana Anda mengetiknya di telepon? oO
Conor O'Brien

34
Sejarah clipboard Samsung. Itu tidak mudah.
lirtosiast

9
: -DD Dan selamat atas 10k!
Luis Mendo

7
Lol, ukurannya sama dengan bahasa Inggris sekarang @ CᴏɴᴏʀO'Bʀɪᴇɴ
RK.

13
Saya memasukkan jawaban saya ke "Belajar"; Saya menggunakan penerjemah yang tidak masalah dengan kesalahan tata bahasa. @RK.
Conor O'Brien

12

Retina , 44 byte

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

Linefeed tambahan sangat penting. Inputnya seperti

001101010 100010100

Cobalah online!

Penjelasan

T`d`BA

Mulailah dengan mengubah 0menjadi Bdan 1menjadi A. Yang membuat babak pertama benar, kecuali bahwa itu daftar Bketika harus berisi C. Kami dapat mengidentifikasi mereka yang salah Bdengan memeriksa apakah ada Bdi posisi yang sama dari string kedua:

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

The lookahead adalah teknik penghitungan grup penyeimbang klasik untuk menyesuaikan posisi keduanya B. The (.)*jumlah akhiran setelah yang pertama Bdengan mendorong satu capture ke kelompok 1untuk masing-masing karakter. Kemudian (?<-1>.)*muncul dari grup itu lagi. The $memastikan bahwa kita dapat mencapai akhir dari string seperti itu, dan (?(1)!)memastikan bahwa kita sudah benar-benar habis seluruh kelompok.

Akhirnya, kita menyingkirkan ruang pemisah dan string kedua:

 .+


1
3 peningkatan dalam 15 detik pertama postingan; itu pasti semacam catatan.
Conor O'Brien

8
@ CᴏɴᴏʀO'Bʀɪᴇɴ Menyanjung, tapi saya ingin tahu berapa banyak dari mereka yang benar-benar membaca dan mengerti jawabannya dalam 15 detik. : /
Martin Ender

4
Aku melakukannya. Saya agak lancar membaca regex dan retina.
Conor O'Brien


11

JavaScript ES6, 36 byte

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

Sangat sederhana, dan mungkin cukup jelas untuk dipahami: Memetakan setiap item dan mengindeks ake char at position ( x*2+ item at index yin b) di "CBA".


7
Silakan tambahkan ini sebagai versi tanpa ungolfed Anda: 3
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Dia CBAmelakukan itu. Juga, dia tidak bisa, karena dokata kunci yang dipesan, jadi itu sintaks yang tidak valid.
Patrick Roberts

@ Patrick memperbaiki sederhana: Lakukan (...)
Conor O'Brien

11

MATL , 14 9 byte

2*+ 67w-c

Menggunakan versi saat ini (10.1.0)

Cobalah online!

Penjelasan

Ringkasan apa yang dikerjakan kode

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

Penjelasan terperinci tentang cara kerjanya

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.

Ini luar biasa! Bisakah Anda menulis lebih banyak tentang mengapa ini berhasil? Kenapa 67? Dan bagaimana cara mengalikan array input dengan 2 dan kemudian menambahkan array input berbeda dari 'multiply input array by 3'?
Vincent

1
@Vincent Sure! Saya akan menambahkan beberapa penjelasan lebih rinci di kemudian hari
Luis Mendo

@Vincent Done! Beri tahu saya jika ini lebih jelas sekarang
Luis Mendo

10

Java, 81 byte

Tidak ada reputasi untuk mengomentari solusi Java yang sudah ada, jadi begini:

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

1
Ini cerdas. : Saya suka. Saya melihat bahwa Anda mendapat sedikit inspirasi. ;)
Addison Crump

1
Sial, itu pintar. Saya menghabiskan waktu lama untuk mencari tahu bagaimana saya bisa mendapatkan loop foreach agar sesuai ...
CameronD17

9

brainfuck, 52 byte

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

Membutuhkan juru bahasa yang memungkinkan Anda belok kiri dari sel 0 dan memiliki sel pembungkus 8-bit. Tidak seperti kebanyakan jawaban saya, perilaku EOF tidak masalah.

Mengambil input byte, dengan 0xFFsebagai pembatas. Aliran byte yang mewakili input pertama di bawah "Kasus uji" akan terlihat seperti ini:

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

Saya bisa menyimpan beberapa byte dengan memiliki 0x00sebagai pembatas dan menggunakan 0x01dan 0x02sebagai 0 dan 1 masing-masing, tapi rasanya seperti curang: P

Setelah saya menemukan strategi saya, menulis program ini sangat mudah. Untuk menemukan huruf ke-n untuk keluaran, mulailah dengan 0x43( huruf kapital C dalam ASCII) dan kurangi ((elemen ke-1 dari urutan pertama) * 2 + elemen ke-ke-urutan ke-2 dari urutan ke-2

Untuk apa nilainya, inilah program 52 byte yang dibagi menjadi 3 baris dan dengan beberapa kata di sampingnya:

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 byte

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

Fungsi anonim. Gunakan seperti:

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

Saya mencoba membuat fungsi point-free tetapi mendapat kekacauan total.


6
versi point-free dengan panjang yang sama:zipWith((!!).(["CB","AC"]!!))
nimi

8

Pyth, 18 16 10 byte

3 rd mencoba: 10 bytes

Terima kasih FryAmTheEggman untuk mengingatkan saya tentang keberadaan G!

VCQ@<G3xN1

Input berupa [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], yang pada dasarnya adalah sebuah matriks: baris untuk pilihan dan kolom untuk nomor pertanyaan.

Kode pseudocode yang disusun dengan tangan:

              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 upaya: 16 bytes

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

Input berupa [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], yang pada dasarnya adalah sebuah matriks: baris untuk pilihan dan kolom untuk nomor pertanyaan.

Ini mengkompilasi ke

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")))

Ok, saya tahu itu terlihat berantakan, jadi mari kita tangan-kompilasi ke pseudocode pythonic

                 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 upaya: 18 bytes

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

Dengan input formulir [0,0,1,1,0,1,0,1,1,0,0,0,0,1,0,1,0], pada dasarnya gabungan dari dua daftar. Ini mengkompilasi ke

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")))

Sekali lagi, kompilasi dengan tangan

                   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")

Dan inilah codegolf pertama dalam hidup saya !!! Saya baru belajar Pyth kemarin, dan ini adalah pertama kalinya saya berpartisipasi dalam golf kode.


Selamat Datang di Programming Puzzles dan Code Golf! Ini terlihat sangat bagus untuk pertama kalinya, +1
Adnan

Selalu menyenangkan melihat seseorang belajar Pyth! Anda dapat golf .)untuk menjadi e, dan saya pikir itu bisa golfed cukup sedikit lebih. Pertimbangkan variabel Gyang berisi huruf kecil, saya yakin Anda bisa menggunakan sekitar 10 byte, senang bermain golf! :)
FryAmTheEggman

@FryAmTheEggman oh e! Saya mencari itu selama beberapa menit! Juga, terima kasih telah mengingatkan saya pada G. Kamu benar, 10 byte!
busukxuan

7

Python 3, 39 byte.

Disimpan 1 byte berkat FryAmTheEggman.
Disimpan 2 byte berkat histokrat.

Belum dapat menyelesaikan dengan satu liner dalam beberapa saat!

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

Ini kasus pengujian saya. Ini juga menunjukkan cara saya mengasumsikan fungsi ini disebut.

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']

Ini digunakan zipuntuk beralih melalui array berpasangan, dan kemudian indeks menjadi string untuk memilih huruf yang benar. Ini semua terjadi dalam pemahaman daftar, sehingga secara otomatis menjadi daftar. Inti dari solusi ini adalah bahwa kombinasi hanya mungkin dari adan byang [0, 1], [1, 0], [0, 0]. Jadi jika kita mengurangi mereka, kita mendapatkan salah satu -1, 0, 1yang membuat kita elemen terakhir, pertama, tengah masing-masing.



5

Ruby, 35 byte

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

Pemakaian:

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

Mengambil (xy) karakter nol-diindeks "CAB" (1-0) memberi 1, dan dengan demikian A. (0-0) memberi 0, dan dengan demikian C. (0-1) memberi -1, yang membungkus ke B.

Alternatif solusi lebih pendek dengan output lebih aneh:

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

Keluaran dikutip string yang dipisahkan oleh baris baru, yang tampaknya jembatan terlalu jauh.


4

Japt, 13 byte

¡#C-X*2-VgY)d

Cobalah online!

Bagaimana itu bekerja

¡#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

Oktaf, 19 byte

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

Uji:

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

Saya akan menambahkan penjelasan nanti ketika saya memiliki komputer di depan saya. Ini ditulis dan diuji pada oktaf-online di sel saya.


4

TI-BASIC, 59 57 50 37 36 byte

Mengambil satu daftar dari Ans, dan yang lainnya dari Prompt L₁. Disimpan 13 byte berkat saran Thomas Kwa untuk beralih dari percabangan ke sub(.

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

Saya harus mencari apa yang dikatakan Thomas Kwa yang dia temukan di komentar besok. ¯ \ _ (ツ) _ / ¯


Anda masih memiliki beberapa byte untuk disimpan! Ganti Prompt L₁dengan Prompt Xdan L₁dengan ∟X. Masih ada lagi, tetapi saya akan membiarkan Anda menemukannya.
lirtosiast

@ThomasKwa L1 adalah token satu byte, terakhir saya periksa. Merujuknya lagi dengan daftar + x akan menjadi dua byte ... apakah saya tidak benar?
Conor O'Brien

L1 adalah dua byte.
lirtosiast

@ThomasKwa Oh. Dang.
Conor O'Brien

Saya menghitung 37 byte seperti saat ini. (Anda bisa mendapatkan 35.)
lirtosiast

4

Rust, 79

Disimpan 8 byte berkat Shepmaster.
Disimpan 23 byte berkat ker.

Saya yakin ini bisa bermain golf banyak, tapi ini pertama kalinya saya menulis program Rust penuh.

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

Berikut adalah kode yang tidak disatukan dan uji kasus jika ada yang ingin mencoba mengecilkannya.

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]]));
}

Pendekatannya sangat mirip dengan jawaban Python saya. Perbedaan utama adalah bahwa saya tidak dapat secara langsung mengindeks string, jadi saya tidak dapat melakukan c-dtriknya.


apakah sah menggunakan penutupan bukan fungsi? maka Anda bisa melewati semua jenis dalam deklarasi dan hanya lulus a[0]dan a[1]sebagai dua argumen terpisah.
oli_obk

juga menggunakan 64-y-2*xtrik dari solusi Octave menghemat beberapa byte karena dapat menggunakan u8alih-alih usize: is.gd/GNPK76
oli_obk

@ Bah saya tidak sepenuhnya yakin tentang menggunakan penutupan. Saya akan menganggap itu baik-baik saja, karena pada dasarnya itu adalah fungsi anonim, bukan?
Morgan Thrapp

selama Anda tidak menangkap lingkungan apa pun itu persis seperti fungsi anonim.
oli_obk

@ ya Lalu, penutupan harus baik-baik saja.
Morgan Thrapp

4

Vitsy, 40 byte

desah Bayi saya tidak dibuat untuk melakukan manipulasi array.

Mengharapkan masukan melalui STDIN (sesuatu yang tidak pernah saya lakukan) dengan pemimpin ".

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

Penjelasan dalam mode verbose (segera tersedia):

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;

Ini akan segera bermain golf dengan lebih baik, kawan. Saya minta maaf untuk panjangnya saat ini.

Pada dasarnya, saya memperlakukan input sebagai string, dan kemudian memanipulasi dari sana.

Cobalah online!


: O Tidak bisa menunggu hingga mode verbose. Itu akan menarik. Seperti penggunaan W!
Conor O'Brien

@Adnan Ini adalah tab input di tryitonline, tetapi pada penerjemah lokal, cukup jalankan program dan masukan setiap set 0 dan 1 dengan leading "dan baris baru saat program sedang berjalan (secara Wteknis cepat)
Addison Crump

Ahh, saya memberi input di bagian argumen: p. Jawaban yang bagus :)
Adnan

@ Adnan Butuh waktu beberapa saat untuk mencari tahu ini - input autoparses Vitsy jika mengakui bahwa itu ganda. Secara teknis Anda dapat memiliki apa pun yang memimpin kecuali untuk angka, dan itu akan berfungsi sama.
Addison Crump

Heh, itu agak aneh, tapi di sisi lain itu bisa berguna.
Adnan

3

CJam, 10 byte

'Cq~z2fbf-

Masukan sebagai daftar dua daftar, mis

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

Uji di sini.

Penjelasan

Memperlakukan pasangan sebagai bit dari nomor basis-2, kita dapatkan 2untuk A, 1untuk Bdan 0untuk 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 byte

Saya pikir saya punya solusi yang elegan, lalu saya melihat jawaban @Morgan Thrapp ...

sunting: Disimpan tiga byte berkat yang disebutkan di atas.

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 bagus. Tidak melihat lamba*x:. Saya selalu berpikir itu kompak seperti yang bisa saya diberitahu / menemukan lebih banyak trik. Saya sangat suka solusi Anda btw, sangat bagus.
Ogaday

3

Java, 131 122 110 90 byte

EDIT: Terima kasih kepada Bifz / FlagAsSpam untuk bantuan dan inspirasi

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++;}}

Pengajuan pertama, solusi Java naif. Hampir bisa dipastikan ditingkatkan :)

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);} 


==1bisa >0; akan lebih baik bagi Anda untuk mengembalikan o daripada mencetak.
lirtosiast

Bagaimana dengan: 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 byte)? Anda tidak perlu deklarasi statis pada fungsi.
Addison Crump

Anda harus mendeklarasikan saya terlebih dahulu, +4 byte: D
Bifz

3

R 29 16 byte

LETTERS[3-2*A-B]

menghapus deklarasi fungsi karena saya melihat itu biasa di kontes lain.


2

PowerShell, 40 Bytes

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

Mengambil input sebagai dua array eksplisit, mis. 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), dan menyimpannya di $adan $b. Selanjutnya, lewati $adengan $a|{...}. Setiap loop, kami menampilkan karakter yang diindeks ke dalam string "CBA", dengan indeks diputuskan oleh dua kali nilai saat ini $_, ditambah nilai $bdiindeks oleh variabel pembantu kami yang telah ditambahkan sebelumnya kemudian dikurangi.

Sebagai contoh, untuk test case pertama, $a = @(1,0,0,1,0,0,1)dan $b = @(0,1,0,0,1,0,0). Iterasi loop pertama telah $_ = 1, $d = $null(karena $dsebelumnya belum dideklarasikan). Kami menambahkan sebelumnya $djadi sekarang $_ = 1dan $d = 1(di PowerShell, $null + 1 = 1), artinya $b[1-1] = $b[0] = 0. Lalu 2 * 1 + 0 = 2, jadi kami indeks "CBA"[2], atau A.



2

R 36 34 byte

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

Dua byte yang disimpan menghapus kawat gigi yang tidak perlu


Anda dapat menyimpan dua byte dengan menghapus kawat gigi dalam definisi fungsi. Mereka tidak perlu karena badan fungsi terdiri dari satu pernyataan.
Alex A.

2

Perl 5 - 47

Sudah 30 jawaban dan tidak ada perl? Berikut ini adalah upaya pertama yang naif :-) Hanya fungsinya:

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

Pemakaian:

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

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

Saya cukup yakin bahwa sesuatu yang lebih baik dapat dilakukan dengan regex, tetapi saya tidak dapat menemukan caranya.


1

JavaScript ES6, 75 byte

Saya berusaha lebih keras untuk menerima argumen integer alih-alih argumen array.

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

Penjelasan:

(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

Kredit ke @ETHproduksi untuk logika pengindeksan string.

Tes di Sini

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>

Pssst

Untuk 3 byte tambahan, dapat menampilkan representasi hingga 30 jawaban:

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

1

Retina, 46 byte

^
%
+`%(.)(.* )(.)
$1$3,%$2
10
A
01
B
00
C
\W
[empty line]

Menggabungkan dua string dan memilih huruf sesuai dengan pasangan digit.

Cobalah online di sini.


1

Lua, 87 Bytes

Cukup menguji nilai-nilai dalam array, dan menggabungkan A, Batau 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 byte

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

Itu fungsi yang diterapkan sebagian yang mengambil dua urutan int - dua array berfungsi dengan baik - dan mengembalikan urutan karakter baru yang mewakili jawaban yang benar. =)


1

Serius, 14 byte

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

Cobalah secara Online

Mungkin karena bug dalam versi safe mode dari juru bahasa, Anda harus menambahkan Xagar dapat berfungsi dengan benar di versi online. Unduh versi lokal untuk menjalankan program di atas dengan benar apa adanya.

Terlalu pendek untuk menjamin penjelasan lengkap, jadi saya akan mengatakan: menggunakan algoritma yang sama dengan jawaban Jelly.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.