Çoktan seçmeli bir testte hile yapmak, bölüm 2


26

Bu, Adnan tarafından bu mücadelenin devamı niteliğindedir . Bu meydan okumayı seviyorsanız, şansınız diğerini de beğenirsiniz. Bunu kontrol et!


8 sorularla 4 seçenekleriyle her biriyle bir çoktan seçmeli bir test cevapları vardır: BCADBADA. Dört farklı diziye dönüştürülmüş, doğru mektubu cevap ise, doğru ve yanlış olarak

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]

Bu, bir miktar mantık kullanarak sıkıştırılabilir. Seçimler Her A, B, Cve Daşağıda gösterilen iki doğru / yanlış değerler ile temsil edilebilir:

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

Bu mantığı kullanarak, yukarıdaki dört vektörü sadece ikiye sıkıştırabiliriz:

 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]

Yani, testinizin çözümü basitçe: 00110111, 10011010. Bunları birleştirerek, ikili sayıyı 0011011110011010ya 14234da ondalık olarak alırız . Testinizi aldatmak için bu ondalık değeri kullanın!

Meydan okuma

N(Dahil) aralığında bir sayı alın [0, 65535]ve çoktan seçmeli teste cevap ile bir dize çıktı.

Test durumları:

14234
BCADBADA

38513
ABBDCAAB    

0
CCCCCCCC

120
CBBBBCCC

65535
DDDDDDDD

39253
ABCDABCD

Çıktı büyük veya küçük harf olabilir, ancak diğer simgeleri kullanamazsınız.


Çıktının gösterildiği gibi dize olması gerekiyor mu, yoksa harfler ayrı satırlarda, listede vb. Olabilir mi?
xnor

@xnor İsteğe bağlı :-)
Stewie Griffin

Neden bariz A = 00, B = 01, C = 10, D = 11 değil?
user253751

Sebebi ben ilk yapılmış A=10, B=01, daha sonra C=nor(A,B), ve D=and(A,B), Adnan'ın meydan esinlenerek. Gezinti yerinde başka türlü yapmak daha iyi olabilirdi, ama iyi ... Şimdi çok geç ...
Stewie Griffin

Yanıtlar:


3

Jöle , 14 bayt

d⁹+⁹BZḄḊị“BADC

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

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 bayt

Kod:

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

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin!

Açıklama:

İlk önce, aynı zamanda ikili olan 65536sayıya ( žHtanımlanmış bir sabittir 65536) ekleriz 10000000000000000. Bu sayıyı sıfırlarla doldurmak içindir. Numarayı 14234örnek olarak alalım. 14234 + 65536eşittir 79770. İkili olan:

10011011110011010

İlk karakteri çıkarırız, sonuçta:

0011011110011010

Dizeyi kullanarak iki parçaya böldük :

00110111, 10011010

Ondan sonra diziyi şu şekilde sıkıştırıyoruz ø:

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

Onları ondalık basamağa dönüştürerek (kullanarak C) sonuçlanır:

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

Şimdi, onu yalnızca dizeyle dizine eklememiz gerekiyor cbad. Bu dize için sıkıştırılmış versiyonu ’c‰±’da test edilebilir, hangi burada . Son olarak, yukarıdaki dizinin dizinindeki karakterleri elde ederiz. Yukarıdaki örnekte, bu şöyle sonuçlanır:

1, 0, 2, 3, 1, 2, 3, 2
b  c  a  d  b  a  d  a

6

JavaScript (ES6), 55 48 bayt

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

Özyinelemeyen sürüm (55 bayt)

Düzenli bir ifade kullanarak şunları yapabiliriz:

n=>"76543210".replace(/./g,i=>"CBAD"[n>>i&1|n>>+i+7&2])

Bitsel işlemleri yapmayı nasıl düşündün?
ericw31415

@ ericw31415 - Açıkça yapmasa bile, meydan okuma aslında bu bitsel işlemleri ters sırayla açıklıyor ( "Bu, bir miktar mantık kullanarak sıkıştırılabilir." )
Arnauld

3
... biraz mantık ...
Neil

4

Python 2, 53 bayt

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

İdeone üzerinde test et .


Kullanmaya çalışıyordum (n&257)%127ama daha uzun. Çok kötü 127 asal. Belki de optimize etmenin bir yolunu düşünebilirsin.
xnor

4

CP-1610 montajı, 24 DECLE (30 bayt)

Bu kod bir Intellivision'da çalıştırılmak üzere tasarlanmıştır . (1)

Bir CP-1610 opcode 'DECLE' olarak bilinen 10 bitlik bir değerle kodlanır. Gerçek fonksiyon 24 DECLEs uzunluğunda başlıyor $4809ve bitiyor $4820.

İşlemci kayıtları ancak 16 bit genişliğindedir, bu yüzden 0x0000.. de herhangi bir giriş değerini destekleyecektir 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

Çıktı

ekran görüntüsü


