Gian lận một bài kiểm tra trắc nghiệm


41

Giới thiệu

Trong khi học, tôi đã cố gắng đưa ra một số cách để gian lận một bài kiểm tra trắc nghiệm. Về cơ bản nó là một phiên bản nén của các câu trả lời trắc nghiệm. Phương pháp này như sau:

Các câu trả lời cho bài kiểm tra:

BCAABABA

Chúng có thể được chuyển đổi thành 3 mảng khác nhau, cho biết đúng hay sai nếu chữ cái hiện tại là câu trả lời:

    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]

Giải thích những con số này là nhị phân sẽ nén điều này rất nhiều. Nhưng điều này thực sự có thể được nén thêm một chút. Nếu bạn biết vị trí của A và B, bạn không cần vị trí cho C. Điều này có thể được thực hiện với toán tử KHÔNG theo bit:

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]

Chuyển đổi mảng A và B thành số nhị phân sẽ dẫn đến:

A: 00110101
B: 10001010

Điều đó có nghĩa là 8 câu trả lời trắc nghiệm có thể được nén thành hai byte!


Bài tập, nhiệm vụ

Cho hai số ở dạng nhị phân hoặc hai mảng chỉ gồm 0 và 1 có cùng độ dài, đưa ra các câu trả lời trắc nghiệm


Quy tắc

  • Đầu vào có thể ở bất kỳ dạng nào bạn thích, thích [1, 0, 0, 1]hoặc 1001.
  • Bạn có thể cung cấp một chương trình hoặc một chức năng.
  • Bạn có thể cho rằng đầu vào luôn hợp lệ.
  • Bạn cũng có thể xuất ra dưới dạng danh sách, được phân tách bằng dấu cách, v.v.
  • Các câu trả lời trắc nghiệm chỉ bao gồm A, B và C. Tuy nhiên, bạn có thể sử dụng chữ thường thay thế.
  • Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!

Các trường hợp thử nghiệm

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

Bảng xếp hạng

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
Đây là giải pháp của tôi. Nó được viết bằng tiếng Anh (thông dịch viên có sẵn miễn phí mọi lúc mọi nơi), và là Study.. Sáu byte. Đánh bại nó
Conor O'Brien

58
@ CᴏɴᴏʀO'Bʀɪᴇɴ Đáng buồn thay, tiếng Anh không đáp ứng các tiêu chuẩn của chúng tôi về ngôn ngữ lập trình và do đó không phải là một bài nộp hợp lệ: p
Adnan

17
Bạn thực sự có thể nén tám câu hỏi trắc nghiệm thành 1.625 byte (13 bit) bằng cách diễn giải các câu trả lời là cơ sở 3, vì vậy về mặt kỹ thuật đây không phải là phương pháp hiệu quả nhất. : P
Doorknob

4
Bạn có thể thêm một câu trả lời khác trong cùng một không gian bằng cách sử dụng tất cả bốn kết hợp của hai bit, 00, 01, 10, 11 để trả lời a, b, c hoặc d. Bạn không sử dụng 11.
Filip Haglund

5
Tiếng Anh thỏa mãn tất cả các tiêu chí. Vấn đề duy nhất là không có thông dịch viên trước khi câu hỏi này được hỏi.
jimmy23013

Câu trả lời:


50

Thạch, 7 6 byte

_/ị“ḃ»

Gõ vào điện thoại. Sẽ thêm mô tả.

(1,0)đi vào A, (0,1)để B, và (0,0)để C. Mảng trong Jelly dựa trên 1 và chức năng lập chỉ mục hoạt động theo chu kỳ. Do đó, chúng ta chỉ có thể gấp phép trừ trên đầu vào.

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

Hãy thử nó ở đây .


54
Làm thế nào trên trái đất bạn đã gõ nó trên điện thoại? oO
Conor O'Brien

34
Lịch sử clipboard của Samsung. Nó không dễ dàng.
lirtosiast

9
: -DĐ Và chúc mừng trên 10k!
Luis Mendo

7
Lol, cùng kích cỡ với tiếng Anh bây giờ @ CᴏɴᴏʀO'Bʀɪᴇɴ
RK.

13
Tôi đánh golf câu trả lời của mình cho "Học"; Tôi đang sử dụng một thông dịch viên là ổn với các lỗi ngữ pháp. @RK.
Conor O'Brien

12

Võng mạc , 44 byte

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

Các linefeed trailing là đáng kể. Đầu vào giống như

001101010 100010100

Hãy thử trực tuyến!

Giải trình

