โกงการทดสอบแบบปรนัย


41

บทนำ

ในขณะที่เรียนฉันพยายามคิดหลายวิธีเพื่อโกงการทดสอบแบบเลือกตอบ มันเป็นรุ่นบีบอัดของคำตอบแบบปรนัย วิธีการดังต่อไปนี้:

คำตอบสำหรับการทดสอบ:

BCAABABA

สิ่งเหล่านี้สามารถแปลงเป็น 3 อาร์เรย์ที่แตกต่างกันซึ่งบ่งชี้ว่าจริงหรือเท็จถ้าตัวอักษรปัจจุบันคือคำตอบ:

    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]

การตีความตัวเลขเหล่านี้ในรูปแบบไบนารีจะบีบอัดข้อมูลจำนวนมาก แต่สิ่งนี้สามารถบีบอัดได้อีกเล็กน้อย หากคุณรู้ตำแหน่งของ A และ B คุณไม่จำเป็นต้องมีตำแหน่งสำหรับ C ซึ่งสามารถทำได้ด้วยตัวดำเนินการ 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]

การแปลงอาร์เรย์ A และ B เป็นตัวเลขไบนารีจะส่งผลให้:

A: 00110101
B: 10001010

นั่นหมายความว่า 8 คำตอบแบบปรนัยสามารถบีบอัดได้ถึงสองไบต์!


งาน

กำหนดตัวเลขสองตัวในรูปแบบไบนารีหรือสองอาร์เรย์ประกอบด้วย 0 เท่านั้นและ 1 ที่มีความยาวเท่ากันเอาท์พุทคำตอบแบบปรนัย


กฎระเบียบ

  • การป้อนข้อมูลที่สามารถอยู่ในรูปแบบใด ๆ ที่คุณต้องการเช่นหรือ[1, 0, 0, 1]1001
  • คุณอาจให้โปรแกรมหรือฟังก์ชั่น
  • คุณอาจคิดว่าอินพุตนั้นถูกต้องเสมอ
  • คุณยังสามารถแสดงผลเป็นรายการคั่นด้วยช่องว่าง ฯลฯ
  • คำตอบแบบเลือกตอบหลายคำตอบประกอบด้วย A, B และ C เท่านั้น อย่างไรก็ตามคุณสามารถใช้ตัวพิมพ์เล็กแทนได้
  • นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!

กรณีทดสอบ

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

ลีดเดอร์บอร์ด

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
นี่คือทางออกของฉัน มันถูกเขียนในภาษาอังกฤษ (ล่ามอิสระที่มีอยู่ทุกที่ที่คุณเป็น) Study.และเป็น หกไบต์ เอาชนะสิ่งนั้น
Conor O'Brien

58
@ CᴏɴᴏʀO'Bʀɪᴇɴน่าเศร้าที่ภาษาอังกฤษไม่เป็นไปตามมาตรฐานของภาษาการเขียนโปรแกรมดังนั้นจึงไม่ใช่การส่งที่ถูกต้อง: p
Adnan

17
คุณสามารถบีบอัดคำถามแบบปรนัยแปดตัวให้เป็น 1.625 ไบต์ (13 บิต) โดยตีความคำตอบเป็นฐาน 3 ดังนั้นเทคนิคนี้ไม่ใช่วิธีที่มีประสิทธิภาพที่สุด : P
Doorknob

4
คุณสามารถเพิ่มคำตอบอื่นในพื้นที่เดียวกันโดยใช้ทั้งสี่ชุดของสองบิต, 00, 01, 10, 11 สำหรับคำตอบ a, b, c หรือ d คุณไม่ได้ใช้งาน 11.
Filip Haglund

5
ภาษาอังกฤษเป็นไปตามเกณฑ์ทั้งหมด ปัญหาเดียวคือไม่มีล่ามก่อนที่จะถามคำถามนี้
jimmy23013

คำตอบ:


50

เยลลี่, 7 6 ไบต์

_/ị“ḃ»

