การเตรียมการทดสอบแบบปรนัย


12

บทนำ

หมายเหตุ: นี่ไม่ใช่วิธีการที่จะส่งเสริมการโกง ในฐานะที่เป็นCᴏɴᴏʀO'Bʀɪᴇɴแล้วกล่าวว่าการศึกษาเป็นทางออกที่ดีที่สุดสำหรับการส่งผ่านการทดสอบ: 3

ลองพิจารณาคำตอบต่อไปนี้สำหรับการทดสอบแบบปรนัย:

ABCBCAAB

นี่คือตารางที่ระบุว่าคำตอบตรงกันหรือไม่:

    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

สิ่งนี้ทำให้เรามีตัวเลขดังต่อไปนี้:

10000110, 01010001, 00101000

ความท้าทายคือการพิมพ์เลขฐานสองเหล่านี้ แต่สิ่งสำคัญคือต้องดูว่าใช้ตัวอักษรใดในการทดสอบแบบปรนัย ตัวอย่างเช่น:

ABCDCDBCDABC

นี้ตัวอักษรสูงสุดคือDซึ่งเป็นตัวอักษร 4 ตัวอักษร ดังนั้นเราจำเป็นต้องแสดงเลขฐานสองที่แตกต่างกัน 4ตัว กล่าวคือ:

100000000100, 010000100010, 001010010001, 000101001000

โปรดทราบว่าคุณจะต้องมองไปที่ตัวอักษรสูงสุด ลองพิจารณาตัวอย่างต่อไปนี้:

AACCACAC

แม้ว่าจะไม่ได้ใช้เราต้องแสดงผลลัพธ์การไบนารีB Bหมายความว่าคำตอบคือ:

11001010, 00000000, 00110101

งาน

ให้คำตอบสำหรับการทดสอบแบบปรนัยออกตัวเลขไบนารี่ คุณอาจจะคิดว่าการป้อนข้อมูลจะไม่ว่างเปล่าและที่เดียวที่มีตัวอักษร [A-Z]คุณสามารถใช้จริงและเท็จแทนค่าศูนย์และศูนย์ได้


กรณีทดสอบ:

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

นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!


เราสามารถใช้[a-z]แทนได้หรือไม่
FryAmTheEggman

@FryAmTheEggman แน่นอน :)
Adnan


ไม่มีกฎสำหรับเอาต์พุตที่ระบุไว้อนุญาตให้ใช้อาร์เรย์แบบสองมิติของ bools หรือไม่
Eumel

ดูเหมือนจะไม่สมเหตุสมผล แต่ก็ใช้ได้กับฉันเช่นกัน ^^
Eumel

คำตอบ:


3

Pyth, 12 ไบต์

mqLdzfsgRTzG

เอาต์พุตเป็นอาร์เรย์บูลีนที่ซ้อนกัน

                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.

ลองมันนี่


6

Python 3, 71

บันทึก 22 ไบต์ขอบคุณ Ogaday
บันทึก 3 ไบต์ด้วย DSM

บันทึกจำนวนไบต์ต้องขอบคุณอาร์เรย์ของ bools ที่ถูกต้อง

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

รับอินพุตบรรทัดคำสั่งตัวพิมพ์ใหญ่



ตอนนี้มีจำนวนของบูลเป็นไปได้ด้วยถ้ามันช่วยได้
Adnan

3

PowerShell, 95 94 73 ไบต์

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

จะเข้าเป็นสตริงตัวพิมพ์ใหญ่ [char[]]แต่ทันทีปลดเปลื้องมัน จากนั้นเราวนลูปจาก0..ไปยังค่าสูงสุดของการ$aดำเนินการตามตัวอักษร (ดังนั้นการ-65แปลงจาก ASCII) ตัวอย่างเช่นADCEBนี้อาจจะคิดว่าเป็นบ่วงจากไปAE

การวนซ้ำแต่ละครั้งเราตั้งค่าตัวแปรตัวช่วย$dเท่ากับค่าตัวอักษร (ไม่ใช่ ASCII) ปัจจุบัน จากนั้นเราวนซ้ำทุก$aครั้งที่ใส่อย่างใดอย่างหนึ่ง0หรือ1ไปป์ไลน์ตามว่า$_-$d-65เป็นจริงหรือเท็จ (กล่าวคือไม่ว่าเราจะอยู่ใน "ช่อง" ที่ถูกต้อง) งานนี้เนื่องจากค่าที่ไม่ใช่ศูนย์ใด ๆ ใน PowerShell เป็น truthy ความหมายถ้าจดหมายของเราในปัจจุบัน$_ไม่ได้ "เท่ากับ" สิ่งที่ช่องที่เราอยู่ใน$dนั้น!ที่เป็นหรือ$false0

แต่ละอาร์เรย์ของ0s และ1s จะถูก-joinรวมเข้าด้วยกันแล้วนำไปวางบนท่ออีกครั้ง เมื่อลูปด้านนอกสิ้นสุดเรามีอาร์เรย์ของสตริงซึ่งจะพิมพ์หนึ่งสตริงต่อบรรทัด

ตัวอย่าง

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

แก้ไข 1 - บันทึกไบต์โดยใช้บูลีน - ไม่ใช่แทน -eq
แก้ไข 2 - บันทึกอีก 21 ไบต์โดยการกำจัดอาร์เรย์พิเศษ $ b


