Trapaceando um teste de múltipla escolha, parte 2

26

Esta é a continuação desse desafio de Adnan . Se você gosta desse desafio, é provável que também goste do outro. Confira!


Um teste de escolha múltipla com 8 questões cada um com 4 opções pode ter as respostas: BCADBADA. Convertido em quatro matrizes diferentes, com verdadeiro e falso, se a letra atual for a resposta, será semelhante a

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]

Isso pode ser compactado usando um pouco de lógica. Cada uma das escolhas A, B, Ce Dpode ser representado por dois verdadeiros falsos valores / mostrado abaixo:

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

Usando essa lógica, podemos compactar os quatro vetores acima para apenas dois:

 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]

Ou seja, a solução para o seu teste é simplesmente: 00110111, 10011010. Ao concatená-los, obtemos o número binário 0011011110011010ou 14234decimal. Use esse valor decimal para enganar seu teste!

Desafio

Pegue um número Nno intervalo (inclusive) [0, 65535]e produza uma sequência com a resposta para o teste de múltipla escolha.

Casos de teste:

14234
BCADBADA

38513
ABBDCAAB    

0
CCCCCCCC

120
CBBBBCCC

65535
DDDDDDDD

39253
ABCDABCD

A saída pode estar em letras maiúsculas ou minúsculas, mas você não pode usar outros símbolos.

Stewie Griffin
fonte
A saída precisa ser a sequência mostrada ou as letras podem estar em linhas separadas, em uma lista, etc?
xnor
@xnor Opcional :-)
Stewie Griffin
Por que não o óbvio A = 00, B = 01, C = 10, D = 11?
precisa saber é o seguinte
A razão pela qual eu fui criado A=10, B=01, então C=nor(A,B), e D=and(A,B)inspirado pelo desafio de Adnan. Em retrospectiva, poderia ter sido melhor fazê-lo ao contrário, mas bem ... Tarde demais agora ...
Stewie Griffin

Respostas:

3

Gelatina , 14 bytes

d⁹+⁹BZḄḊị“BADC

Experimente online! ou verifique todos os casos de teste .

Como funciona

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
fonte
10

05AB1E , 19 18 16 bytes

Código:

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

Usa a codificação CP-1252 . Experimente online!

Explicação:

Primeiro, adicionamos 65536ao número ( žHé uma constante definida como 65536), que também é 10000000000000000binária. Isto é para preencher o número com zeros. Vamos pegar o número 14234como exemplo. 14234 + 65536é igual a 79770. Qual em binário é:

10011011110011010

Removemos o primeiro caractere, resultando em:

0011011110011010

Dividimos a corda em duas partes usando :

00110111, 10011010

Depois disso, compactamos o array com ø:

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

Convertê-los novamente em decimal (usando C) resulta em:

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

Agora, só precisamos indexá-lo com a string cbad. A versão compactada para essa string é ’c‰±’, que também pode ser testada aqui . Finalmente, obtemos os caracteres no índice da matriz acima. Para o exemplo acima, isso resulta em:

1, 0, 2, 3, 1, 2, 3, 2
b  c  a  d  b  a  d  a
Adnan
fonte
6

JavaScript (ES6), 55 48 bytes

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

Versão não recursiva (55 bytes)

Usando uma expressão regular, podemos fazer:

n=>"76543210".replace(/./g,i=>"CBAD"[n>>i&1|n>>+i+7&2])
Arnauld
fonte
Como você pensou em fazer as operações bit a bit?
Ericw31415
@ ericw31415 - Mesmo que ele não está fazendo tão explicitamente, o desafio é realmente descrever essas operações bit a bit em ordem inversa (a partir de "Este pode ser comprimido usando um pouco de lógica." )
Arnauld
3
... um pouco da lógica ...
Neil
4

Python 2, 53 bytes

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

Teste em Ideone .

Dennis
fonte
Eu estava tentando usar, (n&257)%127mas é mais longo. Pena que 127 é primo. Talvez você possa pensar em uma maneira de otimizá-lo.
xnor
4

Montagem CP-1610 , 24 DECLEs (30 bytes)

Este código deve ser executado em um Intellivision . (1)

Um código de operação CP-1610 é codificado com um valor de 10 bits, conhecido como 'DECLE'. A função real tem 24 DECLEs, iniciando $4809e terminando em $4820.

Os registradores da CPU são, porém, 16 bits de largura, por isso vai apoiar qualquer valor de entrada em 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

Saída

captura de tela