พิมพ์บนโทรศัพท์ จะเพิ่มคำอธิบาย

(1,0)ไปA, (0,1)ไปBและจะ(0,0) Cอาร์เรย์ในเยลลี่เป็นฐาน 1 และฟังก์ชั่นการจัดทำดัชนีทำงานแบบวนรอบ ดังนั้นเราสามารถพับการลบมากกว่าอินพุต

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

ลองมันนี่


54
คุณพิมพ์บนโทรศัพท์ได้อย่างไร? oO
Conor O'Brien

34
ประวัติคลิปบอร์ดของ Samsung มันไม่ง่ายเลย
lirtosiast

9
: -DD และขอแสดงความยินดีกับ 10k!
Luis Mendo

7
ฮ่า ๆ ขนาดเดียวกับภาษาอังกฤษตอนนี้ @ CᴏɴᴏʀO'Bʀɪᴇɴ
RK

13
ฉันอ่านคำตอบของฉันกับ "ศึกษา"; ฉันใช้ล่ามซึ่งไม่เป็นไรกับข้อผิดพลาดทางไวยากรณ์ @RK
Conor O'Brien

12

เรติน่า 44 ไบต์

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

ตัวป้อนบรรทัดต่อท้ายมีความสำคัญ อินพุตเหมือน

001101010 100010100

ลองออนไลน์!

คำอธิบาย

T`d`BA

เริ่มต้นด้วยการเปลี่ยน0s เข้าBและ1s Aเข้าไป ที่ทำให้ช่วงครึ่งปีแรกที่ถูกต้องยกเว้นว่ามันจะแสดงรายการเมื่อมันควรจะมีB Cเราสามารถระบุความผิดพลาดเหล่านั้นBได้โดยตรวจสอบว่ามีBอยู่ในตำแหน่งเดียวกันของสายอักขระที่สองหรือไม่:

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

lookahead เป็นเทคนิคกลุ่มสมดุลนับคลาสสิกเพื่อให้ตรงกับตำแหน่งของทั้งสองBs การ(.)*นับส่วนต่อท้ายหลังจากครั้งแรกBโดยการผลักจับหนึ่งไปยังกลุ่ม1สำหรับแต่ละตัวละคร จากนั้น(?<-1>.)*ปรากฏขึ้นจากกลุ่มนั้นอีกครั้ง ความ$มั่นใจว่าเราสามารถไปถึงจุดสิ้นสุดของสตริงเช่นนั้นและ(?(1)!)มั่นใจได้ว่าเราได้หมดทั้งกลุ่ม

ในที่สุดเราจะกำจัดช่องว่างและสตริงที่สอง:

 .+


1
3 upvotes ใน 15 วินาทีแรกของการโพสต์ นั่นต้องเป็นบันทึกแบบหนึ่ง
Conor O'Brien

8
@ CᴏɴᴏʀO'Bʀɪᴇɴประจบประแจง แต่ฉันสงสัยว่ามีกี่ upvoters สามคนที่อ่านและเข้าใจคำตอบจริง ๆ ใน 15 วินาที : /
Martin Ender

4
ฉันทำ. ฉันค่อนข้างคล่องแคล่วในการอ่าน regex และจอประสาทตา
Conor O'Brien


11

JavaScript ES6, 36 ไบต์

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

ง่ายมากและอาจจะพอเห็นได้ชัดที่จะเข้าใจ: แผนที่แต่ละรายการและดัชนีในaการถ่านที่ตำแหน่ง ( x*2+ รายการที่ดัชนีyในb) "CBA"ใน


7
โปรดเพิ่มสิ่งนี้เป็นรุ่นที่ไม่ได้รับการยกย่องของคุณ: 3
Conor O'Brien

2
@ CᴏɴᴏʀO'BʀɪᴇɴเขาCBAทำอย่างนั้น นอกจากนี้เขาไม่สามารถทำได้เพราะdoเป็นคำหลักที่สงวนไว้ดังนั้นนั่นคือไวยากรณ์ที่ไม่ถูกต้อง
Patrick Roberts เมื่อ

