ทำ Grader การแข่งขันคณิตศาสตร์


17

ฉันสนุกกับการเข้าร่วมการแข่งขันคณิตศาสตร์ที่ดำเนินการโดย Mu Alpha Theta สมาคมคณิตศาสตร์แห่งสหรัฐอเมริกา ที่การแข่งขันฉันทำการทดสอบแบบปรนัย 30 ข้อ มีห้าตัวเลือกต่อคำถามที่มีข้อความ A ถึง E

คะแนนของฉันในการทดสอบคือสี่คะแนนสำหรับแต่ละคำตอบที่ถูกต้องคะแนนศูนย์สำหรับคำถามที่เว้นว่างไว้และลบหนึ่งคะแนนสำหรับคำตอบที่ผิดแต่ละข้อ

เขียนโปรแกรมที่ให้คะแนนการทดสอบตามระบบการให้คะแนนข้างต้น ควรมีสององค์ประกอบในการป้อนข้อมูล: คีย์คำตอบตามด้วยการตอบสนอง คำถามที่เว้นว่างไว้จะถูกป้อนเป็นช่องว่าง อินพุตแรกต้องมีเฉพาะตัวอักษร AE (หรือ ae, ตัวเลือกของคุณ) และสามารถสันนิษฐานได้ว่าไม่มีช่องว่างในอินพุต อินพุตที่สองต้องมีช่องว่างและตัวอักษร AE (หรือ ae) เท่านั้น อินพุตที่ไม่ใช้การทดสอบ 30 คำถามจะต้องพิมพ์Invalid testเป็นเอาต์พุต

Invalid testการส่งออกควรจะมีคะแนนหรือ

โบนัส

หากโปรแกรมของคุณพิมพ์หมายเลขที่ถูกต้องจำนวนที่เว้นว่างไว้และหมายเลขที่ไม่ถูกต้องหลังจากทำคะแนนสุดท้ายให้(aR bB cW)ปิด 20 ไบต์

ตัวอย่างอินพุต

CABBDCABECDBACDBEAACADDBBBEDDA    //answer key
CABEDDABDC BACDBBAADE  CBBEDDA    //responses

ตัวอย่างผลลัพธ์

ไม่มีโบนัส

73

โบนัส

73 (20R 3B 7W)

ใช้กฎมาตรฐาน รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


เราควรทำอย่างไรกับช่องว่างในบรรทัดแรก
lirtosiast

@ThomasKwa ไม่ควรมีช่องว่างในบรรทัดแรก Invalid test.
Arcturus

2
ดูเหมือนว่าคุณจะเปลี่ยนกฎหลังจากคำตอบถูกโพสต์ซึ่งทำให้ใช้ไม่ได้อย่างน้อย 2 ข้อ โปรดอย่าทำการเปลี่ยนแปลงซึ่งอาจทำให้คำตอบไม่ถูกต้องหลังจากมีการโพสต์ความท้าทาย เป็นความคิดที่ดีที่จะใช้ Sandbox เพื่อรับข้อเสนอแนะก่อนโพสต์
Alex A.

ผมคิดว่านี้จะได้รับความน่าสนใจมากขึ้นเช่นการทุจริต
แมว

วิธีการเกี่ยวกับกรณีที่ไว? ยังไงถ้าภาษาของฉัน ... ไม่ชอบช่องว่าง ฉันสามารถระบุช่องว่างในอินพุตควรเป็นขีดล่างแทนได้หรือไม่
แมว

คำตอบ:


7

Pyth, 53 51

?&!-sJ.z+d<G5&FqR30lMJ+sm?qFd4_1CJ/eJd"Invalid test

ลองออนไลน์

การตรวจสอบจะทำโดยดูว่าอินพุตทั้งหมดมีอักขระใด ๆ หรือไม่เมื่อช่องว่างทั้งหมดและa-eถูกลบออกและตรวจสอบว่าสตริงทั้งสองมีความยาว30หรือไม่

(letters are equal) ? 4 : -1การคำนวณคะแนนจะกระทำโดยซิปทั้งสองสายด้วยกันแล้วโดยการทำแผนที่แต่ละคู่ที่: จากนั้นทำการสรุปค่าและเพิ่มจำนวนช่องว่างในบรรทัดที่สองกลับไปที่คะแนน


