Обман тест с множественным выбором

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

Leaderboard

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.. Шесть байтов Удар это.
Конор О'Брайен
58
@ CᴏɴᴏʀO'Bʀɪᴇɴ К сожалению, английский не соответствует нашим стандартам языка программирования и, следовательно, не является действительным представлением: p
Аднан
17
Вы можете сжать восемь вопросов с несколькими вариантами ответов до 1,625 байт (13 бит), интерпретируя ответы как основание 3, так что технически это не самый эффективный метод. : P
дверная ручка
4
Вы можете добавить другой ответ в том же месте, используя все четыре комбинации двух битов, 00, 01, 10, 11 для ответа a, b, c или d. Вы не используете 11.
Филипп Хаглунд
5
Английский удовлетворяет всем критериям. Единственная проблема в том, что до того, как будет задан этот вопрос, нет переводчика.
jimmy23013

Ответы:

50

Желе, 7 6 байт

_/ị“ḃ»

Набрав на телефоне. Добавлю описание.

(1,0)идет к A, (0,1)к B, и (0,0)к C. Массивы в Jelly основаны на 1, а функция индексации работает циклически. Таким образом, мы можем просто сложить вычитание на входе.

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

Попробуй это здесь .

lirtosiast
источник
54
как ты набрал это на телефоне? oO
Конор О'Брайен
34
История буфера обмена Samsung. Это было нелегко.
lirtosiast
9
: -DD и поздравляю по 10к!
Луис Мендо
7
Lol, такого же размера, как английский сейчас @ CᴏɴᴏʀO'Bʀɪᴇɴ
RK.
13
Я играю в гольф мой ответ на «Изучение»; Я использую переводчика, который в порядке с грамматическими ошибками. @RK.
Конор О'Брайен
12

Сетчатка , 44 байта

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

Конечный перевод строки значителен. Ввод как

001101010 100010100

Попробуйте онлайн!

объяснение

T`d`BA

Начните с превращения 0s в Bи 1s в A. Это делает первую половину правильной, за исключением того, что она перечисляет, Bкогда она должна содержать C. Мы можем идентифицировать эти ошибочные Bs, проверив, есть ли Bв той же позиции второй строки:

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

Lookahead - это классическая техника подсчета балансирующих групп, которая соответствует позициям двух Bс. В (.)*отсчитывает суффикс после первого Bнажатия одной захвата на группы 1для каждого символа. Затем (?<-1>.)*снова появляется из этой группы. В $гарантирует , что мы можем достигнуть конца строки , как , что, и (?(1)!)гарантирует , что мы на самом деле истощаются всю группу.

Наконец, мы избавляемся от разделительного пространства и второй строки:

 .+

Мартин Эндер
источник
1
3 отзыва в первые 15 секунд публикации; это должно быть какая-то запись.
Конор О'Брайен
8
@ CᴏɴᴏʀO'Bʀɪᴇɴ Лестно, но мне интересно, сколько из этих 3-х upvoters действительно прочитали и поняли ответ за 15 секунд. : /
Мартин Эндер
4
Я сделал. Я довольно свободно читаю регулярные выражения и сетчатку.
Конор О'Брайен
11

JavaScript ES6, 36 байт

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

Очень просто и, вероятно, достаточно очевидно для понимания: сопоставьте каждый элемент и индекс aс символом в позиции ( x*2+ элемент с индексом yв b) в "CBA".

ETHproductions
источник
7
Пожалуйста, добавьте это как свою версию без заглядывания: 3
Конор О'Брайен
2
@ C'O'Bʀɪᴇɴ Он CBAдолжен это сделать. Кроме того, он не может в любом случае, потому что doэто зарезервированное ключевое слово, так что это неверный синтаксис.
Патрик Робертс
@ Патрик простое исправление: Do (...)
Конор О'Брайен
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»?
Винсент
1
@ Винсент Конечно! Позже я добавлю более подробное объяснение
Луис Мендо,
@ Винсент Готово! Дайте мне знать, если это станет яснее
Луис Мендо
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++]);}
Bifz
источник
1
Это умно. Мне нравится. Я вижу, что вы получили немного вдохновения, хотя. ;)
Эддисон Крамп
1
Блин, это умно. Я потратил целую вечность, пытаясь понять, как я мог бы сделать цикл foreach, чтобы соответствовать ...
CameronD17
9