T`d`BA

Bắt đầu bằng cách biến 0s thành B1s thành A. Điều đó làm cho nửa đầu đúng, ngoại trừ việc nó liệt kê Bkhi cần chứa C. Chúng ta có thể xác định những lỗi sai Bđó bằng cách kiểm tra xem có một Bvị trí nào ở cùng vị trí của chuỗi thứ hai không:

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

Lookahead là một kỹ thuật đếm nhóm cân bằng cổ điển để phù hợp với vị trí của hai Bs. Các (.)*tội hậu tố sau khi người đầu tiên Bbằng cách đẩy một chụp vào nhóm 1cho mỗi nhân vật. Sau đó (?<-1>.)*bật ra từ nhóm đó một lần nữa. Việc $đảm bảo rằng chúng ta có thể đi đến cuối chuỗi như thế và (?(1)!)đảm bảo rằng chúng ta thực sự đã làm cạn kiệt toàn bộ nhóm.

Cuối cùng, chúng ta thoát khỏi không gian ngăn cách và chuỗi thứ hai:

 .+


1
3 lượt upvote trong 15 giây đầu tiên của bài đăng; đó phải là một loại hồ sơ
Conor O'Brien

8
@ CᴏɴᴏʀO'Bʀɪᴇɴ Tâng bốc, nhưng tôi tự hỏi có bao nhiêu trong số 3 người đó thực sự đọc và hiểu câu trả lời trong 15 giây. : /
Martin Ender

4
Tôi đã làm. Tôi khá thành thạo trong việc đọc regex và võng mạc.
Conor O'Brien


11

JavaScript ES6, 36 byte

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

Rất đơn giản và có lẽ đủ rõ ràng để hiểu: Ánh xạ từng mục và chỉ mục vào achar tại vị trí ( x*2+ mục tại chỉ mục ytrong b) trong "CBA".


7
Vui lòng thêm phiên bản này dưới dạng phiên bản chưa được chỉnh sửa của bạn: 3
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Anh CBAlàm việc đó. Ngoài ra, dù sao thì anh ta cũng không thể, vì dolà một từ khóa dành riêng, nên đó là cú pháp không hợp lệ.
Patrick Roberts

@Patrick cách khắc phục đơn giản: Làm (...)
Conor O'Brien

11

MATL , 14 9 byte

2*+ 67w-c

Sử dụng phiên bản hiện tại (10.1.0)

Hãy thử trực tuyến!

Giải trình

Tóm tắt những gì mã làm

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

Giải thích chi tiết về cách thức hoạt động

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.

Thật đáng kinh ngạc! Bạn có thể viết thêm một chút về lý do tại sao điều này làm việc? Tại sao 67? Và làm thế nào để nhân mảng đầu vào với 2 và sau đó thêm mảng đầu vào khác với 'nhân mảng đầu vào với 3'?
Vincent

1
@Vincent Chắc chắn! Tôi sẽ thêm một số giải thích chi tiết hơn vào cuối ngày
Luis Mendo

@Vincent Xong! Hãy cho tôi biết nếu bây giờ rõ ràng hơn
Luis Mendo

10

Java, 81 byte

Không có danh tiếng để nhận xét giải pháp Java đã có, vì vậy, đây là:

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

1
Điều này thật thông minh. : DI thích. Tôi thấy rằng bạn có một chút cảm hứng tuổi teen, mặc dù. ;)
Addison Crump

1
Chết tiệt, thật thông minh. Tôi đã dành nhiều năm cố gắng tìm hiểu làm thế nào tôi có thể có được một vòng lặp foreach để phù hợp với ...
CameronD17

9

Brainfuck, 52 byte

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

Yêu cầu trình thông dịch cho phép bạn đi bên trái từ ô 0 và có các ô gói 8 bit. Không giống như hầu hết các câu trả lời của tôi, hành vi EOF không thành vấn đề.

Có đầu vào byte, với 0xFFtư cách là một dấu phân cách. Một luồng byte đại diện cho đầu vào đầu tiên trong "Các trường hợp thử nghiệm" sẽ trông như thế này:

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

Tôi có thể tiết kiệm một vài byte bằng cách 0x00như một dấu phân cách và sử dụng 0x010x02là 0 và 1 tương ứng, nhưng mà cảm giác như gian lận: P

Khi tôi tìm ra chiến lược của mình, viết chương trình này rất dễ dàng. Để tìm chữ cái thứ n cho đầu ra, hãy bắt đầu bằng 0x43(viết hoa C trong ASCII) và trừ ((phần tử thứ n của chuỗi thứ nhất) * phần tử thứ 2 + thứ n của chuỗi thứ hai)

