Обман тест с множественным выбором, часть 2

26

Это продолжение этой проблемы со стороны Аднана . Если вам нравится этот вызов, скорее всего, вам понравится и другой. Проверьте это!


Тест множественного выбора с 8 вопросов , каждый из которых 4 варианта могут иметь ответы: BCADBADA. Преобразованный в четыре различных массива, с истиной и ложью, если текущая буква является ответом, это будет выглядеть так

Q#: 1  2  3  4  5  6  7  8
    B  C  A  D  B  A  D  A
A: [0, 0, 1, 0, 0, 1, 0, 1]
B: [1, 0, 0, 0, 1, 0, 0, 0]
C: [0, 1, 0, 0, 0, 0, 0, 0]
D: [0, 0, 0, 1, 0, 0, 1, 0]

Это может быть сжато, используя немного логики. Каждый из вариантов A, B, Cи Dможет быть представлена двумя истинных / ложных значений показано ниже:

A: 1 0
B: 0 1
C: 0 0
D: 1 1

Используя эту логику, мы можем сжать четыре вектора выше до двух:

 1  2  3  4  5  6  7  8
 B  C  A  D  B  A  D  A
[0, 0, 1, 1, 0, 1, 1, 1]
[1, 0, 0, 1, 1, 0, 1, 0]

То есть, решение теста просто: 00110111, 10011010. Объединяя их, мы получаем двоичное число 0011011110011010или 14234десятичное число. Используйте это десятичное значение для проверки вашего теста!

Вызов

Возьмите число Nв (включительно) диапазоне [0, 65535]и выведите строку с ответом на тест с множественным выбором.

Тестовые случаи:

14234
BCADBADA

38513
ABBDCAAB    

0
CCCCCCCC

120
CBBBBCCC

65535
DDDDDDDD

39253
ABCDABCD

Вывод может быть в верхнем или нижнем регистре букв, но вы не можете использовать другие символы.

Стьюи Гриффин
источник
Должна ли выводиться строка, как показано, или буквы могут быть на отдельных строках, в списке и т. Д.?
xnor
@xnor Необязательно :-)
Стьюи Гриффин
Почему не очевидное A = 00, B = 01, C = 10, D = 11?
user253751
Причина я был первым сделал A=10, B=01, а затем C=nor(A,B), и D=and(A,B), вдохновленный вызовом Аднана. Оглядываясь назад, возможно, было бы лучше сделать это наоборот, но хорошо ... Слишком поздно ...
Стьюи Гриффин,

Ответы:

3

Желе , 14 байт

d⁹+⁹BZḄḊị“BADC

Попробуйте онлайн! или проверьте все контрольные примеры .

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

d⁹+⁹BZḄḊị“BADC  Main link. Argument: n

d⁹              Divmod 256; yield [n : 256, n % 256].
  +⁹            Add 256; yield [n : 256 + 256, n % 256 + 256].
    B           Binary; convert both integers to base 2.
     Z          Zip; group the quotient bits with corresponding remainder bits.
      Ḅ         Unbinary; convert from base 2 to integer.
       Ḋ        Dequeue; discard the first integer, which corresponds to the
                dummy value introduced by adding 256 to quotient and remainder.
        ị“BADC  Index into that string, mapping [1, 2, 3, 0] to "BADC".
Деннис
источник
10

05AB1E , 19 18 16 байтов

Код:

žH+b¦2äøC’c‰±’sè

Использует кодировку CP-1252 . Попробуйте онлайн!

Объяснение:

Во-первых, мы добавляем 65536к числу ( žHэто определенная константа 65536), которое также является 10000000000000000двоичным. Это должно дополнить число нулями. Давайте возьмем число 14234в качестве примера. 14234 + 65536равно 79770. Который в двоичном виде это:

10011011110011010

Мы удаляем первый символ, в результате чего:

0011011110011010

Разобьем строку на две части, используя :

00110111, 10011010

После этого мы заархивируем массив ø:

01, 00, 10, 11, 01, 10, 11, 10

Преобразование их обратно в десятичное (используя C) приводит к:

1, 0, 2, 3, 1, 2, 3, 2

Теперь нам нужно только проиндексировать его с помощью строки cbad. Сжатая версия для этой строки ’c‰±’, которая также может быть проверена здесь . Наконец, мы получаем символы по индексу вышеуказанного массива. Для приведенного выше примера это приводит к:

1, 0, 2, 3, 1, 2, 3, 2
b  c  a  d  b  a  d  a
Аднан
источник
6

JavaScript (ES6), 55 48 байт

f=(n,i=8)=>i--?"CBAD"[n>>i&1|n>>i+7&2]+f(n,i):''

console.log(f(14234)); // BCADBADA
console.log(f(38513)); // ABBDCAAB
console.log(f(0));     // CCCCCCCC
console.log(f(120));   // CBBBBCCC
console.log(f(65535)); // DDDDDDDD
console.log(f(39253)); // ABCDABCD

Нерекурсивная версия (55 байт)

Используя регулярное выражение, мы можем сделать:

