Oszukiwanie testu wielokrotnego wyboru, część 2

26

Jest to kontynuacja tego wyzwania Adnana . Jeśli podoba Ci się to wyzwanie, istnieje szansa, że ​​spodoba ci się również drugie. Sprawdź to!


Test wielokrotnego wyboru z 8 pytań, każdy z 4 wyborów może mieć odpowiedź: BCADBADA. Przekształcony na cztery różne tablice, z prawdą i fałszem, jeśli bieżąca litera jest odpowiedzią, będzie wyglądać tak

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]

Można to skompresować przy użyciu odrobiny logiki. Każdy z wyborów A, B, Ci Dmoże być reprezentowana przez dwóch prawda / fałsz wartości przedstawiono poniżej:

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

Korzystając z tej logiki, możemy skompresować cztery powyższe wektory do zaledwie dwóch:

 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]

Oznacza to, że rozwiązaniem twojego testu jest po prostu: 00110111, 10011010. Łącząc je, otrzymujemy liczbę binarną 0011011110011010lub 14234dziesiętną. Użyj tej wartości dziesiętnej, aby oszukiwać w teście!

Wyzwanie

Weź liczbę Nz zakresu (włącznie) [0, 65535]i wyślij ciąg z odpowiedzią na test wielokrotnego wyboru.

Przypadki testowe:

14234
BCADBADA

38513
ABBDCAAB    

0
CCCCCCCC

120
CBBBBCCC

65535
DDDDDDDD

39253
ABCDABCD

Dane wyjściowe mogą być pisane dużymi lub małymi literami, ale nie można używać innych symboli.

Stewie Griffin
źródło
Czy wyjściem musi być ciąg znaków, jak pokazano, czy też litery mogą znajdować się w osobnych wierszach, na liście itp.?
xnor
@xnor Opcjonalne :-)
Stewie Griffin
Dlaczego nie oczywiste A = 00, B = 01, C = 10, D = 11?
user253751,
Powodem był po raz pierwszy wykonany A=10, B=01, a następnie C=nor(A,B), a D=and(A,B)inspirowana przez Adnan za wyzwanie. Z perspektywy czasu może być lepiej zrobić to na odwrót, ale cóż ... Teraz już za późno ...
Stewie Griffin

Odpowiedzi:

3

Galaretka , 14 bajtów

d⁹+⁹BZḄḊị“BADC

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

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".
Dennis
źródło
10

05AB1E , 19 18 16 bajtów

Kod:

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

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Wyjaśnienie:

Najpierw dodajemy 65536do liczby ( žHjest to stała zdefiniowana dla 65536), która również jest 10000000000000000binarna. Ma to na celu uzupełnienie liczby zerami. Weźmy liczbę 14234za przykład. 14234 + 65536jest równy 79770. Który w formacie binarnym jest:

10011011110011010

Usuwamy pierwszy znak, co powoduje:

0011011110011010

Dzielimy sznurek na dwie części za pomocą :

00110111, 10011010

Następnie spakowujemy tablicę za pomocą ø:

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

Przekształcenie ich z powrotem na dziesiętne (przy użyciu C) powoduje:

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

Teraz musimy tylko zindeksować go ciągiem cbad. Skompresowana wersja tego łańcucha jest ’c‰±’, którą można również przetestować tutaj . Wreszcie otrzymujemy znaki na indeks powyższej tablicy. W powyższym przykładzie powoduje to:

1, 0, 2, 3, 1, 2, 3, 2
b  c  a  d  b  a  d  a
Adnan
źródło
6

JavaScript (ES6), 55 48 bajtów

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

Wersja nierekurencyjna (55 bajtów)

Używając wyrażenia regularnego, możemy:

n=>"76543210".replace(/./g,i=>"CBAD"[n>>i&1|n>>+i+7&2])
Arnauld
źródło
Jak pomyślałeś o wykonywaniu operacji bitowych?
ericw31415,
@ ericw31415 - Nawet jeśli nie robi to wprost, wyzwaniem jest opisanie tych operacji bitowych w odwrotnej kolejności (zaczynając od „Można to skompresować przy użyciu odrobiny logiki.” )
Arnauld
3
... trochę logiki ...
Neil
4

Python 2, 53 bajty

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

Przetestuj na Ideone .

Dennis
źródło
Próbowałem użyć, (n&257)%127ale jest dłużej. Szkoda, że ​​127 jest liczbą pierwszą. Może wymyślisz sposób na jego optymalizację.
xnor
4

Zespół CP-1610 , 24 DECLE (30 bajtów)

Ten kod jest przeznaczony do uruchamiania na Intellivision . (1)

Kod operacji CP-1610 jest kodowany za pomocą 10-bitowej wartości, zwanej „DECLE”. Rzeczywista funkcja ma 24 DECLE długości, zaczynając od $4809i kończąc na $4820.

Rejestry CPU są jednak 16-bitowe, więc będzie wspierać wszelkie wartości wejściowej w 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

Wydajność

zrzut ekranu