Để biết giá trị của nó, đây là chương trình 52 byte được chia thành 3 dòng và với một số từ bên cạnh chúng:

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

Một chức năng ẩn danh. Sử dụng như:

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

Tôi đã cố gắng làm cho chức năng không có điểm nhưng có một mớ hỗn độn.


6
một phiên bản miễn phí có độ dài bằng nhau:zipWith((!!).(["CB","AC"]!!))
nimi

8

Bình thường, 18 16 10 byte

Lần thử thứ 3 : 10 byte

Cảm ơn FryAmTheEggman đã nhắc nhở tôi về sự tồn tại của G!

VCQ@<G3xN1

Đầu vào có dạng [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], về cơ bản là một ma trận: hàng cho sự lựa chọn và cột cho số câu hỏi.

Mã giả pythonic biên dịch bằng tay:

              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 nỗ lực: 16 byte

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

Đầu vào có dạng [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], về cơ bản là một ma trận: hàng cho sự lựa chọn và cột cho số câu hỏi.

Điều này biên dịch thành

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, tôi biết rằng trông có vẻ lộn xộn, vì vậy hãy biên dịch bằng tay cho mã giả 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")

Lần thử thứ 1 : 18 byte

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

Với đầu vào có dạng [0,0,1,1,0,1,0,1,1,0,0,0,1,0,1,0], về cơ bản là nối hai danh sách. Điều này biên dịch thành

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

Một lần nữa, biên dịch bằng tay

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

Và đó là con cá tuyết đầu tiên trong đời tôi !!! Tôi mới học Pyth ngày hôm qua, và đây là lần đầu tiên tôi tham gia chơi golf mã.


Chào mừng bạn đến với Câu đố lập trình và Code Golf! Điều này trông rất đẹp lần đầu tiên, +1
Adnan

Luôn luôn tốt đẹp để xem ai đó học Pyth! Bạn có thể chơi golf .)được e, và tôi nghĩ rằng nó có thể được golfed khá hơn một chút. Hãy xem xét biến Gchứa bảng chữ cái viết thường, tôi tin rằng bạn có thể đạt được khoảng 10 byte bằng cách sử dụng nó, chơi golf vui vẻ! :)
FryAmTheEggman

@FryAmTheEggman ôi! Tôi đã tìm kiếm nó trong vài phút! Ngoài ra, cảm ơn bạn đã nhắc nhở tôi về G. Bạn nói đúng, 10 byte!
busukxuan

7

Python 3, 39 byte.

Đã lưu 1 byte nhờ FryAmTheEggman.
Lưu được 2 byte nhờ histocrat.

Không thể giải quyết với một lớp lót trong một thời gian!

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

Đây là trường hợp thử nghiệm của tôi. Nó cũng cho thấy cách tôi giả sử chức năng này được gọi.

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

Nó sử dụng zipđể lặp qua các mảng theo cặp, và sau đó lập chỉ mục thành một chuỗi để chọn đúng chữ cái. Tất cả điều này xảy ra trong một sự hiểu biết danh sách, vì vậy nó tự động trở thành một danh sách. Cốt lõi của giải pháp này là sự kết hợp duy nhất có thể có ab[0, 1], [1, 0], [0, 0]. Vì vậy, nếu chúng ta trừ chúng, chúng ta sẽ lấy một trong số -1, 0, 1đó cho chúng ta phần tử cuối cùng, đầu tiên, giữa tương ứng.



5

Ruby, 35 byte

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

Sử dụng:

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

Lấy ký tự không có chỉ số (xy) của "CAB". (1-0) cho 1 và do đó A. (0-0) cho 0 và do đó C. (0-1) cho -1, bao quanh B.

Giải pháp thay thế ngắn hơn với đầu ra weirder:

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

Đầu ra được trích dẫn các chuỗi được phân tách bằng dòng mới, có vẻ như một cây cầu quá xa bằng cách nào đó.


4

Japt, 13 byte

¡#C-X*2-VgY)d

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

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

Kiểm tra:

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

Tôi sẽ thêm một lời giải thích sau khi tôi có một máy tính trước mặt. Điều này đã được viết và thử nghiệm trên quãng tám trên mạng của tôi.


4

TI-BASIC, 59 57 50 37 36 byte