@Patrick แก้ไขง่าย: Do (... )
Conor O'Brien

11

MATL , 14 9 ไบต์

2*+ 67w-c

ใช้รุ่นปัจจุบัน (10.1.0)

ลองออนไลน์!

คำอธิบาย

สรุปสิ่งที่รหัสทำ

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

คำอธิบายโดยละเอียดเกี่ยวกับวิธีการทำงาน

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.

มันอัศจรรย์มาก! คุณช่วยเขียนอีกเล็กน้อยเกี่ยวกับสาเหตุที่ใช้งานได้หรือไม่ ทำไมต้อง 67 และวิธีการคูณอาเรย์เข้าด้วย 2 แล้วเพิ่มอาเรย์ใส่ที่แตกต่างจาก 'อาเรย์คูณด้วย 3'
Vincent

1
@ แน่นอนว่าแน่นอน! ฉันจะเพิ่มคำอธิบายรายละเอียดเพิ่มเติมในภายหลังในวันที่
Luis Mendo

@Vincent Done! แจ้งให้เราทราบว่าตอนนี้ชัดเจนขึ้นหรือไม่
Luis Mendo

10

Java, 81 ไบต์

ไม่มีชื่อเสียงในการแสดงความคิดเห็นโซลูชั่น Java ที่มีอยู่แล้วดังนั้นที่นี่จะไป:

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

1
นี่คือสมาร์ท : DI ชอบ ฉันเห็นว่าคุณได้รับแรงบันดาลใจเล็ก ๆ น้อย ๆ ;)
Addison Crump

1
ประณามนั่นฉลาด ฉันใช้เวลานานพยายามคิดว่าฉันจะได้รับวน foreach ให้พอดีกับ ...
CameronD17

9

brainfuck, 52 ไบต์

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

ต้องใช้ล่ามที่ช่วยให้คุณออกจากเซลล์ 0 และมีเซลล์ห่อแบบ 8 บิต ไม่เหมือนกับคำตอบส่วนใหญ่ของฉันพฤติกรรม EOF ไม่สำคัญ

รับอินพุตไบต์โดย0xFFใช้เป็นตัวคั่น กระแสไบต์ที่แสดงถึงอินพุตแรกภายใต้ "Test cases" จะมีลักษณะเช่นนี้:

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

ฉันสามารถบันทึกสองสามไบต์โดย0x00ใช้เป็นตัวคั่นและใช้0x01และ0x02เป็น 0 และ 1 ตามลำดับ แต่ที่รู้สึกเหมือนโกง: P

เมื่อฉันรู้กลยุทธ์ของฉันแล้วการเขียนโปรแกรมนี้เป็นเรื่องง่ายมาก ในการค้นหาตัวอักษรที่ n ถึงเอาท์พุทให้เริ่มต้นด้วย0x43(ตัวพิมพ์ใหญ่ C ใน ASCII) และลบ ((องค์ประกอบที่ n ของลำดับที่หนึ่ง) * 2 + องค์ประกอบที่ n ของลำดับที่สอง)

สำหรับสิ่งที่คุ้มค่าต่อไปนี้คือโปรแกรม 52 ไบต์แบ่งออกเป็น 3 บรรทัดและมีบางคำอยู่ข้างๆ:

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 ไบต์

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

ฟังก์ชั่นที่ไม่ระบุชื่อ ใช้เช่น:

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

ฉันพยายามทำให้ฟังก์ชั่นปราศจากจุด แต่มีความยุ่งเหยิงทั้งหมด


6
เวอร์ชันความยาวเท่ากันที่ไม่มีจุด:zipWith((!!).(["CB","AC"]!!))
nimi

8

Pyth, 18 16 10 ไบต์

3 rdพยายามที่: 10 ไบต์

ขอบคุณ FryAmTheEggman ที่เตือนฉันถึงการมีอยู่ของG!

