Çoktan seçmeli test hazırlama


12

Giriş

Not: Bu, hile yapmayı teşvik etmek için bir tür yöntem değildir. As Cᴏɴᴏʀ O'Bʀɪᴇɴ 3: Zaten okuyan bir sınavını geçtiği için en iyi çözüm olduğunu söyledi.

Çoktan seçmeli test için aşağıdaki cevapları göz önünde bulundurun:

ABCBCAAB

İşte cevapların eşleşip eşleşmediğini gösteren bir tablo:

    A B C B C A A B

A   1 0 0 0 0 1 1 0
B   0 1 0 1 0 0 0 1
C   0 0 1 0 1 0 0 0

Bu bize aşağıdaki sayıları verir:

10000110, 01010001, 00101000

Zor olan bu ikili sayıları yazdırmaktır. Ancak , çoktan seçmeli testte hangi harflerin kullanıldığını görmek önemlidir . Örneğin:

ABCDCDBCDABC

Bu en yüksek mektup olduğu Dolan alfabesinde 4 mektup . Bu nedenle 4 farklı ikili sayı çıkarmamız gerekiyor . Yani:

100000000100, 010000100010, 001010010001, 000101001000

En yüksek harfe bakmanız gerektiğini unutmayın . Aşağıdaki örneği düşünün:

AACCACAC

Her ne kadar Bkullanılmasa da, için ikili sonuç çıkarmamız gerekir B. Bunun anlamı, cevap:

11001010, 00000000, 00110101

Görev

Çoktan seçmeli bir testin cevapları göz önüne alındığında, ikili sayıların çıktısını alın. Girişin boş olmayacağını ve yalnızca harfleri içerdiğini varsayabilirsiniz[A-Z] . Sıfırlar ve sıfırlar yerine doğru ve yanlış kullanabilirsiniz.


Test senaryoları:

Input: ABBBABABA
Output: 100010101, 011101010

Input: AAAAAAAAA
Output: 111111111

Input: AFGHEEHFD
Output: 100000000 000000000 000000000 000000001 000011000 010000010 001000000 000100100

Input: Z
Output: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1

Input: ABCDCDBCDABC
Output: 100000000100, 010000100010, 001010010001, 000101001000

Bu , yani en az bayt ile gönderme kazanır!


[a-z]Bunun yerine kullanabilir miyiz ?
FryAmTheEggman

@FryAmTheEggman Elbette :)
Adnan


belirtilen çıktı için herhangi bir kural yok, 2D bir bools dizisine izin veriliyor mu?
Eumel

Bu biraz mantıksız görünüyor ama benim için de çalışıyor ^^
Eumel

Yanıtlar:


3

Pyth, 12 bayt

mqLdzfsgRTzG

Yuvalanmış bir booleans dizisi olarak çıktılar.

                Implicit: z=input
m               Map lambda d:
 qLdz            map equal-to-d over z
     f           over all letters T in the
           G     lowercase alphabet for which
      s           At least one char in z
       gRTz       >= T.

Burada deneyin .


6

Python 3, 71

Ogaday sayesinde 22 bayt tasarruf etti.
DSM sayesinde 3 bayt tasarruf etti.

Geçerli bir dizi boğa sayesinde bir bayt bayt kaydetti.

*k,=map(ord,input())
x=65
while x<=max(k):print([v==x for v in k]);x+=1

Büyük harf komut satırı girişi alır.


1
Genişletilmiş yinelenebilir ambalajı kullanın :*k,=map(ord,input())
Ogaday

Artık bir dizi bools da mümkün.
Adnan

3

PowerShell, 95 94 73 bayt

param([char[]]$a)0..(($a|sort)[-1]-65)|%{$d=$_;-join($a|%{+!($_-$d-65)})}