Lấy một danh sách từ Ans, và danh sách khác từ Prompt L₁. Đã lưu 13 byte nhờ đề xuất của Thomas Kwa để chuyển từ phân nhánh sang sub(.

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

Tôi sẽ phải tìm kiếm những gì Thomas Kwa nói ông đã tìm thấy trong các bình luận vào ngày mai. ¯ \ _ (ツ) _ /


Bạn vẫn còn một số byte để lưu! Thay thế Prompt L₁bằng Prompt XL₁bằng ∟X. Thậm chí còn nhiều hơn, nhưng tôi sẽ cho phép bạn tìm thấy nó.
lirtosiast

@ThomasKwa L1 là mã thông báo một byte, lần cuối tôi đã kiểm tra. Tham chiếu lại với danh sách + x sẽ là hai byte ... tôi không đúng à?
Conor O'Brien

L1 là hai byte.
lirtosiast

@ThomasKwa ơi. Đăng.
Conor O'Brien

Tôi đếm 37 byte như hiện tại. (Bạn có thể nhận được 35.)
lirtosiast

4

Mộc, ​​79

Đã lưu 8 byte nhờ có Shepmaster.
Đã lưu 23 byte nhờ ker.

Tôi khẳng định điều này có thể bị đánh golf rất nhiều, nhưng đây là lần đầu tiên tôi viết một chương trình Rust đầy đủ.

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

Đây là mã không được mã hóa và các trường hợp thử nghiệm trong trường hợp bất kỳ ai muốn thử thu nhỏ nó.

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

Cách tiếp cận khá giống với câu trả lời Python của tôi. Sự khác biệt chính là tôi không thể lập chỉ mục chuỗi trực tiếp, vì vậy tôi không thể thực hiện c-dthủ thuật.


nó sẽ là hợp pháp để sử dụng một đóng cửa thay vì một chức năng? sau đó bạn có thể bỏ qua tất cả các loại trong khai báo và chỉ cần vượt qua a[0]a[1]như hai đối số riêng biệt.
oli_obk

cũng sử dụng 64-y-2*xthủ thuật từ giải pháp Octave giúp tiết kiệm khá nhiều byte do có thể sử dụng u8thay vì usize: is.gd/GNPK76
oli_obk

@ker Tôi không hoàn toàn chắc chắn về việc sử dụng đóng cửa. Tôi sẽ cho rằng nó ổn, bởi vì về cơ bản nó là một chức năng ẩn danh, phải không?
Morgan Thrapp

miễn là bạn không chụp bất kỳ môi trường xung quanh, nó chính xác giống như một chức năng ẩn danh.
oli_obk

@ker Sau đó, yeah, đóng cửa sẽ ổn.
Morgan Thrapp

4

Vitsy, 40 byte

thở dài Con tôi không được thực hiện để thao tác mảng.

Mong đợi đầu vào thông qua STDIN (điều mà tôi không bao giờ làm) với một người dẫn đầu ".

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

Giải thích trong chế độ dài dòng (sớm có sẵn):

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;

Điều này sẽ sớm được chơi golf thực sự tốt hơn, mọi người. Tôi rất xin lỗi vì chiều dài hiện tại của nó.

Về cơ bản, tôi coi đầu vào là một chuỗi, và sau đó thao tác từ đó.

Hãy thử trực tuyến!


: O Không thể đợi cho đến khi chế độ dài dòng. Điều đó sẽ rất thú vị. Giống như việc sử dụng W!
Conor O'Brien

@Adnan Đây là tab đầu vào trong tryitonline, nhưng trên trình thông dịch cục bộ, chỉ cần chạy chương trình và nhập từng bộ 0 và 1 với một dòng "và một dòng mới trong khi chương trình đang chạy ( Wvề mặt kỹ thuật là dấu nhắc)
Addison Crump

Ahh, tôi đã đưa ra đầu vào trong phần đối số: p. Câu trả lời hay đấy :)
Adnan

@Adnan Tôi phải mất một thời gian để tìm hiểu điều này - Vitsy tự động nhập liệu nếu nó nhận ra rằng đó là gấp đôi. Về mặt kỹ thuật, bạn có thể dẫn đầu mọi thứ trừ số và nó sẽ hoạt động như nhau.
Addison Crump

Heh, điều đó khá kỳ lạ, nhưng mặt khác nó có thể hữu ích.
Ad Nam

3

CJam, 10 byte

'Cq~z2fbf-

Nhập dưới dạng danh sách hai danh sách, ví dụ:

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

Kiểm tra nó ở đây.

Giải trình

Điều trị các cặp như bit của một số cơ sở-2, chúng tôi nhận 2cho A, 1cho B0cho 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