VCQ@<G3xN1

อินพุตมีรูปแบบ [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,1,0]] ซึ่งเป็นเมทริกซ์เป็นหลัก: แถว สำหรับตัวเลือกและคอลัมน์สำหรับหมายเลขคำถาม

pseonic pythonic ที่รวบรวมด้วยมือ:

              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 : 16 ไบต์

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

อินพุตมีรูปแบบ [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,1,0]] ซึ่งเป็นเมทริกซ์เป็นหลัก: แถว สำหรับตัวเลือกและคอลัมน์สำหรับหมายเลขคำถาม

คอมไพล์นี้ไป

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

ตกลงฉันรู้ว่ามันดูยุ่งดังนั้นลองรวบรวม pseonic pseudocode ด้วยมือ

                 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 เซนต์พยายามที่: 18 ไบต์

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

ด้วยการป้อนข้อมูลของแบบฟอร์ม [0,0,1,1,0,1,0,1,1,0,0,0,1,0,1,0,1,0], การต่อข้อมูลสองรายการเป็นหลัก คอมไพล์นี้ไป

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

รวบรวมอีกครั้งด้วยมือ

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

และมี codegolf ตัวแรกในชีวิตของฉัน !!! ฉันเพิ่งเรียน Pyth เมื่อวานนี้และนี่เป็นครั้งแรกที่ฉันได้เข้าร่วมในการตีกอล์ฟ


ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ! นี่ดูดีมากเป็นครั้งแรก +1
Adnan

ดีใจที่ได้เห็นคนเรียนรู้ Pyth เสมอ! คุณสามารถเล่นกอล์ฟ.)ได้eและฉันคิดว่ามันสามารถเล่นกอล์ฟได้มากกว่าเดิม พิจารณาตัวแปรGที่มีตัวอักษรตัวเล็กฉันเชื่อว่าคุณสามารถไปถึงประมาณ 10 ไบต์โดยใช้มันเล่นกอล์ฟอย่างมีความสุข! :)
FryAmTheEggman

@FryAmTheEggman โอ้ e! ฉันค้นหามันหลายนาที! นอกจากนี้ขอบคุณที่เตือนฉันถึง G. คุณพูดถูก 10 ไบต์!
busukxuan

7

Python 3, 39 ไบต์

บันทึก 1 ไบต์ขอบคุณ FryAmTheEggman
บันทึก 2 ไบต์ด้วยจุลนิยม

ยังไม่สามารถแก้ปัญหาได้ด้วยซับในในขณะที่!

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

นี่คือกรณีทดสอบของฉัน นอกจากนี้ยังแสดงวิธีที่ฉันสมมติว่าฟังก์ชันนี้เรียกว่า

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

มันใช้zipในการวนซ้ำอาร์เรย์อาร์เรย์ตามลำดับจากนั้นทำดัชนีเป็นสตริงเพื่อเลือกตัวอักษรที่ถูกต้อง ทั้งหมดนี้เกิดขึ้นในรายการความเข้าใจดังนั้นมันจะกลายเป็นรายการโดยอัตโนมัติ หลักของการแก้ปัญหานี้ก็คือการผสมเป็นไปได้เพียงหนึ่งเดียวของaและมีb [0, 1], [1, 0], [0, 0]ดังนั้นถ้าเราลบพวกมันออกเราจะได้อันหนึ่ง-1, 0, 1ที่ทำให้เราได้องค์ประกอบสุดท้ายชิ้นสุดท้ายตรงกลางตามลำดับ



5

Ruby, 35 ไบต์

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

การใช้งาน:

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

ใช้อักขระที่มีดัชนีศูนย์ (xy) th ของ "CAB" (1-0) ให้ 1 และดังนั้น A. (0-0) ให้ 0, และดังนั้น C (0-1) ให้ -1, ซึ่งล้อมรอบไป B

ทางเลือกที่สั้นกว่าโซลูชันกับเอาต์พุต weirder:

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