1
ไม่มีข้อผิดพลาด (ในปัจจุบันมีจำนวนไบต์น้อยกว่าคำตอบของเดนนิส ... )
Arcturus

7

อย่างจริงจัง 86 ไบต์

,`;l5╙¬=);' UΣS" ABCDE"=(**;l`Mi@)=YWé"Invalid test"0WX@Z```i@;(=5*(' =D+`(;l@)5╙¬=IMΣ

ใช้อินพุตเหมือน "CABBDCABECDBACDBEAACADDBBBEDDA", "CABEDDABDC BACDBBAADE CBBEDDA"

ลองออนไลน์ (คุณจะต้องป้อนข้อมูลด้วยตนเองเพราะลิงก์ไม่ชอบคำพูด)

ทำงานกับโบนัสทันที ไม่การเพิ่มโบนัสจะมีราคาสูงกว่า 20 ไบต์

ฉันรู้ว่าฉันลืมบางสิ่งบางอย่าง ... Invalid Testไม่ได้ถูกพิมพ์ในกรณีที่เกิดข้อผิดพลาด ความหวังของฉันคือการออกไปเล่นกอล์ฟเดนนิส


ทำมัน? อย่างจริงจัง? จากนั้นฉันต้อง
โหวต

4

JavaScript (ES6), 134 ไบต์

แก้ไข:ข้อกำหนดของคำถามมีการเปลี่ยนแปลง คำตอบนี้มาจากเมื่อโปรแกรมจำเป็นต้องตรวจสอบให้แน่ใจว่าอักขระคำตอบแต่ละตัวคือ AE อักขระตอบกลับแต่ละตัวคือ AE หรือเว้นวรรคและพวกเขาทั้งสองมีความยาว 30 และจะกลับมาInvalid testอีก

(a,r)=>[...a].map((q,i)=>q>"E"|q<"A"?x=1:(c=r[l=i])==" "?0:c>"E"|c<"A"?x=1:c==q?s+=4:s--,s=x=0)&&x|l!=29|r.length!=30?"Invalid test":s

คำอธิบาย

(a,r)=>                   // a = answer string, r = responses string
  [...a].map((q,i)=>      // iterate over answers, q = answer, i = question number
    q>"E"|q<"A"?x=1:      // x = 1 if answer is invalid
    (c=r[l=i])==" "?0:    // c = question response, l = answer length, add 0 for space
    c>"E"|c<"A"?x=1:      // x = 1 if response is invalid
    c==q?s+=4:s--,        // add 4 if correct, subtract 1 if incorrect
    s=x=0                 // s = total score, x = is invalid
  )&&
    x|l!=29|r.length!=30? // check input lengths for validity
      "Invalid test":
      s                   // return the score

ทดสอบ

<input type="text" id="answers" value="CABBDCABECDBACDBEAACADDBBBEDDA" /><br />
<input type="text" id="responses" value="CABEDDABDC BACDBBAADE  CBBEDDA" /><br />
<button onclick='result.innerHTML=(

(a,r)=>[...a].map((q,i)=>q>"E"|q<"A"?x=1:(c=r[l=i])==" "?0:c>"E"|c<"A"?x=1:c==q?s+=4:s--,s=x=0)&&x|l!=29|r.length!=30?"Invalid test":s

)(answers.value,responses.value)'>Go</button><pre id="result"></pre>



3

JavaScript (Firefox 31+), 86 ไบต์

(x,y)=>(r=i=0,[for(l of y)x[i++]==l?r+=4:r-=l!=' '],i!=30|i-x.length?'Invalid test':r)

ใช้ความเข้าใจของอาเรย์ซึ่งเสนอสำหรับ ES7 ดังนั้นการสนับสนุนจะถูก จำกัด เฉพาะ Firefox ในขณะนี้

ด้วยโบนัส 106 ไบต์ (126 - 20)

(x,y)=>[r=w=i=0,[for(l of y)x[i++]==l?r++:w+=l!=' '],`${r*4-w} (${r}R ${i-r-w}B ${w}W)`,'Invalid test'][i!=30||i-x.length?3:2]

แก้ไข:ก่อนหน้านี้โซลูชันของฉันตรวจสอบเฉพาะคำตอบหรือความยาวคำถามตอนนี้ตรวจสอบทั้งสอง


