객관식 시험 치트, 2 부


26

이것은 Adnan에 의한 도전의 속편 입니다. 이 도전을 좋아한다면, 다른 도전도 좋아할 것입니다. 확인 해봐!


각각 4 개의 선택 사항이있는 8 개의 질문으로 구성된 객관식 시험에 대한 답이있을 수 있습니다 BCADBADA. 현재 문자가 답이면 true와 false를 사용하여 네 개의 다른 배열로 변환됩니다.

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, CD아래와 같이 두 개의 참 / 거짓 값으로 표현 될 수있다 :

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십진수를 얻는다 . 이 10 진수 값을 사용하여 테스트를 속이십시오!

도전

N(포함) 범위 의 숫자 를 사용하여 [0, 65535]객관식 테스트에 대한 답변이 포함 된 문자열을 출력하십시오.

테스트 사례 :

14234
BCADBADA

38513
ABBDCAAB    

0
CCCCCCCC

120
CBBBBCCC

65535
DDDDDDDD

39253
ABCDABCD

출력은 대문자 또는 소문자 일 수 있지만 다른 기호는 사용할 수 없습니다.


출력은 표시된 문자열이어야합니까, 아니면 문자가 별도의 줄, 목록 등일 수 있습니까?
xnor

@xnor 선택 :-)
Stewie Griffin

명백한 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. 숫자를 0으로 채 웁니다. 숫자 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

자바 스크립트 (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 - 그렇게 명시하고 아니더라도 도전 실제로 역순이 비트 연산을 설명된다 (시작 "이 논리의 비트를 사용하여 압축 될 수있다." )
Arnauld

3
... 약간 의 논리 ...
Neil

4

파이썬 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 opcode는 'DECLE'로 알려진 10 비트 값으로 인코딩됩니다. 실제 기능은 24 DECLE이며 길이는$4809 과 종료 시간은 $4820입니다.

그러나 CPU 레지스터는 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
우리는 바이트로 점수를 매기므로 총 비트 수를 합산하면 점수는 해당 값을 8로 나눈 10 진수 (부동) 결과입니다. 이 경우 27.5 바이트입니다.
mbomb007

3

CJam , 22 바이트

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

온라인으로 사용해보십시오!

설명

마법에 의해 구동 ...

이 챌린지에서 비트 쌍을 문자로 매핑하는 것은 약간 임의적입니다. 우리가 표현하는 경우 ABCD0, 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에 선언 된이 변수는 null 참조를 사용합니다.
Jörg Hülsermann

PHP (tm)
21 분 57 초

3

매스 매 티카, 75 73 68 66 바이트

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

2 바이트를 절약 한 @MartinEnder에게 감사합니다.


@MartinEnder #+##Infix작동하지만 사용은 StringPart의 머리가 있기 때문에 피할 수 "C"["B","A","D"][[#+##]]있다 "C", 없다 List; StringJoin작동하지 않습니다.
JungHwan Min

1
아, 나는 몰랐어요 ##2전체 목록이었다.
Martin Ender

3

펄, 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

자바 스크립트, 113 93 90 88 바이트

20 바이트를 절약 할 수있게 해준 @Neil에게 큰 감사를드립니다!
@Cyoce 덕분에 -3 바이트

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]]')

슬프게도, 자바 스크립트 같은 기능 부족 decbin, bindec그리고 str_padPHP의 매력.


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

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 바이트

R의 벡터화 솔루션을 생각해 냈습니다. 아마도 이진 변환으로 더 똑똑한 변환을 제공하여 골프를 타야 할 것입니다.

x=as.integer(intToBits(scan()));cat(LETTERS[1:4][match(paste0(x[16:9],x[8:1]),c("10","01","00","11"))],sep="")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.