Tôi nghĩ rằng tôi đã có một giải pháp tao nhã, sau đó tôi thấy câu trả lời của @Morgan Thrapp ...

chỉnh sửa: Đã lưu ba byte nhờ vào những điều đã nói ở trên.

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


À Không thấy lamba*x:. Tôi luôn nghĩ rằng nó nhỏ gọn như có thể sau đó tôi được nói / tìm thấy nhiều thủ thuật hơn nữa. Tôi thực sự thích giải pháp của bạn btw, rất tốt đẹp.
Ogaday

3

Java, 131 122 110 90 byte

EDIT: Cảm ơn Bifz / FlagAsSpam vì sự giúp đỡ và cảm hứng

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

Trình đầu tiên, giải pháp Java ngây thơ. Gần như chắc chắn có thể được cải thiện :)

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


==1có thể được >0; nó cũng sẽ tốt hơn cho bạn để trả lại o hơn là in.
lirtosiast

Làm thế nào về: 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)? Bạn không cần khai báo tĩnh trên các hàm.
Addison Crump

Bạn phải khai báo i trước, +4 byte: D
Bifz

3

R 29 16 byte

LETTERS[3-2*A-B]

loại bỏ tuyên bố chức năng kể từ khi tôi thấy nó phổ biến trong các cuộc thi khác.


2

PowerShell, 40 byte

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

Lấy đầu vào là hai mảng rõ ràng, ví dụ. 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)và lưu trữ chúng trong $a$b. Tiếp theo, lặp qua $avới $a|{...}. Mỗi vòng lặp, chúng tôi xuất một ký tự được lập chỉ mục vào chuỗi "CBA", với chỉ số được quyết định bằng hai lần giá trị hiện tại $_, cộng với giá trị $bđược lập chỉ mục bởi biến trợ giúp của chúng tôi đã được thêm trước rồi trừ đi.

Ví dụ, cho trường hợp thử nghiệm đầu tiên, $a = @(1,0,0,1,0,0,1)$b = @(0,1,0,0,1,0,0). Lặp lại vòng lặp đầu tiên có $_ = 1, $d = $null(vì $dtrước đó chưa được khai báo). Chúng tôi thêm trước $dđể bây giờ $_ = 1$d = 1(trong PowerShell, $null + 1 = 1), có nghĩa là $b[1-1] = $b[0] = 0. Sau đó 2 * 1 + 0 = 2, vì vậy chúng tôi lập chỉ mục "CBA"[2], hoặc A.



2

R 36 34 byte

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

Hai byte được lưu loại bỏ các dấu ngoặc không cần thiết


Bạn có thể lưu hai byte bằng cách loại bỏ dấu ngoặc trong định nghĩa hàm. Chúng không cần thiết vì thân hàm bao gồm một câu lệnh.
Alex A.

2

Perl 5 - 47

Đã có 30 câu trả lời và không có perl? Đây là một nỗ lực đầu tiên ngây thơ sau đó :-) Chỉ cần chức năng:

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

Sử dụng:

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

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

Tôi khá chắc chắn rằng một cái gì đó tốt hơn có thể được thực hiện với regex, nhưng tôi không thể tìm thấy làm thế nào.


1

JavaScript ES6, 75 byte

Tôi đã đi thêm một dặm để chấp nhận đối số nguyên thay vì đối số mảng.

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

Giải trình:

(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

Tín dụng cho @ETHproductions cho logic lập chỉ mục chuỗi.

Kiểm tra tại đây

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

Đối với 3 byte bổ sung, nó có thể hiển thị đại diện cho tối đa 30 câu trả lời:

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


1

Lua, 87 byte

Đơn giản chỉ cần kiểm tra các giá trị trong mảng và nối A, Bhoặc 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)

Đó là một hàm được áp dụng một phần có hai chuỗi int - hai mảng hoạt động tốt - và trả về một chuỗi ký tự mới biểu thị các câu trả lời đúng. =)


1

Nghiêm túc, 14 byte

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

Dùng thử trực tuyến

Có thể do lỗi trong phiên bản chế độ an toàn của trình thông dịch, bạn phải thêm một Xđể làm cho nó hoạt động ngay trong phiên bản trực tuyến. Tải xuống phiên bản cục bộ để chương trình trên hoạt động chính xác.

Quá ngắn để đảm bảo một lời giải thích đầy đủ, vì vậy tôi sẽ chỉ nói: nó sử dụng thuật toán tương tự như câu trả lời Jelly.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.