ตอนนี้มีจำนวนของบูลเป็นไปได้ด้วยถ้ามันช่วยได้
Adnan

3

LabVIEW, 30 22 20 LabVIEW Primitives

ผ่านจาก az จนกระทั่งผลรวมของบูลทั้งหมดเท่ากับความยาวของอินพุต จากนั้นแปลง bools เป็นตัวเลข

ตอนนี้ใช้เวลาสูงสุดโดยตรงแทนที่จะตรวจสอบผลรวมบูล

เนื่องจาก Bools 2D ทำงานได้ตอนนี้ฉันประหยัด 2 Primitives ด้วยการส่งสัญญาณสายสีเขียวที่ด้านหน้า?1:0สามารถทำซ้ำได้ แต่ฉันขี้เกียจเกินไป ...

รหัสใหม่ รหัสเก่า


ตอนนี้มีจำนวนของบูลเป็นไปได้ด้วยถ้ามันช่วยได้
Adnan

2

Cjam, 25 ไบต์

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

ถอนหายใจ

คำอธิบาย

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

ขอแสดงความยินดีกับ 1k BTW ตัวแทน!
บลู

ตอนนี้มีจำนวนของบูลเป็นไปได้ด้วยถ้ามันช่วยได้
Adnan

2

Haskell, 46 34 ไบต์

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

ตัวอย่างการใช้งาน: ->g "ACDC"[[True,False,False,False],[False,False,False,False],[False,True,False,True],[False,False,True,False]]

มันทำงานอย่างไร:

        <$>['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 ไบต์

VhxGeSzmq@GNdz

คำอธิบาย:

               - 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(^)

ส่งเอาต์พุตอาร์เรย์แบบสองมิติ

ลองที่นี่


2

ES6, 92 ไบต์

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

ส่งคืนอาร์เรย์ของอาร์เรย์ของความผิดพลาดและความจริง หากคุณต้องการอาเรย์ของสตริงของศูนย์และคนนั้นเป็น 97 ไบต์:

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

2

อ็อกเทฟ, 19 ไบต์

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

ใช้การออกอากาศอัตโนมัติของ Octave ในช่วงAไปยังองค์ประกอบสูงสุดในอินพุตเพื่อสร้างอาร์เรย์บูลีน 2d ขององค์ประกอบที่ตรงกัน

ตัวอย่าง:

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

ลองมันนี่บนideone


1

Lua, 208 189 ไบต์

นั่นเป็นเรื่องยากในลัวะปกติเราต้องทำทุกอย่างตั้งแต่เริ่มต้นและใช้สถานที่มากมาย! โปรแกรมนี้ใช้สตริงเป็นอาร์กิวเมนต์และพิมพ์ผลลัพธ์ :)

แก้ไข: @Adnan บอกฉันว่าเราได้รับอนุญาตให้ส่งคืนเมทริกซ์ของบูลีนดังนั้นนี่เป็นเวอร์ชันใหม่! ตอนนี้มันเป็นฟังก์ชันที่ใช้สตริงของอักขระตัวพิมพ์ใหญ่และส่งกลับเมทริกซ์ :)

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

เวอร์ชั่นเก่า 208 ไบต์

นี่คืออันที่ทำงานกับอาร์กิวเมนต์และผลลัพธ์การพิมพ์

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 และคำอธิบาย

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 จะส่งผลให้การพิมพ์ที่อยู่และการเชื่อมโยงบูลเป็นไปไม่ได้ ดังนั้นนี่คือฟังก์ชันที่จะช่วยคุณถ้าคุณต้องการทดสอบการส่งนี้

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"))

ตอนนี้มีจำนวนของบูลเป็นไปได้ด้วยถ้ามันช่วยได้
Adnan

@Adnan ดีมันช่วยให้ฉันสามารถวางไบต์จำนวนมาก ฉันเขียนฟังก์ชั่นที่จะมีการส่งออกที่ชัดเจนสำหรับการทดสอบวัตถุประสงค์แล้วโพสต์ฉบับแก้ไข :)
Katenkyo

1

Perl, 84 ไบต์

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

โอ้ที่รักฉันดูเหมือนปากกาไฮไลท์เสีย

เวอร์ชันที่ไม่ถูกปรับแต่ง:

# 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 ไบต์

ใช้การเข้ารหัส Windows-1252

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

ทำงานแบบนี้ ( -dเพิ่มเพื่อความสวยงามเท่านั้น):

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
  • บันทึก 14 ไบต์โดยซ้อนลูปด้วยวิธีอื่น
  • บันทึก 2 ไบต์โดยใช้ตัวแปรตัวแปรเพื่อป้องกัน $i=0
  • บันทึกไบต์ด้วยการแปลงสตริงและวางตัวคั่นสตริง
  • บันทึกเป็นไบต์โดยเลื่อน echo (เปลี่ยนเป็นการพิมพ์เพื่อให้พอดี) ภายในแรกสำหรับลูปและวางวงเล็บปีกกา
  • บันทึกไบต์โดยการเพิ่มที่$xอื่นและการเพิ่ม$cเพื่อชดเชย

0

C #, 68 ไบต์

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

ทำงานใน C # Pad

ฟังก์ชั่นที่ไม่ระบุชื่อนี้ใช้char[]เป็นอินพุตและเอาต์พุตIEnumerable<IEnumerable<int>>มีเพียง 0 และ 1


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.