(1) Concedido que pelo menos um compilador, vários emuladores e arquivos ROM de substituição sem direitos autorais estejam disponíveis gratuitamente, acho que ele não viola nenhuma regra de envio de PPCG. Mas, por favor, deixe-me saber se estou errado.

Arnauld
fonte
1
Como pontuamos em bytes, somamos o número total de bits e sua pontuação é o resultado decimal (flutuante) da divisão desse valor por oito. Nesse caso, 27,5 bytes.
mbomb007
3

CJam , 22 bytes

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

Experimente online!

Explicação

Alimentado por magia ...

O mapeamento de pares de bits para letras neste desafio é um pouco arbitrário. Se representamos ABCDpor 0, 1, 2, 3(para que possamos adicioná-los ao personagem A), queremos o seguinte mapeamento:

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

Esse mapeamento pode ser calculado com uma pequena fórmula mágica:, ((i1 == i2) + 1) ^ i1onde a verificação de igualdade retorna 0ou 1. Confira a tabela a seguir, onde cada coluna corresponde a uma entrada, cada linha corresponde a uma operação e cada célula mostra a pilha nesse ponto:

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

Com isso em mente, aqui está a descrição completa do código fonte:

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

Uma solução alternativa com a mesma contagem de bytes que é decididamente menos mágica:

ri2bG0e[8/z2fb"CBAD"f=

E, caso seja útil para qualquer pessoa, se você transformar os bits i1e i2novamente em um único número (ou seja, quando desejar o mapeamento 0 -> 2, 1 -> 1, 2 -> 0, 3 -> 3), isso poderá ser calculado ainda mais facilmente, (~n - 1) & 3ou (~n - 1) % 4se seu idioma obtiver um módulo sobre valores negativos. Eu acho que isso pode ser escrito de forma concisa como 3&~-~nem muitos idiomas. No CJam, este acaba sendo um byte mais longo, devido à conversão adicional da base 2.

Martin Ender
fonte
3

PHP, 57 bytes

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

Versão sem operadores Bitwise 70 bytes

for(;$i<8;)echo CABD[($s=sprintf("%016b",$argv[1]))[$i]+$s[8+$i++]*2];
Jörg Hülsermann
fonte
Onde a variável é $idefinida?
ericw31415
@ ericw31415 No primeiro uso de uma variável é inicializado e declarado automaticamente o PHP, essa variável com uma referência nula
Jörg Hülsermann
Isso é PHP (tm)
tomsmeding
3

Mathematica, 75 73 68 66 bytes

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

Obrigado a @MartinEnder por salvar 2 bytes.

JungHwan Min
fonte
@MartinEnder #+##e Infixtrabalho, mas o uso StringParté inevitável, porque a cabeça do "C"["B","A","D"][[#+##]]é "C", não List; StringJoinnão funciona
JungHwan Min 25/09/16
1
Ah, eu não percebi isso #e #2estava na lista inteira.
Martin Ender
3

Perl, 42 bytes

Inclui +1 para -n

Dê entrada no STDIN:

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

Apenas o código:

say+(A..D)[2-($`>>8-$_&257)%127]for/$/..8
Ton Hospel
fonte
3

JavaScript, 113 93 90 88 bytes

Um grande obrigado a @ Neil por me ajudar a economizar 20 bytes!
-3 bytes graças a @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]]')

Infelizmente, JavaScript carece de funções como decbin, bindece str_padque o PHP tem.

ericw31415
fonte
1
(65536+n).toString(2).slice(1)e [+b[i+8]+2*b[i]]seria mais curto, por exemplo.
Neil
padStart, caso seja aceito em uma versão futura do ECMAscript, resultará em uma economia maior.
Neil
1
Ao invés de {…;return } , useeval("…")
Cyoce 2/16
@ Neil Parece que padStartagora existe no ECMAScript.
precisa saber é o seguinte
1

MATL, 16 bytes

16&B8eXB'BADC'w)

Experimente Online!

ou Verifique todos os casos de teste

Explicação

        % 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
fonte
1

Julia, 73 bytes

Dá uma função f, recebendo N como entrada e retornando a resposta como sequência.

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

Tente

Dependendo se um array de caracteres conta como string, é possível omitir a junção ( 67 bytes )

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

Tente

pasbi
fonte
0

R, 110 bytes

Criamos uma solução vetorizada em R. Isso provavelmente deveria ser praticado por golf, chegando a uma conversão mais inteligente em conversão binária.

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