Введение
Во время учебы я пытался придумать несколько способов обмануть тест с множественным выбором. Это в основном сжатая версия ответов с множественным выбором. Метод работает следующим образом:
Ответы на тест:
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>
Study.
. Шесть байтов Удар это.Ответы:
Желе,
76 байтНабрав на телефоне. Добавлю описание.(1,0)
идет кA
,(0,1)
кB
, и(0,0)
кC
. Массивы в Jelly основаны на 1, а функция индексацииị
работает циклически. Таким образом, мы можем просто сложить вычитание на входе.Попробуй это здесь .
источник
Сетчатка , 44 байта
Конечный перевод строки значителен. Ввод как
Попробуйте онлайн!
объяснение
Начните с превращения
0
s вB
и1
s вA
. Это делает первую половину правильной, за исключением того, что она перечисляет,B
когда она должна содержатьC
. Мы можем идентифицировать эти ошибочныеB
s, проверив, есть лиB
в той же позиции второй строки:Lookahead - это классическая техника подсчета балансирующих групп, которая соответствует позициям двух
B
с. В(.)*
отсчитывает суффикс после первогоB
нажатия одной захвата на группы1
для каждого символа. Затем(?<-1>.)*
снова появляется из этой группы. В$
гарантирует , что мы можем достигнуть конца строки , как , что, и(?(1)!)
гарантирует , что мы на самом деле истощаются всю группу.Наконец, мы избавляемся от разделительного пространства и второй строки:
источник
J, 8 байт
Использование:
Попробуйте это онлайн здесь.
источник
JavaScript ES6, 36 байт
Очень просто и, вероятно, достаточно очевидно для понимания: сопоставьте каждый элемент и индекс
a
с символом в позиции (x*2
+ элемент с индексомy
вb
) в"CBA"
.источник
CBA
должен это сделать. Кроме того, он не может в любом случае, потому чтоdo
это зарезервированное ключевое слово, так что это неверный синтаксис.MATL ,
149 байтИспользует текущую версию (10.1.0)
Попробуйте онлайн!
объяснение
Резюме того, что делает код
Подробное объяснение того, как это работает
источник
Java, 81 байт
Нет репутации, чтобы комментировать уже существующее решение Java, так что здесь идет:
источник
брейкфук, 52 байта
Требуется интерпретатор, который позволит вам уйти слева от ячейки 0 и имеет 8-битные ячейки переноса. В отличие от большинства моих ответов, поведение EOF не имеет значения.
Принимает байтовый ввод с
0xFF
разделителем. Поток байтов, представляющих первый вход в «Тестовых случаях», будет выглядеть так:Я мог бы сэкономить пару байтов, используя
0x00
в качестве разделителя и используя0x01
и0x02
, как 0 и 1 соответственно, но это войлок как мошенничество: PКак только я понял свою стратегию, написать эту программу было очень легко. Чтобы найти n-ую букву, начните с
0x43
(заглавная C в ASCII) и вычтите ((n-й элемент первой последовательности) * 2 + n-й элемент второй последовательности)Для чего стоит 52-байтовая программа, разделенная на 3 строки и несколько слов рядом с ними:
источник
Haskell, 29 байт
Анонимная функция. Используйте как:
Я попытался сделать функцию бессмысленной, но получил полный беспорядок.
источник
zipWith((!!).(["CB","AC"]!!))
Pyth,
181610 байт3- я попытка: 10 байт
Спасибо FryAmTheEggman за напоминание о существовании
G
!Вход имеет вид [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], который по сути представляет собой матрицу: строка для выбора и столбец для номера вопроса.
Собранный вручную псевдокод:
2- я попытка: 16 байт
Вход имеет вид [[0,0,1,1,0,1,0,1], [1,0,0,0,1,0,1,0]], который по сути представляет собой матрицу: строка для выбора и столбец для номера вопроса.
Это компилируется в
Хорошо, я знаю, это выглядит грязно, так что давайте вручную скомпилируем в псевдокод Python
1- я попытка: 18 байт
С вводом формы [0,0,1,1,0,1,0,1,1,0,0,0,1,0,1,0], по существу, объединение двух списков. Это компилируется в
Опять сборка вручную
И вот первый в моей жизни кодегольф !!! Я только что выучил Pyth вчера, и это первый раз, когда я участвовал в гольф-коде.
источник
.)
играть в гольфe
, и я думаю, что это может быть намного больше. Рассмотрим переменную,G
которая содержит строчный алфавит, я полагаю, что с ее помощью вы можете получить до 10 байтов, счастливого гольфа! :)Python 3, 39 байт.
Сохранено 1 байт благодаря FryAmTheEggman.
Сохранено 2 байта благодаря гистократу.
Не удалось решить с одним вкладышем в какое-то время!
Вот мои тесты. Это также показывает, как я предполагаю, что эта функция вызывается.
Он использует
zip
для парного перебора массивов, а затем индексирует в строку, чтобы выбрать правильную букву. Все это происходит в понимании списка, поэтому он автоматически становится списком. Суть этого решения в том, что единственно возможными комбинациямиa
иb
являются[0, 1], [1, 0], [0, 0]
. Поэтому, если мы вычтем их, мы получим один из-1, 0, 1
которых, соответственно, получит последний, первый, средний элемент.источник
Mathematica,
30242219 байтов3 байта сохранены благодаря @alephalpha .
Довольно просто.
источник
{A,B,C}[[3-2#-#2]]&
Рубин, 35 байт
Использование:
Принимает (xy) -й нулевой индексированный символ "CAB". (1-0) дает 1, и, следовательно, A. (0-0) дает 0, и, следовательно, C. (0-1) дает -1, что оборачивается до B.
Альтернативное более короткое решение с более странным выходом:
Выходные данные заключаются в строки в кавычках, разделенные символами новой строки, что кажется каким-то мостом слишком далеко.
источник
Japt, 13 байт
Попробуйте онлайн!
Как это работает
источник
Октава, 19 байт
Тест:
Я добавлю объяснение позже, когда передо мной будет компьютер. Это было написано и проверено на октаву онлайн на моей камере.
источник
TI-BASIC,
5957503736 байтовПринимает один список от
Ans
, а другой отPrompt L₁
. Сохранено 13 байтов благодаря предложению Томаса Ква перейти от ветвления кsub(
.Я должен буду искать то, что Томас Ква сказал, что он нашел в комментариях завтра. ¯ \ _ (ツ) _ / ¯
источник
Prompt L₁
сPrompt X
иL₁
с∟X
. Есть даже больше, но я позволю тебе найти это.Ржавчина, 79
Сохранено 8 байтов благодаря Shepmaster.
Сохранено 23 байта благодаря керу.
Я уверен, что это может быть очень удачным, но я впервые пишу полную программу Rust.
Вот незагрязненный код и контрольные примеры на случай, если кто-то захочет его уменьшить.
Подход очень похож на мой ответ Python. Основное отличие состоит в том, что я не могу напрямую индексировать строки, поэтому я не могу добиться
c-d
цели.источник
a[0]
иa[1]
как два отдельных аргумента.64-y-2*x
трюка из решения Octave экономит немало байтов благодаря возможности использоватьu8
вместоusize
: is.gd/GNPK76Витси, 40 байт
вздох Мой ребенок не был создан для манипулирования массивом.
Ожидается ввод через STDIN (что я никогда не делаю) с ведущим
"
.Объяснение в (скоро доступно) подробном режиме:
Очень скоро это станет лучше, люди. Мне очень жаль его текущую длину.
По сути, я рассматриваю ввод как строку, а затем манипулирую оттуда.
Попробуйте онлайн!
источник
W
!W
технически это быстро).CJam, 10 байтов
Ввод в виде списка из двух списков, например
Проверьте это здесь.
объяснение
Рассматривая пары как биты числа base-2, мы получаем
2
заA
,1
заB
и0
заC
.источник
Python 3,
4845 байтЯ думал, что у меня есть элегантное решение, а затем я увидел ответ @Morgan Thrapp ...
редактировать: сохранены три байта благодаря вышеупомянутым.
lambda *x:[a*'A'or b*'B'or'C'for a,b in zip(*x)]
источник
lamba*x:
. Я всегда думаю, что это настолько компактно, насколько это возможно, тогда мне говорят / находят еще больше трюков. Мне очень нравится ваше решение, кстати, очень приятно.Ява,
13112211090 байтРЕДАКТИРОВАТЬ: Спасибо Bifz / FlagAsSpam за помощь и вдохновение
Первая подача, наивное решение Java. Почти наверняка можно улучшить :)источник
==1
может быть>0
; Вам также лучше вернуть o, чем печатать.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 байта)? Вам не нужно статическое объявление для функций.R
2916 байтудалено объявление функции, так как я видел, что это часто встречается в других конкурсах.
источник
PowerShell, 40 байт
Принимает ввод как два явных массива, например.
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
.источник
𝔼𝕊𝕄𝕚𝕟 12 символов / 22 байта
Try it here (Firefox only).
объяснение
Переводится как Javascript ES6 как
источник
R
3634 байтаДва байта сохранены, удалив ненужные скобки
источник
Perl 5 - 47
Уже 30 ответов и нет Perl? Вот первая наивная попытка :-) Просто функция:
Использование:
Я почти уверен, что с regex можно что-то лучше, но я не мог найти, как это сделать.
источник
JavaScript ES6, 75 байт
Я приложил дополнительные усилия, чтобы принимать целочисленные аргументы вместо аргументов массива.
Объяснение:
Благодарим @ETHproductions за логику индексации строк.
Тест здесь
Тссс
Для 3 дополнительных байтов может отображаться представление до 30 ответов:
источник
Сетчатка, 46 байт
Объединяет две строки и выбирает буквы в соответствии с парами цифр.
Попробуйте это онлайн здесь.
источник
Луа, 87 байт
Просто проверяйте значения в массивах и объединяйте их
A
,B
илиC
.источник
F #, 33 байта
Это частично примененная функция, которая принимает две последовательности int - два массива работают нормально - и возвращает новую последовательность символов, представляющих правильные ответы. знак равно
источник
Серьезно, 14 байтов
Попробуйте онлайн
Вероятно, из-за ошибки в версии интерпретатора в безопасном режиме, вы должны добавить
X
чтобы заставить его работать прямо в онлайн-версии. Загрузите локальную версию, чтобы вышеуказанная программа работала корректно как есть.Он слишком короткий, чтобы дать полное объяснение, поэтому я просто скажу: он использует тот же алгоритм, что и ответ Jelly.
источник