เอาท์พุทเป็นสตริงที่ยกมาคั่นด้วยการขึ้นบรรทัดใหม่ซึ่งดูเหมือนว่าสะพานไกลเกินไปอย่างใด



4

อ็อกเทฟ 19 ไบต์

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

ทดสอบ:

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

ฉันจะเพิ่มคำอธิบายในภายหลังเมื่อฉันมีคอมพิวเตอร์อยู่ข้างหน้าฉัน สิ่งนี้ถูกเขียนและทดสอบบนอ็อกเทฟออนไลน์บนมือถือของฉัน


4

TI-BASIC, 59 57 50 37 36 ไบต์

ใช้เวลาหนึ่งรายการจากAnsและอื่น ๆ Prompt L₁จาก ที่บันทึกไว้ 13 ไบต์ขอบคุณข้อเสนอแนะโทมัส Kwa sub(ที่จะเปลี่ยนจากการแตกแขนงไป

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

ฉันจะต้องมองหาสิ่งที่โทมัสควากล่าวว่าเขาพบในความคิดเห็นในวันพรุ่งนี้ ¯ \ _ (ツ) _ / ¯


คุณยังมีไบต์ที่จะบันทึก! แทนที่Prompt L₁ด้วยPrompt XและมีL₁ ∟Xมีอีกมาก แต่ฉันจะให้คุณหา
lirtosiast

@ThomasKwa L1 เป็นโทเค็นหนึ่งไบต์สุดท้ายที่ฉันตรวจสอบ การอ้างอิงอีกครั้งด้วยรายการ + x จะเป็นสองไบต์ ... ฉันไม่ถูกต้องหรือไม่
Conor O'Brien

L1 คือสองไบต์
lirtosiast

@ThomasKwa โอ้ แดง
Conor O'Brien

ฉันนับ 37 ไบต์เหมือนปัจจุบัน (คุณสามารถรับ 35. )
lirtosiast

4

สนิม 79

บันทึกแล้ว 8 ไบต์ขอบคุณ Shepmaster
บันทึก 23 ไบต์ขอบคุณ ker

ฉันคิดว่านี่อาจจะลงเล่นกอล์ฟได้มาก แต่นี่เป็นครั้งแรกที่ฉันได้เขียนโปรแกรม Rust แบบสมบูรณ์

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

นี่คือโค้ดที่ไม่ได้รับการทดสอบและกรณีทดสอบในกรณีที่ทุกคนต้องการลองย่อขนาดมัน

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

วิธีนี้ค่อนข้างคล้ายกับคำตอบของ Python ความแตกต่างที่สำคัญคือฉันไม่สามารถสร้างดัชนีสตริงได้โดยตรงดังนั้นฉันจึงไม่สามารถc-dหลอกลวงได้


มันจะถูกกฎหมายหรือไม่ที่จะใช้การปิดแทนฟังก์ชัน? จากนั้นคุณสามารถข้ามประเภททั้งหมดในการประกาศและเพิ่งผ่านa[0]และa[1]เป็นอาร์กิวเมนต์ที่แยกกันสองรายการ
oli_obk

นอกจากนี้การใช้64-y-2*xเคล็ดลับจากโซลูชัน Octave จะช่วยประหยัดไม่กี่ไบต์เนื่องจากสามารถใช้u8แทนusize: is.gd/GNPK76
oli_obk

@ker ฉันไม่แน่ใจเกี่ยวกับการปิดการใช้งานโดยสิ้นเชิง ฉันคิดว่ามันโอเคเพราะมันเป็นฟังก์ชั่นนิรนามใช่มั้ย
Morgan Thrapp

ตราบใดที่คุณไม่จับภาพสิ่งรอบตัวมันก็เหมือนกับฟังก์ชั่นที่ไม่ระบุตัวตน
oli_obk

@ker แล้วใช่ปิดควรจะดี
Morgan Thrapp

4

Vitsy, 40 ไบต์

ถอนหายใจลูกของฉันไม่ได้ถูกจัดทำขึ้นเพื่อจัดการกับอาเรย์

การป้อนข้อมูลผ่านคาดว่า STDIN (สิ่งที่ฉันไม่เคยทำ) "กับชั้นนำ

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

คำอธิบายในโหมด verbose (พร้อมใช้เร็ว ๆ นี้):

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;

นี่คือการเริ่มต้นกอล์ฟที่ดีขึ้นจริงในไม่ช้าผู้คน ฉันขอโทษสำหรับความยาวปัจจุบันของมัน

โดยพื้นฐานแล้วฉันปฏิบัติต่ออินพุตเป็นสตริงและจัดการจากที่นั่น

ลองออนไลน์!


: O ไม่สามารถรอจนกว่าโหมด verbose นั่นจะน่าสนใจ ชอบการใช้W!
Conor O'Brien

@Adnan มันเป็นแท็บการป้อนข้อมูลใน tryitonline แต่ในล่ามท้องถิ่นเพียงแค่เรียกใช้โปรแกรมและการป้อนแต่ละชุดที่ 0 และ 1 ด้วยการนำ "และขึ้นบรรทัดใหม่ในขณะที่โปรแกรมกำลังทำงาน ( Wเทคนิคแจ้งให้)
Addison Crump

อ่าฉันให้อินพุตในส่วนอาร์กิวเมนต์: p คำตอบที่ดี :)
Adnan