คุณสามารถละเว้นf=จุดเริ่มต้นและบอกว่านี่เป็นการสร้างฟังก์ชั่นแลมบ์ดา
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴขอบคุณฉันลืมมันไปตลอดจากการทดสอบ -_-
George Reith

สิ่งนี้จะสั้นลงอย่างมากหากไม่มีโบนัส 86 ไบต์:(x,y)=>(r=i=0,[for(l of y)x[i++]==l?r+=4:r-=l!=' '],i!=30|i-x.length?'Invalid test':r)
81655

@ user81655 ถูกต้องขอบคุณ ... ฉันจมลงไปนิดนึง ... สตริงแม่แบบเพียงอย่างเดียวคือ 34 ไบต์
George Reith

ฉันมีคำตอบที่คล้ายกันมาก แต่ฉันไม่ได้คัดลอกสิ่งนี้ (ความพยายามครั้งแรกของฉันคือแบบอย่าง แต่ฉันลบมันเพราะฉันไม่ได้ตรวจสอบความยาว) ที่กล่าวว่า: นี้ไม่ถูกต้องแม้จะมี 3 upvotes เช่นไม่ตรวจสอบช่วง A ... E
edc65

2

Japt , 71 ไบต์

Japtเป็นรุ่นสั้นJa vaScri พอยต์ ล่าม

