Обман тесту з вибором, частина 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?
користувач253751

Причина я був першим зробив 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])

Як ви думали робити побитові операції?
ericw31415

@ 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 DECLEs, починаючи з $4809та закінчуючи at $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) Зважаючи на те, що принаймні один компілятор, кілька емуляторів та файли ROM , що не мають авторських прав, є доступними, я думаю, що це не порушує жодного правила подання PPCG. Але, будь ласка, повідомте мене, якщо я помиляюся.


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

3

Математика, 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 Min

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 має.


1
(65536+n).toString(2).slice(1)і [+b[i+8]+2*b[i]]буде коротше, наприклад.
Ніл

padStart, якщо це буде прийнято до майбутньої версії сценарію ECMA, це призведе до більшої економії.
Ніл

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

1

Джулія, 73 байт

Дає функцію f, яка приймає N як вхідний і повертає відповідь як рядок.

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

Спробуй це

Залежно, якщо масив char вважається рядком, можна пропустити приєднання ( 67 байт )

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

Спробуй це


0

R, 110 байт

Створено векторизований розв'язок у Р. Це, мабуть, може призвести до гольфування, придумавши більш розумне перетворення в бінарне перетворення.

x=as.integer(intToBits(scan()));cat(LETTERS[1:4][match(paste0(x[16:9],x[8:1]),c("10","01","00","11"))],sep="")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.