n=>"76543210".replace(/./g,i=>"CBAD"[n>>i&1|n>>+i+7&2])
Arnauld
источник
Как вы думаете о выполнении побитовых операций?
ericw31415 25.09.16
@ ericw31415 - Даже если он не делает этого явно, проблема в том, чтобы описать эти побитовые операции в обратном порядке (начиная с «Это можно сжать, используя немного логики». )
Арнаулд
3
... немного логики ...
Нил
4

Python 2, 53 байта

f=lambda n,k=8:k*'_'and f(n/2,k-1)+'CBAD'[n>>7&2|n&1]

Проверьте это на Ideone .

Деннис
источник
Я пытался использовать, (n&257)%127но это дольше. Жаль, что 127 прост. Может быть, вы можете придумать способ оптимизировать его.
xnor
4

Сборка CP-1610 , 24 DECLE (30 байтов)

Этот код предназначен для запуска на Intellivision . (1)

Код операции CP-1610 кодируется 10-битным значением, известным как «DECLE». Фактическая функция имеет длину 24 ДЕКАЛА, начиная с $4809и заканчивая на $4820.

Регистры процессора, однако , 16-битные, так что он будет поддерживать любое значение входного сигнала в 0x0000.. 0xFFFF.

                            ROMW  10            ; use 10-bit ROM
                            ORG   $4800         ; start program at address $4800
4800 0002                   EIS                 ; enable interrupts (to enable display)

                    ;; ---- usage example
4801 0001                   SDBD                ; load parameter in R0
4802 02B8 009A 0037         MVII  #14234, R0    ;
4805 0004 0148 0009         CALL  cheat         ; call function
4808 0017                   DECR  PC            ; infinite loop

                    ;; ---- 'Cheat Your Test' function
                    cheat   PROC  

4809 0082                   MOVR  R0,     R2    ; copy R0 to R2
480A 0040                   SWAP  R0            ; swap LSB/MSB in R0
480B 02BC 0214              MVII  #$214,  R4    ; R4 = pointer to 2nd row of screen memory

480D 01DB           @@loop  CLRR  R3            ; clear R3
480E 0052                   RLC   R2            ; extract highest bit of R2 to carry
480F 0053                   RLC   R3            ; inject carry into R3
4810 0050                   RLC   R0            ; extract highest bit of R0 to carry
4811 0053                   RLC   R3            ; inject carry into R3
4812 0001                   SDBD                ; add pointer to lookup table to R3
4813 02FB 001D 0048         ADDI  #@@tbl, R3    ;
4816 029B                   MVI@  R3,     R3    ; read character value
4817 0263                   MVO@  R3,     R4    ; write it to screen memory (also does R4++)
4818 037C 021C              CMPI  #$21C,  R4    ; 8 characters written? ...
481A 0225 000E              BLT   @@loop        ; ... if not, jump to @@loop

481C 00AF                   JR    R5            ; return

481D 011F 0117      @@tbl   DECLE $11F, $117    ; characters 'B', 'C', 'A' and 'D'
481F 010F 0127              DECLE $10F, $127    ; in white, using the built-in font

                            ENDP

Выход

Скриншот


(1) Учитывая, что по крайней мере один компилятор, несколько эмуляторов и заменяющие ПЗУ файлы без авторских прав находятся в свободном доступе, я думаю, что это не нарушает правила подачи PPCG. Но, пожалуйста, дайте мне знать, если я ошибаюсь.

Arnauld
источник
1
Мы оцениваем в байтах, так что сложите общее количество бит, и ваш результат будет десятичным (плавающим) результатом деления этого значения на восемь. В этом случае 27,5 байта.
mbomb007
3

CJam , 22 байта