Girişi büyük harfli bir dize olarak alır, ancak hemen yayınlar [char[]]. Ardından alfabetik 0..olarak $aalınan maksimum değere dönüyoruz (dolayısıyla -65ASCII'den dönüştürmek için). Örneğin, birlikte ADCEB, bundan döngü olarak düşünülebilir Aiçin E.

Her yinelemede, $dgeçerli alfabetik (ASCII değil) değerine eşit bir yardımcı değişken belirledik . Daha sonra $aher seferinde ya doğru ya 0da 1boru hattına koyarak, doğru ya da $_-$d-65falsey (yani, doğru "yuvada olup olmadığımız ) temelinde döngü yaparız. Bu eserler PowerShell herhangi sıfır olmayan bir değer mevcut mektup eğer anlamı truthy çünkü $_içinde bulunduğumuz Ne yuvası "eşit" değil $d, sonra !bunun ise $falseya 0.

Bu 0s ve 1s dizilerinin her biri daha sonra bir -joinaraya getirilir ve boru hattına yeniden konur. Dış döngü sona erdiğinde, her satıra bir dize yazdıracak bir dizeler dizimiz vardır.

Örnekler

PS C:\Tools\Scripts\golfing> .\preparing-a-multiple-choice-test.ps1 ABCDEFGH
10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001

PS C:\Tools\Scripts\golfing> .\preparing-a-multiple-choice-test.ps1 AFGHEEHFD
100000000
000000000
000000000
000000001
000011000
010000010
001000000
000100100

Edit 1 - -eq yerine Boolean-not kullanarak bir bayt kaydetti
Edit 2 - ekstra $ b dizisini kaldırarak 21 bayt daha kaydetti


Artık bir dizi bools da mümkün.
Adnan

3

LabVIEW, 30 22 20 LabVIEW Temel Öğeleri

Tüm boollerin toplamı giriş uzunluğuna eşit olana kadar az'dan geçer. sonra bools'u sayılara dönüştürür.

Şimdi bool toplamını kontrol etmek yerine doğrudan maksimumu alır.

2D bools şimdi uygun olduğundan, 2 yeşil elemanın önündeki yeşil teli ?1:0çıkararak bunu tekrarlayabilirim, ancak çok tembelim ...

yeni kod eski kod


Artık bir dizi bools da mümkün.
Adnan

2

Cjam, 25 bayt

l{'A-i}%_:e>),\f{f=", "}

İç çekmek,

açıklama

l{'A-i}%_:e>),\f{f=", "}
l                        e# get the input
 {'A-i}%                 e# get the normalized array
        _:e>             e# get the maximum value
            ),           e# create the array from 1..N
              \f{      } e# map over the created array
                 f=      e# 1 if match, 0 if not
                   ", "  e# add separator

Tebrikler 1k rep BTW!
Mavi

Artık bir dizi bools da mümkün.
Adnan

2

Haskell, 46 34 bayt

g x=(<$>x).(==)<$>['A'..maximum x]

Kullanım örneği: g "ACDC"-> [[True,False,False,False],[False,False,False,False],[False,True,False,True],[False,False,True,False]].

Nasıl çalışır:

        <$>['A'..maximum x]   -- for every letter from A to the highest letter in x
<$>x                          -- loop over x and
      ==                      -- compare the letter with the current element in x
                              -- which results in a boolean          

2

Pyth, 20 19 17 15 14 bayt

VhxGeSzmq@GNdz

Açıklama:

               - autoassign z = input()
V              - For N in range(V)
 hxGeSz
    eSz        - max(z)
  xG           - lowercase_alphabet.index(^)
 h             - +1
       mq@GNdz
       m     z - [V for d in z]
         @GN   - lowercase_alphabet[N]
        q   d  - is_equal(^, ^^)
               - print "".join(^)

2D dizi boole çıktı verir

Burada deneyin


2

ES6, 92 bayt

s=>[..."ABCDEFGHIJKLMNOPQRSTUVWXYZ"].map(c=>[...s].map(m=>m==c&&!!(l=n),n++),n=0).slice(0,l)

Bir dizi yanlış ve trues dizisi döndürür. Sıfırlar ve sıfırlar dizisini tercih ederseniz, 97 bayt için:

s=>[..."ABCDEFGHIJKLMNOPQRSTUVWXYZ"].map(c=>s.replace(/./g,m=>m==c?(l=n,1):0,n++),n=0).slice(0,l)

2

Oktav, 19 bayt

@(s)s==[65:max(s)]'

Octad'ın A, 2d boolean eşleşen öğe dizisi üretmek için girişteki maksimum öğeye kadar olan aralıktaki otomatik yayınını kullanır .

Misal:

Key = ABCDCDBCDABC

ans =

   1   0   0   0   0   0   0   0   0   1   0   0
   0   1   0   0   0   0   1   0   0   0   1   0
   0   0   1   0   1   0   0   1   0   0   0   1
   0   0   0   1   0   1   0   0   1   0   0   0

Burada ideone üzerinde deneyin .


1

Lua, 208 189 Bayt

Bu lua zor, her zamanki gibi, sıfırdan her şeyi yapmak zorunda, ve çok yer alır! Bu program argüman olarak bir dize alır ve sonucu yazdırır :).

Düzenleme: @Adnan bana şimdi bir boole matrisi döndürmemize izin verildiğini söyledi, işte yeni bir sürüm! Artık büyük harfli karakter dizisi alan ve matrisi döndüren bir işlevdir :).

function f(x)a={}b={}for i=1,#x do a[i]=x:sub(i,i)end table.sort(a)for i=1,a[#a]:byte()-64 do b[i]={}end x:gsub(".",function(c)for i=1,#b do z=b[i]z[#z+1]=i+64==c:byte()end end)return b end

Eski 208 Byte sürümü

Bu, argüman ve baskı sonuçlarıyla çalışan kişidir.

a={}b={}x=arg[1]for i=1,#x do a[i]=x:sub(i,i)end table.sort(a)for i=1,a[#a]:byte()-64 do b[i]=""end x:gsub(".",function(c)for i=1,#b do b[i]=b[i]..(i+64==c:byte()and"1"or"0")end end)print(table.concat(b,","))

Ungolfed ve açıklamalar

function f(x)
a={}                   -- We need 2 arrays, and while b=a would have been shorter
b={}                   -- arrays in lua are passed by pointer, so it wouldn't have worked

for i=1,#x             -- iterate over the inpute to transform the string
do                     -- into an array
  a[i]=x:sub(i,i)      -- with each cells containing a characyer
end
table.sort(a)          -- sort the array/string

for i=1,               -- iterate n times were n is the place in the alphabet
       a[#a]:byte()-64 -- of the last element of the (sorted) array a
do
  b[i]={}              -- initialise cells in b up to n with empty arrays
end                    -- a cell's index is the position of a letter in the alphabet

x:gsub(".",function(c) -- for each character in the input
  for i=1,#b           -- iterate over each cells in b
  do
    z=b[i]             -- define z pointing on the array b[i]
    z[#z+1]=           -- insert into b[i] the result of the
       i+64==c:byte()  -- comparison of the current char, and the answer
  end
end)
return b
end

Lua'da bir dizi yazdırmaya çalışmak, adresinin yazdırılmasıyla sonuçlanır ve bools'u birleştirmek imkansızdır. İşte bu gönderimi test etmek istiyorsanız size yardımcı olacak bir işlev

function f(x)a={}b={}for i=1,#x do a[i]=x:sub(i,i)end table.sort(a)for i=1,a[#a]:byte()-64 do b[i]={}end x:gsub(".",function(c)for i=1,#b do z=b[i]z[#z+1]=i+64==c:byte()end end)return b end

function printBooleanMatrix(m)
  s="{"
  for i=1,#m
  do
    s=s.."{"
    for j=1,#m[i]
    do
      s=s..(m[i][j]and"1"or"0")..(j==#m[i]and""or",")
    end
    s=s.."}"..(i==#m and""or",\n")
  end
  print(s.."}")
end

printBooleanMatrix(f("ABBCCDDC"))

Artık bir dizi bools da mümkün.
Adnan

@Adnan, çok fazla bayt bırakmamı sağlıyor. Test amacıyla net bir çıktı elde etmek için bir işlev yazıyorum, sonra revize bir sürüm
yayınla

1

Perl, 84 bayt

$\="\n";@i=split//,<>;pop@i;for$c('a'..(reverse sort@i)[0]){print map{/$c/?1:0}@i;}

Ah canım, fosforlu kalem kırılmış gibi görünüyor.

Ungolfed sürümü:

# output formatting
$\ = "\n";
# get input chars as array
@i = split //, <>;
# lose the newline
pop @i;
# iterate over characters up to the max
for $c ('a'..(reverse sort @i)[0]) {
    # print 1 for each match, 0 otherwise
    print map { /$c/ ? 1 : 0 } @i;
}

1

PHP, 106 92 90 87 bayt

Windows-1252 kodlamasını kullanır.

for($x=A;$x++<=max($z=str_split($argv[1]));print~Ó)for(;$c=$z[+$$x++];)echo+(++$c==$x);

Böyle çalıştırın ( -dsadece estetik için eklendi):

php -d error_reporting=30709 -r 'for($x=A;$x++<=max($z=str_split($argv[1]));print~Ó)for(;$c=$z[+$$x++];)echo+(++$c==$x); echo"\n";' ABCDDHFHUYFSJGK
  • Döngüler başka şekilde yuvalanarak 14 bayt kaydedildi
  • Önlemek için değişken değişkenler kullanarak 2 bayt kaydedildi $i=0
  • Dizeyi ters çevirip dize sınırlayıcılarını bırakarak bir bayt kaydetti
  • Döngü için ilkeyi yankı (sığacak şekilde değiştirildi) hareket ettirerek ve kıvırcık parantezleri bırakarak bir bayt kaydetti
  • $xBaşka bir yeri artırarak $cve telafi etmek için artırarak bir bayt kaydetti

0

C #, 68 bayt

c=>Enumerable.Range(65,c.Max()-64).Select(x=>c.Select(y=>x==y?1:0));

C # Pad ile Çalıştır

Bu anonim işlev, bir char[]as girişini alır ve IEnumerable<IEnumerable<int>>yalnızca 0 ve 1 ile bir an çıkarır .


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.