(1) Przyznając, że co najmniej jeden kompilator, kilka emulatorów i zastępcze pliki ROM wolne od praw autorskich są swobodnie dostępne, myślę, że nie narusza to żadnej zasady przesyłania PPCG. Ale daj mi znać, jeśli się mylę.

Arnauld
źródło
1
Liczymy w bajtach, więc sumujemy całkowitą liczbę bitów, a twój wynik jest dziesiętnym (zmiennoprzecinkowym) wynikiem dzielenia tej wartości przez osiem. W tym przypadku 27,5 bajtów.
mbomb007
3

CJam , 22 bajty

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

Wypróbuj online!

Wyjaśnienie

Napędzany magią ...

Odwzorowanie par bitów na litery w tym wyzwaniu jest nieco arbitralne. Jeśli reprezentujemy ABCDprzez 0, 1, 2, 3(abyśmy mogli po prostu dodać je do postaci A), chcemy następujące mapowanie:

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

To odwzorowanie można obliczyć za pomocą magicznej małej formuły: ((i1 == i2) + 1) ^ i1gdzie wraca kontrola równości 0lub 1. Sprawdź poniższą tabelę, w której każda kolumna odpowiada jednemu wejściu, każdy wiersz odpowiada jednej operacji, a każda komórka pokaże stos w tym punkcie:

[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]

Mając to na uwadze, tutaj jest pełne rozbicie kodu źródłowego:

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'
}

Alternatywne rozwiązanie z tą samą liczbą bajtów, które jest zdecydowanie mniej magiczne:

ri2bG0e[8/z2fb"CBAD"f=

Aw przypadku jest to przydatne dla każdego, jeśli włączyć i1i i2bity z powrotem do jednego numeru (czyli gdy chcesz mapowanie 0 -> 2, 1 -> 1, 2 -> 0, 3 -> 3) to można obliczyć nawet łatwiej jako (~n - 1) & 3lub (~n - 1) % 4jeśli język dostaje modulo o wartości ujemnych prawo. Myślę, że można to napisać zwięźle, jak 3&~-~nw wielu językach. W CJam okazuje się, że jest to bajt dłuższy ze względu na dodatkową konwersję z powrotem z podstawy 2.

Martin Ender
źródło
3

PHP, 57 bajtów

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

Wersja bez operatorów bitowych 70 bajtów

for(;$i<8;)echo CABD[($s=sprintf("%016b",$argv[1]))[$i]+$s[8+$i++]*2];
Jörg Hülsermann
źródło
Gdzie jest $izdefiniowana zmienna ?
ericw31415,
@ ericw31415 Przy pierwszym użyciu zmiennej jest inicjowana i automatycznie deklarowana PHP ta zmienna z zerowym odwołaniem
Jörg Hülsermann
To jest PHP (tm)
tomsmeding
3

Mathematica, 75 73 68 66 bajtów

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

Dzięki @MartinEnder za zapisanie 2 bajtów.

JungHwan Min
źródło
@MartinEnder #+##i Infixpracuj, ale używanie StringPartjest nieuniknione, ponieważ głowa "C"["B","A","D"][[#+##]]jest "C", nie List; StringJoinnie działa
JungHwan Min
1
Och, nie zdawałem sobie z tego sprawy #i #2były to całe listy.
Martin Ender
3

Perl, 42 bajty

Obejmuje +1 dla -n

Podaj dane wejściowe STDIN:

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

Tylko kod:

say+(A..D)[2-($`>>8-$_&257)%127]for/$/..8
Ton Hospel
źródło
3

JavaScript, 113 93 90 88 bajtów

Ogromne podziękowania dla @Neil za pomoc w oszczędzaniu 20 bajtów!
-3 bajty dzięki @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]]')

Niestety, brakuje funkcji, takich jak JavaScript decbin, bindeci str_padże PHP ma.

ericw31415
źródło
1
(65536+n).toString(2).slice(1)i [+b[i+8]+2*b[i]]byłoby na przykład krótsze.
Neil
padStart, gdyby został zaakceptowany w przyszłej wersji ECMAscript, spowodowałby większe oszczędności.
Neil
1
Zamiast tego {…;return }użyjeval("…")
Cyoce
@Neil Wygląda na to, że padStartteraz istnieje w ECMAScript.
ericw31415
1

MATL, 16 bajtów

16&B8eXB'BADC'w)

Wypróbuj online!

lub Zweryfikuj wszystkie przypadki testowe

Wyjaśnienie

        % 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
źródło
1

Julia, 73 bajty

Daje funkcję f przyjmującą N jako dane wejściowe i zwracającą odpowiedź jako ciąg znaków.

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

Spróbuj

W zależności od tego, czy tablica znaków liczy się jako łańcuch, można pominąć łączenie ( 67 bajtów )

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

Spróbuj

pasbi
źródło
0

R, 110 bajtów

Wymyślił wektoryzowane rozwiązanie w R. To powinno być możliwe do gry w golfa poprzez wymyślenie inteligentniejszej konwersji do konwersji binarnej.

x=as.integer(intToBits(scan()));cat(LETTERS[1:4][match(paste0(x[16:9],x[8:1]),c("10","01","00","11"))],sep="")
Billywob
źródło