Обман тесту з кращим вибором


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.
  • Ви можете надати програму або функцію.
  • Ви можете припустити, що введення завжди дійсне.
  • Ви також можете виводити як список, розділений пробілами тощо.
  • Відповіді з декількома варіантами складаються лише з А, В та С. Однак ви можете використовувати малі регістри замість цього.
  • Це , тому подання з найменшою кількістю байтів виграє!

Тестові справи

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
Аднан

17
Насправді ви можете стиснути вісім питань з декількома варіантами до 1625 байт (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.

Спробуйте тут .


54
як на землі ти це набрав по телефону? oO
Conor O'Brien

34
Історія буфера обміну Samsung Це було непросто.
lirtosiast

9
: -DD І вітаю на 10k!
Луїс Мендо

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. Ми можемо визначити ці помилкові Bs, перевіривши, чи знаходиться Bв тому самому положенні другого рядка:

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

Lookahead - це класична техніка підрахунку балансуючої групи для узгодження позицій двох Bs. У (.)*відраховує суфікс після першого Bнатискання однієї захоплення на групи 1для кожного символу. Потім знову (?<-1>.)*вискакує з цієї групи. У $гарантує , що ми можемо досягти кінця рядка , як , що, і (?(1)!)гарантує , що ми на самому ділі виснажуються всю групу.

Нарешті, ми позбавляємося від роздільного простору та другої рядки:

 .+


1
3 оновлення за перші 15 секунд після публікації; це повинен бути якийсь запис.
Conor O'Brien

8
@ CᴏɴᴏʀO'Bʀɪᴇɴ Улесливо, але мені цікаво, скільки з цих 3 учасників подій насправді прочитали та зрозуміли відповідь за 15 секунд. : /
Мартін Ендер

4
Я робив. Я досить вільно читаю регулярні виразки та сітківку.
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 просте виправлення: 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"?
Вінсент

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

1
Це розумно. : DI подобається. Я бачу, що ти отримав підлітковий куточок натхнення. ;)
Аддісон Кримп

1
Чорт, це розумно. Я витрачав віки, намагаючись розібратися, як я можу підібрати петлю передбачення, щоб підходити ...
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
>>[<,[>-<-]>.>>]

9

Хаскелл, 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"]!!))
німі

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

Гаразд, я знаю, що це виглядає безладно, тому давайте вручну компілювати пітонічний псевдокод

                 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 вчора, і це перший раз, коли я брав участь у гольф-коді.


Ласкаво просимо до головоломки програмування та коду для гольфу! Вперше це виглядає дуже приємно, +1
Аднан

Завжди приємно бачити, як хтось навчається Pyth! Можна гольфу .)бути e, і я думаю, що це може бути гольф зовсім трохи більше. Розглянемо змінну, Gяка містить алфавіт з малі літери, я вважаю, що ти можеш досягти приблизно 10 байт, використовуючи її, щасливий гольф! :)
FryAmTheEggman

@FryAmTheEggman о, е! Я шукав його кілька хвилин! Також дякую, що нагадали мені Г. Ви праві, 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

Рубін, 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]}}

Вихідні дані цитуються рядками, розділеними новими рядками, що здається містком занадто далеко.



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 буде двома байтами ... я не прав?
Conor O'Brien

L1 - два байти.
lirtosiast

@ThomasKwa О. Данг.
Conor O'Brien

Я рахую 37 байт, як це є зараз. (Ви можете отримати 35.)
lirtosiast

4

Іржа, 79

Збережено 8 байт завдяки Shepmaster.
Збережено 23 байти завдяки ker.

Я впевнений, що це може бути багато в гольфі, але я вперше написав повну програму "Іржа".

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!
Conor O'Brien

@Adnan Це вкладка вводу в трийтоніне, але на локальному перекладачі просто запустіть програму і введіть кожен набір 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]]

Тестуйте це тут.

Пояснення

Лікування пар в якості бітів ряду базових 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)]


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

3

Java, 131 122 110 90 байт

EDIT: Дякую 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 байти)? Вам не потрібно статичне оголошення про функції.
Аддісон Крумп

Ви повинні оголосити, що я перший, +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не було раніше оголошено). Ми попередньо додаємо до $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]

Два байти збережено, видаляючи непотрібні дужки


Ви можете зберегти два байти, знявши дужки у визначенні функції. Вони не потрібні, оскільки тіло функції складається з одного оператора.
Олексій А.

2

Перл 5 - 47

Вже 30 відповідей і жодних вправ? Ось перша наївна спроба тоді :-) Просто функція:

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

Я майже впевнений, що щось краще можна зробити з регулярним виразом, але я не міг знайти як.


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>

Pssst

Для 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

1

F #, 33 байти

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

Це частково застосована функція, яка займає дві послідовності int - два масиви справно працюють - і повертає нову послідовність символів, що представляють правильні відповіді. =)


1

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

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

Спробуйте це в Інтернеті

Можливо, через помилку у версії інтерпретатора в безпечному режимі, ви повинні додати, Xщоб він працював правильно в онлайн-версії. Завантажте локальну версію, щоб вищезазначена програма працювала належним чином.

Це занадто коротко, щоб гарантувати повне пояснення, тому я просто скажу: він використовує той же алгоритм, що і відповідь Jelly.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.