@Adnan ฉันใช้เวลาสักครู่กว่าจะหาสิ่งนี้ - Vitsy ป้อนข้อมูลอัตโนมัติถ้ารู้ว่ามันเป็นสองเท่า ในทางเทคนิคคุณสามารถนำสิ่งใดก็ได้ยกเว้นตัวเลขและมันจะทำงานเหมือนเดิม
Addison Crump

เฮ้นั้นค่อนข้างแปลก แต่ในทางกลับกันมันมีประโยชน์
Adnan

3

CJam, 10 ไบต์

'Cq~z2fbf-

ป้อนข้อมูลเป็นรายการของสองรายการเช่น

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

ทดสอบที่นี่

คำอธิบาย

การรักษาคู่เป็นบิตของจำนวนฐาน-2 ที่เราได้รับ2สำหรับA, 1สำหรับBและสำหรับ0C

'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 ไบต์

ฉันคิดว่าฉันมีวิธีแก้ปัญหาที่สง่างามจากนั้นฉันเห็นคำตอบของ @Morgan Thrapp ...

แก้ไข: บันทึกสามไบต์ขอบคุณที่กล่าวข้างต้น

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


อ่าดี lamba*x:ไม่เห็น ฉันมักจะคิดว่ามันมีขนาดกะทัดรัดเท่าที่ฉันสามารถบอกได้ / หาลูกเล่นเพิ่มเติม ฉันชอบโซลูชันของคุณจริงๆดีมาก
Ogaday

3

Java, 131 122 110 90 ไบต์

แก้ไข: ขอบคุณ Bifz / FlagAsSpam สำหรับความช่วยเหลือและแรงบันดาลใจ

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

การส่งครั้งแรก, โซลูชัน Java ที่ไร้เดียงสา สามารถปรับปรุงได้อย่างแน่นอน :)

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


==1สามารถ>0; มันจะเป็นการดีกว่าถ้าคุณจะคืนค่า o แทนที่จะพิมพ์
lirtosiast

วิธีการเกี่ยวกับ: 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 ไบต์) คุณไม่จำเป็นต้องมีการประกาศคงที่ในฟังก์ชั่น
Addison Crump

คุณต้องประกาศว่าฉันแรก, 4 ไบต์: D
Bifz

3

R 29 16 ไบต์

LETTERS[3-2*A-B]

ลบการประกาศฟังก์ชันเนื่องจากฉันเห็นว่ามันเป็นเรื่องธรรมดาในการแข่งขันอื่น ๆ