брейкфук, 52 байта

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

Требуется интерпретатор, который позволит вам уйти слева от ячейки 0 и имеет 8-битные ячейки переноса. В отличие от большинства моих ответов, поведение EOF не имеет значения.

Принимает байтовый ввод с 0xFFразделителем. Поток байтов, представляющих первый вход в «Тестовых случаях», будет выглядеть так:

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
>>[<,[>-<-]>.>>]
undergroundmonorail
источник
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"

Я попытался сделать функцию бессмысленной, но получил полный беспорядок.

XNOR
источник
6
Бессмысленная версия равной длины:zipWith((!!).(["CB","AC"]!!))
Ними
8

Pyth, 18 16 10 байт

3- я попытка: 10 байт

Спасибо FryAmTheEggman за напоминание о существовании G!

VCQ@<G3xN1

Вход имеет вид [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], который по сути представляет собой матрицу: строка для выбора и столбец для номера вопроса.

Собранный вручную псевдокод:

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

Хорошо, я знаю, это выглядит грязно, так что давайте вручную скомпилируем в псевдокод Python

                 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], по существу, объединение двух списков. Это компилируется в

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

И вот первый в моей жизни кодегольф !!! Я только что выучил Pyth вчера, и это первый раз, когда я участвовал в гольф-коде.

busukxuan
источник
Добро пожаловать в Программирование Пазлов и Code Golf! Это выглядит очень красиво в первый раз, +1
Аднан
Всегда приятно видеть кого-то, изучающего Pyth! Вы можете .)играть в гольф e, и я думаю, что это может быть намного больше. Рассмотрим переменную, Gкоторая содержит строчный алфавит, я полагаю, что с ее помощью вы можете получить до 10 байтов, счастливого гольфа! :)
FryAmTheEggman
@FryAmTheEggman ой! Я искал его несколько минут! Также спасибо, что напомнили мне о 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которых, соответственно, получит последний, первый, средний элемент.

Морган Трепп
источник
7

Mathematica, 30 24 22 19 байтов

3 байта сохранены благодаря @alephalpha .