Ul ¥30©Vl ¥30«(U+V k"[A-E ]+" ?U¬r@VgZ ¥Y?X+4:VgZ ¥S?X:X-1,0 :`InvÃ. È.

สอง.s ท้ายที่สุดควรเป็น Unicode ch + u1700 และ u + 0099 ตามลำดับ

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

Ul ==30&&Vl ==30&&!(U+V k"[A-E ]+" ?Uq r@VgZ ==Y?X+4:VgZ ==S?X:X-1,0 :"Invalid test
                    // Implicit: U = first input, V = second input
Ul ==30&&Vl ==30&&  // If both input lengths are 30, and
!(U+V k"[A-E ]+"?   // removing all ABCDE and spaces from (U+V) results in an empty string:
Uq r@            ,0 //  Reduce U with this function, starting with a value of 0:
VgZ ==Y?            //   If the matching char in V is equal to this char, 
X+4                 //    return previous value + 4.
:VgZ ==S?X          //   Else if the matching char in V is a space, return previous value.
:X-1                //   Else (if it's wrong), return previous value - 1.
:"Invalid test      // Else, return "Invalid test".
                    // Implicit: output last expression

ฉันหวังว่าจะมีวิธีที่สั้นกว่าเพื่อให้แน่ใจว่าความยาวทั้งสองเท่ากับ 30 ข้อเสนอแนะยินดีต้อนรับ!


2

Haskell, 144 138 ไบต์

a%b|map length[a,b]==[30,30]&&"ABCDE"!a&&"ABCDE "!b=show$sum$zipWith(?)a b|0<1="Invalid test"
l!s=all(`elem`l)
_?' '=0
x?y|x==y=4|0<1=0-1

จะอยู่ที่ประมาณ 50 โดยไม่มีการตรวจสอบ สูดอากาศ

การใช้งาน: "ABCDEABCDEABCDEABCDEABCDEABCDE" % "AAAAABBBBBCCCCCDDDDDEEEEEAAAAA"


1
!สามารถกำหนดเป็นall(`elem`l)sบันทึก 6 ไบต์
Zgarb

1
... หรือ pointfree g=all.flip elemไป:
nimi

2

C #, 162 154 148 134 ไบต์

string g(string k,string a)=>k.Length!=30||a.Length!=30?"Invalid Test!":Enumerable.Range(0,30).Sum(e=>a[e]==' '?0:k[e]==a[e]?4:-1)+"";

การใช้

g("CABBDCABECDBACDBEAACADDBBBEDDA", "CABEDDABDC BACDBBAADE  CBBEDDA")

ทดสอบ

http://csharppad.com/gist/15f7c9c3c8cfce471ff2


คุณสามารถเปลี่ยนเป็นint s=0,i=0;for(;...บันทึก 3 ไบต์
LegionMammal978

สิ่งนี้จะไม่ทำงานหากฉันป้อน 29 อักขระสำหรับอินพุตแรกและ 31 เป็นวินาที .. ควรพิมพ์ "การทดสอบที่ไม่ถูกต้อง" แต่จริง ๆ แล้วจะพยายามให้คะแนน
Johan

@ noisyass2: string x (สตริง k, สตริง a) => k.Length! = 30 || a.Length! = 30? "การทดสอบไม่ถูกต้อง!": Enumerable.Range (0,30). ผลรวม (e => a [e] == ''? 0: k [e] == a [e]? 4: -1) + ""; (134 ตัวอักษร) และพิจารณาการป้อนข้อมูลของ Johans
Stephan Schinkel

+1 สำหรับการแก้ปัญหา แต่สิ่งนี้มีคุณสมบัติเหมาะสมหรือไม่ โอพีกล่าวว่าโปรแกรมเต็มรูปแบบ
Yytsi

โจฮานจับดี! @StephanSchinkel ขอบคุณสำหรับแนวคิดในการใช้ผู้รับมอบสิทธิ์และบิต Enum.range ฉันสามารถโกนได้อีก 3 ตัวอักษรเปลี่ยนสภาพเป็น 30 == (k.Length & a.Length)
noisyass2

2

Ruby, 81 ตัวอักษร

->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}

วิ่งตัวอย่าง:

2.1.5 :001 > ->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}['CABBDCABECDBACDBEAACADDBBBEDDA','CABEDDABDC BACDBBAADE  CBBEDDA']
 => 73 

2.1.5 :002 > ->t,s{r=0;30.times{|i|r+=t[i]==s[i]?4:s[i]>' '?-1:0};t.size==30?r:'Invalid test'}['CCCATCH','CABEDDABDC BACDBBAADE  CBBEDDA']
 => "Invalid test" 

2

ชวา 183 169 ไบต์

นี่เป็นแนวทางปฏิบัติที่ดีของ Java 8:

String f(String a,String r){return a.length()==30&r.length()==30?""+IntStream.range(0,30).map(i->a.charAt(i)==r.charAt(i)?4:r.charAt(i)!=' '?-1:0).sum():"Invalid test";}

ฉันไม่ใช่ Java Golfer แต่ฉันคิดว่าคุณสามารถบันทึกได้String.valueOfโดยเพียงเพิ่ม int ลงในสตริงว่างเปล่า ( ""+IntStream....) - ฉันเชื่อว่า Java อนุญาตให้ใช้การไม่ลัดวงจรและเพื่อให้คุณสามารถลบหนึ่งในนั้น&และบันทึกไบต์ .
VisualMelon

@VisualMelon คำแนะนำที่ดีขอบคุณ มันน่ารำคาญสำหรับฉันที่ใช้จำนวน String.valueOf
RCB

2

brainfuck, 354 ไบต์

+[--[>]<<+>-],----------[[<<<]>>->[>>>],----------]<<<[<<<]>>+[<-[-------<+>]<.+[---<+>]<.++++++++.[-<+++>]<-.+++++++++++.---.-----.-[---<+>]<-.---[-<++++>]<.+++[-<+++>]<.[---<+>]<----.+.>]>[[>,----------->+++++++[<---<<+++>>>-]<[<<+[>>+<<-]]>[>]<<<[>[>+>+<<-]>>[<<+>>-]>[>>>]>----<<<<[<<<]>>[-]]>[>-<-]>[>>[>>>]>-----<<<<[<<<]>[-]]>>]----[>+++<--]>--.<]

ต้องใช้ล่ามที่ช่วยให้คุณออกจากเซลล์ 0 เอาท์พุทเป็นไบต์ที่ลงนามแล้ว ตัวอย่างเช่นไบต์0x49ถูกพิมพ์สำหรับอินพุตตัวอย่างและ0xFFถูกพิมพ์สำหรับอินพุตด้วยบรรทัดแรกเดียวกัน แต่บรรทัดที่สองถูกแทนที่ด้วย "C" และ 29 ช่องว่าง

คะแนนเริ่มต้นที่ 0 และเนื่องจากบรรทัดที่สองของอินพุตถูกอ่านการเปลี่ยนแปลงเหล่านี้เกิดขึ้นกับมัน:

  • อินพุตถูกต้อง: ไม่ทำอะไรเลย
  • อินพุตไม่ถูกต้อง: ลบ 5
  • อินพุตเป็นช่องว่าง: ลบ 4

ในที่สุด 120 จะถูกเพิ่ม นี่คือหน้าที่เหมือนกับการสมมติว่าเป็นคะแนนที่สมบูรณ์แบบและใช้บทลงโทษแทนที่จะเริ่มต้นที่ 0

ด้วยความคิดเห็น:

+[--[>]<<+>-]                          Get 29

,----------[[<<<]>>->[>>>],----------] Get first line of input; for each char sub one
                                       from the 29

<<<[<<<]>>+                            Add one to the cell that originally held 29

[                                      If the cell that originally held 29 is nonzero:

  Write "Invalid test"
  <-[-------<+>]<.+[---<+>]<.++++++++.[-<+++>]<-.+++++++++++.---.-----.-[---<+>]<-.---[-<++++>]<.+++[-<+++>]<.[---<+>]<----.+.

>]

>[                                     If the cell to the right is nonzero:

  This block is only ever entered if "Invalid test" isn't written!

  [                                      For all 30 characters of the first input:

    >,                                     Get char from second input to the right

    ----------                             Subtract 10 for consistency

    -                                      Subtract one more

    >+++++++[<---<<+++>>>-]                Subtract 21 (plus above lines = 32)

    <[                                     If it's nonzero:

      <<+[>>+<<-]                            Add 22 to the character

    ]

    >[>]<<<[                                 If the above block wasn't entered:

      >[>+>+<<-]>>[<<+>>-]                   Make a copy of the character from input 1

      >[>>>]>----                            Subtract 4 from the score

      <<<<[<<<]>>[-]                         Go to the cell just before first character

    ]

    >[>-<-]                                Subtract input 1 char from input 2 char

    >[                                     If the result is nonzero:

      >>[>>>]>-----                          Subtract 5 from the score

      <<<<[<<<]>[-]                          Go back to the result and set it to 0

    ]

    >>                                     Move on to next character

  ]

  ----[>+++<--]>--                       Add 120 to score (perfect score)

  .                                      Print score

  <                                      Go to an empty cell to kill loop

]


1

JavaScript ES7, 102

เช่นเคยโบนัสไม่คุ้มกับความพยายาม

(k,h,t=i=0)=>[for(x of h)t+=k[i++]==x?4:1-x?0:-1]|/[^ A-E]/.test(k+h)|i-30|k.length-i?"Invalid test":t

การตรวจสอบช่องว่างที่ไม่ถูกต้องในการป้อนข้อมูลครั้งแรก (เช่นนี้ทำให้รู้สึกถึงฉัน) 112

(k,h,t=i=0)=>[for(x of h)(y=k[i++])>' '?t+=y==x?4:1-x?0:-1:k=h+h]|/[^ A-E]/.test(k+h)|i-30|k[i]?"Invalid test":t

อืมการตรวจสอบใช้รหัสของฉันครึ่งหนึ่งเมื่อฉันลอง: (k,r,s=0)=>/^[A-E]{30}$/.test(k)&&/^[ A-E]{30}$/.test(r)?Object.keys(k).map(i=>k[i]==r[i]?s+=4:s-=r[i]!=' ').pop():'Invalid Test'คือ 129 ไบต์
Neil

1

Python 2.7, 131, 116, 109 , 139

ฉันพยายามทำ python solution สั้น ๆ ... ดีแล้วที่นี่มีข้อเสนอแนะมากกว่ายินดีต้อนรับ

lambda c,d:d.count(' ')+sum([-1,4][a==b]for a,b in zip(c,d)if b!=' ')if not set('ABCDE ')^set(c+d)and len(c)==len(d)==30 else'Test Invalid'

การเพิ่มอักขระอีกสองสามตัวทำให้สามารถอ่านได้มากขึ้น ...

def m(c, d):
    if len(c)==len(d)==30:return d.count(' ')+sum((a==b)*4+(a!=b)*-1 for a,b in zip(c,d)if b!=' ')
    return'Test Invalid'

1

Prolog, 165 ไบต์

มากกว่าครึ่งไบต์ใช้สำหรับการตรวจสอบการทดสอบที่ไม่ถูกต้อง

รหัส:

p(X,X,4).
p(_,32,0).
p(_,_,-1).
A*B:-length(A,30),length(B,30),subset(A,`ABCDE`),subset(B,`ABCDE `),maplist(p,A,B,L),sum_list(L,S),write(S);write('Invalid Test').

อธิบาย:

p(X,X,4).                                       % If corresponding elements are equal, 4p
p(_,32,0).                                      % If answer is 'space', 0p
p(_,_,-1).                                      % Else, -1p
A*B:-length(A,30),length(B,30),                 % Check that input is of correct length
     subset(A,`ABCDE`),subset(B,`ABCDE `),      % Check that input has correct characters
     maplist(p,A,B,L),sum_list(L,S),write(S);   % Create a list of scores (L) and print sum
     write('Invalid Test').                     % If anything failed, write Invalid Test

ตัวอย่าง:

`CABBDCABECDBACDBEAACADDBBBEDDA`*`CABEDDABDC BACDBBAADE  CBBEDDA`.
73

ลองออนไลน์ได้ที่นี่


1

MATLAB, 92 90 ไบต์

ขอบคุณ Tom Carpenter ที่ช่วยฉันลดคำตอบลง 2 ไบต์!

function c(q,a),if nnz(q)~=30,t='Invalid test';else s=q-a;t=5*nnz(~s)-sum(s<9);end,disp(t)

ฟังก์ชั่นที่สามารถเรียกโดยการกำหนดกระดาษคำตอบเพื่อQและคำตอบที่ส่งไป เช่น:

c('CABBDCABECDBACDBEAACADDBBBEDDA','CABEDDABDC BACDBBAADE  CBBEDDA')

คำตอบนั้นถูกพิมพ์ลงบนหน้าจอ สามารถบันทึก8 ไบต์ได้หากได้รับอนุญาตให้พิมพ์ans = 73


คุณสามารถประหยัด 2 ไบต์โดยการแทนที่ด้วยnumel(q) nnz(q)
Tom Carpenter

1

C # 6.0 -> (270 - 20 = 250) 246 - 20 = 226 ไบต์

void m(string b,string c){if((b+c).Length==60){var a=new int[3];int s=0;for(int i=0;i<30;i++){if(b[i]==c[i]){a[0]++;s+=4;}else if(c[i]==' ')a[2]++;else{a[1]++;s--;}}Console.Write(s+$" ({a[0]} {a[2]} {a[1]})");}else Console.Write("Invalid test");}

รุ่นที่อ่านได้และไม่ได้อัปโหลด:

    void m(string b, string c)
    {
        if ((b+c).Length==60)
        {
            var a = new int[3];
            int s = 0;
            for (int i = 0; i < 30; i++)
            {
                if (b[i]==c[i])
                {
                    a[0]++;
                    s+=4;
                }
                else if (c[i] == ' ')a[2]++;
                else
                {
                    a[1]++;
                    s--;
                }
            }
            Console.Write(s+$" ({a[0]} {a[2]} {a[1]})");
        }
        else Console.Write("Invalid test");
    }

ต้องการได้รับโบนัสจริง ๆ : D


เยี่ยมมาก! กลวิธีทั่วไปบางอย่างที่ใช้ที่นี่คุณสามารถประกาศiพร้อมกับsนอกลูป คุณสามารถใช้varเพื่อประกาศaประหยัด 1 ไบต์ (hurray!) คุณไม่ต้องการวงเล็บปีกกาจำนวนมาก{}ในรหัสของคุณซึ่งเป็นวิธีที่ดีในการตัดแต่งไบต์และมันก็คุ้มค่าที่จะดูตาราง ASCII เสมอเมื่อเปรียบเทียบตัวอักษร (คุณสามารถลดไบต์ได้c[i]==' 'โดยใช้ความไม่เท่าเทียมกัน คุณควรพิจารณาการนับจำนวนสตริงย้อนหลัง - ในกรณีนี้คุณสามารถบันทึกอย่างน้อย 1 ไบต์โดยการคำนวณวนซ้ำ
VisualMelon

น่าเสียดายที่ขณะนี้การส่งของคุณไม่ซับซ้อนกับเกณฑ์เนื่องจากไม่สามารถรับรู้อินพุตที่ไม่ถูกต้อง
VisualMelon

@VisualMelon Ahh ฉันรู้สึกโง่มาก ฉันเขียนข้อเสนอนี้ที่โรงเรียนดังนั้นฉันลืมเพิ่มสิ่ง 'ทดสอบที่ไม่ถูกต้อง' ฯลฯ ฉันจะเพิ่มพวกเขา :)
Yytsi

@VisualMelon ใช่นี่ถูกส่งและเขียนในโรงเรียนเมื่อสิ้นสุดชั้นเรียนฉันจะแก้ไข ขอบคุณสำหรับเทคนิค :)
Yytsi

0

Groovy 2.4.5, 107 ไบต์

เพียงแค่การแปลที่เรียบง่ายของก่อนหน้านี้คำตอบ Java

f={a,b->a.length()==30&b.length()==30?(0..29).collect{a[it]==b[it]?4:b[it]!=' '?-1:0}.sum():'Invalid test'}

0

C, 273 - 20 = 253 ไบต์

#include<stdio.h>
#include<string.h>
int main(int c,char**v){char*p=v[1],*q=v[2],*s=" ABCDE",r[]={0,0,0};if(strspn(p,s+1)!=30||p[30]||strspn(q,s)!=30||q[30])puts("Invalid test");else{for(;*p;++q)++r[(*p++!=*q)+(*q==' ')];printf("%d (%dR %dB %dW)",4**r-r[1],*r,r[2],r[1]);}}

ฉันได้รับโบนัสถึงแม้ว่าจะมีค่าใช้จ่ายฉัน 23 ไบต์เพียงเพื่อพิมพ์ :-(

คำอธิบาย

#include <stdio.h>
#include <string.h>
int main(int c,char**v)
{
    char *p=v[1], *q=v[2],      /* arguments */
        *s=" ABCDE",            /* valid chars */
        r[]={0,0,0};            /* results - right, wrong, blank */

    if (strspn(p,s+1) != 30     /* validity check - answer key begins with [A-E]{30} */
        || p[30]                /* and ends there */
        || strspn(q,s) != 30    /* same for answers, but allow space, too */
        || q[30])
    {
        puts("Invalid test");
    } else {
        for ( ;  *p;  ++q)      /* for each answer */
            ++r[(*p++!=*q)+(*q==' ')]; /* increment the appropriate counter */
        printf("%d (%dR %dB %dW)",4**r-r[1],*r,r[2],r[1]); /* print result */
    }
}

มีโค้ดมากเป็นสองเท่าในการตรวจสอบอินพุตที่ไม่ถูกต้องเนื่องจากต้องนับคำตอบ - เนื้อสัตว์ที่แท้จริงของความท้าทายอยู่ในforลูปใกล้ถึงจุดสิ้นสุด อันที่จริงนี่คือเวอร์ชันที่ถือว่าอินพุตถูกต้องเสมอใน 163-20 = 143 bytes:

#include<stdio.h>
int main(int c,char**v){char*p=v[1],*q=v[2],r[]={0,0,0};for(;*p;++q)++r[(*p++!=*q)+(*q==' ')];printf("%d (%dR %dB %dW)",4**r-r[1],*r,r[2],r[1]);}

และสิ่งที่ทำให้สมมติฐานเดียวกันและพิมพ์เฉพาะคะแนนใน 133 ไบต์:

#include<stdio.h>
int main(int c,char**v){char*p=v[1],*q=v[2],r[]={4,-1,0};for(c=0;*p;++q)c+=r[(*p++!=*q)+(*q==' ')];printf("%d",c);}

0

SAS 9.4, 291-20 = 271 ไบต์ (พร้อมโบนัส) หรือ 231 ไบต์ (ไม่รวมโบนัส)

พร้อมโบนัส:

data a;k='CABBDCABECDBACDBEAACADDBBBEDDA';r='CABEDDABDC BACDBBAADE  CBBEDDA';c=0;b=0;w=0;if length(k) ne 30 then put "Invalid test";do i=1 to 30;if substr(k,i,1)=substr(r,i,1) then c=c+1;else if substr(r,i,1) =' ' then b=b+1;else w=w+1;end;a=cat(c*4-w,' (',c,'R ',b,'B ',w,'W)');put a;run;

ไม่มีโบนัส:

data a;k='CABBDCABECDBACDBEAACADDBBBEDDA';r='CABEDDABDC BACDBBAADE  CBBEDDA';c=0;if length(k) ne 30 then put "Invalid test";do i=1 to 30;if substr(k,i,1)=substr(r,i,1) then c=c+4;else if substr(r,i,1)ne' ' then c=c-1;end;put c;run;

Sas ไม่มีอินพุต / เอาต์พุตดังนั้นคุณจะต้องแทนที่ k = '.. ' ด้วยคีย์และ r = '.. ' ด้วยการตอบกลับ เอาต์พุตถูกพิมพ์ไปที่บันทึก

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