2

PowerShell ขนาด 40 ไบต์

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

รับอินพุตเป็นสองอาร์เรย์ที่ชัดเจนเช่น 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)และเก็บไว้ในและ$a $bถัดไปห่วงผ่านด้วย$a $a|{...}แต่ละลูปเราส่งออกอักขระที่จัดทำดัชนีลงในสตริง"CBA"โดยดัชนีตัดสินใจโดยสองเท่าของมูลค่าปัจจุบัน$_บวกกับค่าของ$bดัชนีที่จัดทำโดยตัวแปรตัวช่วยของเราซึ่งถูกเพิ่มไว้ล่วงหน้าแล้วลบออก

เป็นตัวอย่างสำหรับกรณีทดสอบครั้งแรกและ$a = @(1,0,0,1,0,0,1) $b = @(0,1,0,0,1,0,0)ย้ำห่วงแรกมี$_ = 1, $d = $null(ตั้งแต่$dยังไม่ได้รับก่อนหน้านี้ประกาศ) เรา pre-เพิ่ม$dดังนั้นตอนนี้$_ = 1และ$d = 1(ใน PowerShell ให้$null + 1 = 1) $b[1-1] = $b[0] = 0ซึ่งหมายความว่า จากนั้น2 * 1 + 0 = 2จึงดัชนีเราหรือ"CBA"[2]A



2

R 36 34 ไบต์

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

สองไบต์บันทึกการลบวงเล็บปีกกาที่ไม่จำเป็น


คุณสามารถบันทึกสองไบต์โดยลบเครื่องหมายวงเล็บในนิยามฟังก์ชัน พวกเขาไม่จำเป็นเนื่องจากฟังก์ชั่นของร่างกายประกอบด้วยคำสั่งเดียว
Alex A.

2

Perl 5 - 47

มี 30 คำตอบและยังไม่มี Perl? นี่คือความพยายามครั้งแรกที่ไร้เดียงสาแล้ว :-) เพียงฟังก์ชั่น:

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

การใช้งาน:

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

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

ฉันค่อนข้างแน่ใจว่าสิ่งที่ดีกว่าสามารถทำได้ด้วย regex แต่ฉันไม่สามารถหาวิธี


1

JavaScript ES6, 75 ไบต์

ฉันได้รับไมล์พิเศษเพื่อรับอาร์กิวเมนต์จำนวนเต็มแทนอาร์กิวเมนต์อาเรย์

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

คำอธิบาย:

(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

ให้เครดิตกับ @ETHproductions สำหรับตรรกะการจัดทำดัชนีสตริง

ทดสอบที่นี่

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>

อุ๊ย

สำหรับ 3 ไบต์พิเศษมันสามารถแสดงการแทนคำตอบได้สูงสุด 30 คำ:

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


1

Lua, 87 ไบต์

เพียงแค่การทดสอบค่าในอาร์เรย์และเชื่อมโยงA, หรือBC

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 ไบต์

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

นั่นเป็นฟังก์ชั่นที่นำไปใช้บางส่วนซึ่งรับค่า int สองครั้ง - สองอาร์เรย์ทำงานได้ดี - และส่งคืนลำดับอักขระใหม่ที่แสดงคำตอบที่ถูกต้อง =)


1

อย่างจริงจัง 14 ไบต์

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

ลองใช้ออนไลน์

อาจเป็นเพราะบั๊กในล่ามรุ่นเซฟโหมดของคุณต้องเพิ่มXเพื่อให้มันทำงานได้อย่างถูกต้องในเวอร์ชั่นออนไลน์ ดาวน์โหลดเวอร์ชั่นในเครื่องเพื่อให้โปรแกรมดังกล่าวทำงานอย่างถูกต้อง

มันสั้นเกินไปที่จะรับประกันคำอธิบายแบบเต็มดังนั้นฉันจะบอกว่ามันใช้อัลกอริทึมเดียวกับคำตอบของเยลลี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.