{A,B,C}[[3-2#-#2]]&

Довольно просто.

Легион
источник
{A,B,C}[[3-2#-#2]]&
алефальфа
5

Рубин, 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) -й нулевой индексированный символ "CAB". (1-0) дает 1, и, следовательно, A. (0-0) дает 0, и, следовательно, C. (0-1) дает -1, что оборачивается до B.

Альтернативное более короткое решение с более странным выходом:

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

Выходные данные заключаются в строки в кавычках, разделенные символами новой строки, что кажется каким-то мостом слишком далеко.

histocrat
источник
4

Japt, 13 байт

¡#C-X*2-VgY)d

Попробуйте онлайн!

Как это работает

¡#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.
ETHproductions
источник
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 байтов благодаря предложению Томаса Ква перейти от ветвления к 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 будет составлять два байта ... я не прав?
Конор О'Брайен
L1 составляет два байта.
lirtosiast
@ThomasKwa Ох. Dang.
Конор О'Брайен
Я считаю 37 байтов, как это в настоящее время. (Вы можете получить 35.)
lirtosiast
4

Ржавчина, 79

Сохранено 8 байтов благодаря Shepmaster.
Сохранено 23 байта благодаря керу.

Я уверен, что это может быть очень удачным, но я впервые пишу полную программу 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 Я не совсем уверен в использовании замыкания. Я бы предположил, что все в порядке, потому что это по сути анонимная функция, верно?
Морган Трепп
до тех пор, пока вы не захватываете окружение, это точно как анонимная функция.
oli_obk
@ker Тогда да, закрытие должно быть в порядке.
Морган Трепп
4

Витси, 40 байт

вздох Мой ребенок не был создан для манипулирования массивом.

Ожидается ввод через STDIN (что я никогда не делаю) с ведущим ".

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

Объяснение в (скоро доступно) подробном режиме:

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 Не могу дождаться подробного режима. Это будет интересно. Понравилось использование W!
Конор О'Брайен
@Adnan Это вкладка ввода в tryitonline, но в локальном интерпретаторе просто запустите программу и введите каждый набор 0 и 1 с начальным "и завершающим переводом строки во время работы программы ( Wтехнически это быстро).
Addison Crump
Ааа, я дал вход в разделе аргументов: с. Хороший ответ, хотя :)
Аднан
@Adnan Мне потребовалось некоторое время, чтобы понять это - Vitsy автоматически анализирует ввод, если он распознает, что это двойное число. Технически у вас может быть что угодно, кроме цифр, и это будет работать так же.
Эддисон Крамп
Хех, это довольно странно, но с другой стороны это может быть полезно.
Аднан
3

CJam, 10 байтов

'Cq~z2fbf-

Ввод в виде списка из двух списков, например

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

Проверьте это здесь.

объяснение

Рассматривая пары как биты числа base-2, мы получаем 2за A, 1за Bи 0за 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 байт

Я думал, что у меня есть элегантное решение, а затем я увидел ответ @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)]

Ogaday
источник
Ах, хорошо. Не видел lamba*x:. Я всегда думаю, что это настолько компактно, насколько это возможно, тогда мне говорят / находят еще больше трюков. Мне очень нравится ваше решение, кстати, очень приятно.
Огадай,
3

Ява, 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);} 

CameronD17
источник
==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 байта)? Вам не нужно статическое объявление для функций.
Эддисон Крамп
Сначала я должен объявить, +4 байта: D
Bifz
3

R 29 16 байт

LETTERS[3-2*A-B]

удалено объявление функции, так как я видел, что это часто встречается в других конкурсах.

Masclins
источник
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не было ранее объявлена). Мы предварительно добавляем к $dэтому сейчас $_ = 1и $d = 1(в PowerShell, $null + 1 = 1), что означает, что $b[1-1] = $b[0] = 0. Тогда 2 * 1 + 0 = 2, мы индексируем "CBA"[2]или A.

AdmBorkBork
источник
2

𝔼𝕊𝕄𝕚𝕟 12 символов / 22 байта

Ⓒ…îⓜṃ-$*2-í_

Try it here (Firefox only).

объяснение

Переводится как Javascript ES6 как

String.fromCharCode(...input1.map(($,_)=>67-$*2-input2[_]))
Mama Fun Roll
источник
2

R 36 34 байта

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

Два байта сохранены, удалив ненужные скобки

mnel
источник
Вы можете сохранить два байта, удалив фигурные скобки в определении функции. Они не нужны, поскольку тело функции состоит из одного оператора.
Алекс А.
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 можно что-то лучше, но я не мог найти, как это сделать.

ChatterOne
источник
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

Луа, 87 байт

Просто проверяйте значения в массивах и объединяйте их A, Bили 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
Katenkyo
источник
1

F #, 33 байта

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

Это частично примененная функция, которая принимает две последовательности int - два массива работают нормально - и возвращает новую последовательность символов, представляющих правильные ответы. знак равно

Roujo
источник
1

Серьезно, 14 байтов

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

Попробуйте онлайн

Вероятно, из-за ошибки в версии интерпретатора в безопасном режиме, вы должны добавить X чтобы заставить его работать прямо в онлайн-версии. Загрузите локальную версию, чтобы вышеуказанная программа работала корректно как есть.

Он слишком короткий, чтобы дать полное объяснение, поэтому я просто скажу: он использует тот же алгоритм, что и ответ Jelly.

quintopia
источник