(1) En az bir derleyicinin, birkaç öykünücünün ve telif hakkı olmayan yeni ROM dosyasının serbest bir şekilde temin edilebileceği kabul edilir, herhangi bir PPCG teslim kuralını ihlal etmediğini düşünüyorum. Ama lütfen yanılıyorsam bana haber ver.


1
Bayt cinsinden puan alıyoruz, bu nedenle toplam bit sayısını toplayın ve puanınız o değeri sekize bölmenin ondalık (float) sonucudur. Bu durumda, 27,5 bayt.
mbomb007 26:16

3

CJam , 22 bayt

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

Çevrimiçi deneyin!

açıklama

Sihirden güç alıyor ...

Bu çiftlikte bit çiftlerinin harflerle eşlenmesi biraz keyfidir. Temsil ettiğimiz takdirde ABCDtarafından 0, 1, 2, 3(biz sadece karakteri ekleyebilirsiniz böylece A) o zaman aşağıdaki eşleştirmeyi istiyorum:

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

Bu haritalama, küçük bir formülle hesaplanabilir: ((i1 == i2) + 1) ^ i1eşitlik kontrolünün 0veya döndürdüğü yer 1. Her sütunun bir girişe karşılık geldiği, her satırın bir işleme karşılık geldiği ve her hücrenin o noktada yığını göstereceği aşağıdaki tabloya bakın:

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

Burada akılda tutulması gereken kaynak kodun tam dağılımı:

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

Kesinlikle daha az büyülü olan aynı bayt sayısına sahip alternatif bir çözüm:

ri2bG0e[8/z2fb"CBAD"f=

Ve eğer herkes için faydalı olursa, eğer i1ve i2bitleri tekrar tek bir sayıya çevirirseniz (yani, haritalamayı istediğiniz zaman 0 -> 2, 1 -> 1, 2 -> 0, 3 -> 3), bu daha kolay bir şekilde hesaplanabilir (~n - 1) & 3veya (~n - 1) % 4dilinizin negatif değerler üzerinde modulo alması durumunda daha kolay hesaplanabilir . Bunun 3&~-~nbirçok dilde olduğu gibi tam olarak yazılabileceğini düşünüyorum . CJam'de bu, taban 2'den ilave dönüşüm nedeniyle daha uzun bir bayt olarak ortaya çıkıyor.


3

PHP, 57 Bayt

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

Bitwise operatörleri olmayan sürüm 70 Bytes

for(;$i<8;)echo CABD[($s=sprintf("%016b",$argv[1]))[$i]+$s[8+$i++]*2];

Değişken nerede $itanımlanır?
ericw31415

@ ericw31415 Bir değişkenin ilk kullanımında başlatılır ve otomatik olarak PHP ile bildirilir. Bu değişken null referansla belirtilir
Jörg Hülsermann 25:16

Bu PHP (tm)
16'da

3

Mathematica, 75 73 68 66 bayt

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

2 bayt kaydettiğiniz için @ Martininder sayesinde.


@MartinEnder #+##ve Infixçalışır, ancak kullanma StringPartbaşkanı çünkü kaçınılmazdır "C"["B","A","D"][[#+##]]olduğu "C"değil List; StringJoinçalışmıyor
JungHwan Min

1
Oh, bunun farkında değildim #ve #2tüm listeler vardı.
Martin Ender

3

Perl, 42 bayt

İçin +1 içerir -n

STDIN'e giriş verin:

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

Sadece kod:

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

3

JavaScript, 113 93 90 88 bayt

@Neil'e 20 byte tasarruf etmeme yardım ettiğin için çok teşekkürler!
@Cyoce sayesinde -3 bayt

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

Ne yazık ki, JavaScript gibi işlevleri yoksun decbin, bindecve str_padPHP sahip olduğunu.


1
(65536+n).toString(2).slice(1)ve [+b[i+8]+2*b[i]]örneğin daha kısa olurdu.
Neil

padStartECMAscript'in gelecekteki bir sürümüne kabul edilmesi halinde, daha büyük bir tasarrufla sonuçlanacaktır.
Neil

1
Yerine {…;return }, kullanıneval("…")
Cyoce

@Neil padStartŞimdi ECMAScript'te var gibi görünüyor .
ericw31415

1

MATL, 16 bayt

16&B8eXB'BADC'w)

Çevrimiçi Deneyin!

veya Tüm test durumlarını doğrula

açıklama

        % 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

Julia, 73 Bayt

F'yi N olarak alan ve cevabı string olarak döndüren bir fonksiyon verir.

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

Dene

Bir karakter dizisinin dize olarak sayılmasına bağlı olarak, bir birleştirme atlanabilir ( 67 Bayt )

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

Dene


0

R, 110 bayt

R'de vectorized bir çözüm ortaya çıktı. Bu muhtemelen ikili dönüşüm için daha akıllı bir dönüşümle ortaya çıkarak golf oynayabilir.

x=as.integer(intToBits(scan()));cat(LETTERS[1:4][match(paste0(x[16:9],x[8:1]),c("10","01","00","11"))],sep="")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.