ri2bG0e[8/:.{1$=)^'A+}

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

объяснение

Приведено в действие волшебством ...

Отображение пар битов на буквы в этой задаче является немного произвольным. Если мы представим ABCDна 0, 1, 2, 3(так что мы можем просто добавить их к характеру A) , то мы хотим следующее отображение:

i1   i2   o
0    0    2
0    1    1
1    0    0
1    1    3

Это отображение может быть вычислено с помощью волшебной маленькой формулы:, ((i1 == i2) + 1) ^ i1где проверка равенства возвращает 0или 1. Посмотрите на следующую таблицу, где каждый столбец соответствует одному входу, каждая строка соответствует одной операции, и каждая ячейка будет показывать стек в этой точке:

[i1, i2]:  [0, 0]     [0, 1]     [1, 0]     [1, 1]
copy i1:   [0, 0, 0]  [0, 1, 0]  [1, 0, 1]  [1, 1, 1]
equals:    [0, 1]     [0, 0]     [1, 0]     [1, 1]
inc:       [0, 2]     [0, 1]     [1, 1]     [1, 2]
xor:       [2]        [1]        [0]        [3]

Имея это в виду, вот полная разбивка исходного кода:

ri     e# Read input, convert to integer.
2b     e# Get binary representation.
G0e[   e# Pad to 16 bits with zeros.
8/     e# Split into two halves of 8 bits each.
:.{    e# For each pair of bits, i1 and i2...
  1$   e#   Copy i1.
  =    e#   Check equality with i2.
  )    e#   Increment.
  ^    e#   Bitwise XOR.
  'A+  e#   Add to 'A'
}

Альтернативное решение с тем же количеством байтов, которое явно менее волшебно:

ri2bG0e[8/z2fb"CBAD"f=

И в случае , если это полезно кому - либо, если вы повернуть i1и i2биты обратно в одно число (то есть , если вы хотите отображение 0 -> 2, 1 -> 1, 2 -> 0, 3 -> 3) , это может быть вычислено еще более легко , как (~n - 1) & 3или (~n - 1) % 4если ваш язык получает по модулю отрицательных значений правых. Я думаю, что это может быть написано кратко, как 3&~-~nна многих языках. В CJam это оказывается на байт длиннее из-за дополнительного преобразования обратно из базы 2.

Мартин Эндер
источник
3

PHP, 57 байт

for($i=8;$i--;)echo CBAD[($n=$argv[1])>>$i+7&2|$n>>$i&1];

Версия без побитовых операторов 70 байт

for(;$i<8;)echo CABD[($s=sprintf("%016b",$argv[1]))[$i]+$s[8+$i++]*2];
Йорг Хюльсерманн
источник
Где $iопределяется переменная ?
ericw31415
@ ericw31415 При первом использовании переменная инициализируется и автоматически объявляется PHP этой переменной с нулевой ссылкой
Jörg Hülsermann
Это PHP (tm)
Томсминг 25.09.16
3

Mathematica, 75 73 68 66 байт

StringPart["CBAD",#+##+1]&@@IntegerDigits[#,2,16]~Partition~8<>""&

Спасибо @MartinEnder за сохранение 2 байта.

Юнг Хван Мин
источник
@MartinEnder #+##и Infixработать, но использование StringPartнеизбежно, потому что глава "C"["B","A","D"][[#+##]]есть "C", а не List; StringJoinне работает
JungHwan Мин.
1
О, я не осознавал этого #и #2составлял целые списки.
Мартин Эндер
3

Perl, 42 байта

Включает +1 для -n

Внесите свой вклад в STDIN:

perl -nE 'say+(A..D)[2-($`>>8-$_&257)%127]for/$/..8' <<< 39253

Просто код:

say+(A..D)[2-($`>>8-$_&257)%127]for/$/..8
Тон Хоспел
источник
3

JavaScript, 113 93 90 88 байт

Большое спасибо @Neil за помощь в экономии 20 байт!
-3 байта благодаря @Cyoce

n=>{r="";b=("0".repeat(15)+n.toString(2)).slice(-16);for(i=0;i<8;i++)r+="CBAD"[parseInt(b[i]+b[i+8],2)];return r}

n=>{r="";b=(65536+n).toString(2).slice(1);for(i=0;i<8;i++)r+="CBAD"[+b[i+8]+2*b[i]];return r}

n=>eval('r="";b=(65536+n).toString(2).slice(1);for(i=0;i<8;i++)r+="CBAD"[+b[i+8]+2*b[i]]')

n=>eval('r="";b=n.toString(2).padStart(16,0);for(i=0;i<8;i++)r+="CBAD"[+b[i+8]+2*b[i]]')

К сожалению, JavaScript не хватает функций , таких как decbin, bindecи str_padчто PHP имеет.

ericw31415
источник
1
(65536+n).toString(2).slice(1)и [+b[i+8]+2*b[i]]будет короче, например.
Нил
padStartЕсли он будет принят в будущей версии ECMAscript, это приведет к большей экономии.
Нил
1
Вместо того {…;return }, чтобы использоватьeval("…")
Cyoce
@Neil Кажется, что padStartтеперь существует в ECMAScript.
ericw31415
1

MATL, 16 байт

16&B8eXB'BADC'w)

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

или проверить все контрольные примеры

объяснение

        % Implicitly grab input
16&B    % Convert to binary string with at least 16 bits
8e      % Reshape the resulting string to have 8 rows and 2 columns
XB      % Convert each row from binary to decimal
'BADC'  % Push this string literal
w)      % Use the decimal numbers to index into this string (modular indexing)
        % Implicitly display the resulting string
Suever
источник
1

Юлия, 73 байта

Дает функцию f, принимающую N в качестве входных данных и возвращающую ответ в виде строки.

f(N)=(b=bin(N,16);join(["CBAD"[parse("0b$(b[i])$(b[i+8])")+1]for i=1:8]))

Попытайся

В зависимости от того, считается ли массив символов строкой, можно пропустить соединение ( 67 байт ).

f(N)=(b=bin(N,16);["CBAD"[parse("0b$(b[i])$(b[i+8])")+1]for i=1:8])

Попытайся

pasbi
источник
0

R, 110 байт

Придумали векторизованное решение в R. Это, вероятно, должно быть реализовано благодаря разумному преобразованию int в двоичное преобразование.

x=as.integer(intToBits(scan()));cat(LETTERS[1:4][match(paste0(x[16:9],x[8:1]),c("10","01","00","11"))],sep="")
Billywob
источник