ป้ายทะเบียนของฉันมีกี่จุด


31

(นี่คือคำถามรหัสกอล์ฟครั้งแรกของฉัน)

เมื่อฉันยังเป็นเด็กพ่อของฉันและฉันคิดค้นเกมที่แผ่นป้ายทะเบียนรถที่เราเห็นบนรถสามารถให้คะแนนตามกฎง่ายๆ:

จำนวน X ของตัวอักษรหรือตัวเลขเดียวกันให้ X-1 คะแนนตัวอย่าง:

22 = 1 point
aa = 1 point
5555 = 3 points

ตัวเลขต้องอยู่ถัดจากแต่ละคนดังนั้น3353ให้ 1 คะแนนเท่านั้นเนื่องจาก 5 แบ่งลำดับของ 3

ลำดับของตัวเลข X ในลำดับจากน้อยไปหามากหรือจากมากไปน้อยอย่างน้อย 3 ให้เป็นคะแนน X ตัวอย่าง:

123 = 3 points
9753 = 4 points
147 = 3 points

ระบบคะแนนใช้งานได้กับตัวเลข 1 หลักเท่านั้นดังนั้น1919อย่าให้แต้มและ14710ให้ 3, (147) เท่านั้น

ลำดับสามารถรวมกันเพื่อให้คะแนนตัวอย่าง:

1135 = 4 points (1 point for 11 and 3 points for 135)
34543 = 6 points (3 points for 345 and 3 points for 543)

อย่างไรก็ตามคุณไม่ได้รับอนุญาตให้สับลำดับที่มีขนาดใหญ่ขึ้นเป็น 2 ลำดับย่อยสำหรับคะแนนพิเศษ: 1234 = 123, 234 (6 points)ไม่อนุญาต

งานของคุณได้รับลำดับเพื่อกำหนดจำนวนจุดที่แผ่นป้ายทะเบียนให้

ในเดนมาร์กแผ่นป้ายทะเบียนมีโครงสร้างเช่นนี้: CC II III โดยที่ C คือตัวอักษรและฉันเป็นจำนวนเต็มดังนั้นอินพุตตัวอย่างของฉันจะแสดงถึงโครงสร้างนี้ หากคุณต้องการคุณสามารถจัดลำดับให้พอดีกับโครงสร้างของคุณเองหรือถ้าคุณรู้สึกอยากผจญภัยจริงๆให้โปรแกรมวิเคราะห์โครงสร้างของแผ่นป้ายทะเบียนและทำให้มันทำงานกับแผ่นป้ายทะเบียนทุกชนิดทั่วโลก ระบุโครงสร้างที่คุณตัดสินใจใช้อย่างชัดเจนในคำตอบของคุณ

คุณอาจจะป้อนข้อมูลในแบบที่คุณต้องการไม่ว่าจะเป็นสตริงหรืออาเรย์ดูเหมือนจะเหมาะสมที่สุดสำหรับฉัน

ทดสอบอินพุต | เอาท์พุท:

AA 11 111 | 5
AB 15 436 | 3
OJ 82 645 | 0
UI 65 456 | 6
HH 45 670 | 5
YH 00 244 | 5
AJ 00 754 | 1

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

แก้ไข:

เนื่องจากความคิดเห็นที่ถามฉันมีข้อมูลเพิ่มเติมสองสามชิ้นที่จะแบ่งปัน: ลำดับของตัวเลขจากน้อยไปมากหรือมากไปน้อยหมายถึงลำดับเลขคณิตดังนั้น X +/- a * 0, X +/- a * 1, ... X +/- a * nเป็นต้นตัวอย่างเช่น 3-5-7 คือ 3 +2 * 0, 3 + 2 * 1, 3 + 2 * 2 ลำดับไม่ได้อย่างไรก็ตามต้องเริ่มจาก 0 หรือสิ้นสุดใน 0

แก้ไขเพิ่มเติม:

คุณสามารถป้อนข้อมูลได้ตามที่คุณต้องการคุณไม่จำเป็นต้องใส่ช่องว่างขีดกลางหรือสิ่งอื่นใดที่ทำให้แผ่นป้ายทะเบียนอ่านได้ง่ายขึ้น หากคุณสามารถบันทึกไบต์โดยรับเฉพาะอักษรตัวใหญ่หรืออะไรทำนองนั้นคุณสามารถทำได้เช่นกัน ข้อกำหนดเพียงอย่างเดียวคือโปรแกรมของคุณสามารถรับสตริง / อาร์เรย์ / อะไรก็ได้ที่มีทั้งตัวอักษรและตัวเลขและส่งออกจำนวนคะแนนที่ถูกต้องตามกฎที่ระบุไว้


ที่เกี่ยวข้องอย่างหลวมยินดีต้อนรับสู่ PPCG และคำถามแรกที่ดี!
Mr. Xcoder

XX 87 654กรณีทดสอบที่แนะนำ: ฉันมาพร้อมกับสิ่งที่ถูกต้องสำหรับทุกกรณีทดสอบของคุณ แต่ก็ไม่ถูกต้องสำหรับกรณีนี้ .. กำลังแก้ไขมันอยู่
Kevin Cruijssen

7
ฉันขอแนะนำให้คุณแก้ไขโครงสร้างบางอย่าง (ฉันขอแนะนำCCIIIIIไม่มีช่องว่าง) หรืออื่น ๆ ปัญหานี้ขาดเกณฑ์การชนะอย่างมีวัตถุประสงค์ซึ่งเราต้องการในบริเวณนี้ ตามที่เป็นอยู่“ (และอย่ารับอินพุตเช่น CICIC เพียงเพื่อให้ง่ายสำหรับตัวคุณเอง)” เป็นเรื่องส่วนตัวมาก อะไรคือและไม่ใช่โครงสร้างที่ยอมรับได้?
Lynn

1
@Lynn โครงสร้างที่ยอมรับได้คือสิ่งหนึ่งที่สามารถให้คะแนนได้จริง CICIC จะไม่มีลำดับที่ให้คะแนนใด ๆ ดังนั้นจึงไม่อนุญาต และยิ่งไปกว่านั้นทำไม 'คำตอบสั้น ๆ เป็นไบต์ในภาษาโปรแกรมที่เลือกและโครงสร้างที่เลือก' ไม่ใช่เกณฑ์การชนะที่ชัดเจนและมีวัตถุประสงค์ เกณฑ์การชนะนี้มีกติกาตรงไปตรงมาและให้อิสระกับนักพัฒนาในการเลือกโครงสร้างที่ต้องการให้ทำงานได้ จริงอยู่ที่ว่ามันอาจมีผู้ชนะหลายคน แต่จริงๆแล้วอะไรนะ?
Troels MB Jensen

3
กรณีทดสอบ: IA99999(มีลำดับของรหัสจุดลดลง แต่ไม่ใช่ตัวเลข)
Zgarb

คำตอบ:


7

05AB1E , 25 22 20 18 ไบต์

ยอมรับสตริงของตัวอักษรและตัวอักษรพิมพ์เล็กที่ไม่มีช่องว่าง

Ç¥0Kγ€gXK>OIγ€g<OO

ลองออนไลน์! หรือเป็นชุดทดสอบ


ฉันอ่าน 05AB1E ไม่ได้หากไม่มีคำอธิบาย) แต่คุณสามารถบันทึกไบต์ด้วยการรับอินพุตโดยไม่ต้องเว้นวรรคได้หรือไม่?
Kevin Cruijssen

@ Mr.Xcoder ฉันก็สงสัยเหมือนกัน แต่โดยส่วนตัวฉันไม่สามารถอ่าน 05AB1E ได้ดังนั้นฉันคิดว่าบางทีEmignaได้เพิ่มรหัสใด ๆ เพื่อกำจัด / เพิกเฉยช่องว่าง อาจเป็นไปได้ว่านี่จะเป็นการบอกเป็นนัยโดยไม่มีไบต์พิเศษใด ๆ แต่ฉันก็ถามในกรณีที่มันไม่ได้
Kevin Cruijssen

ฉันเพิ่งเอารหัสของคุณไปแกว่งและอึศักดิ์สิทธิ์มันใช้งานได้จริงสำหรับความยาวหรือลำดับ! 'ปัญหา' เพียงอย่างเดียวก็คือมันให้ 3 คะแนนสำหรับ ABC ซึ่งในตัวของมันเองไม่ผิดฉันไม่ได้อธิบายเพราะในเดนมาร์กเรามีเพียง 2 ตัวอักษรถัดจากแต่ละคน
Troels MB Jensen

2
@KevinCruijssen: ไม่มีช่องว่างในอินพุตจะช่วยประหยัดได้หลายไบต์ใช่ ฉันพลาดส่วนที่เราสามารถตัดสินใจเองได้ ขอบคุณสำหรับหัวขึ้น. (คำอธิบายกำลังจะมาเช่นกัน)
Emigna

@Emigna ฉันไม่ได้ระบุไว้ในคำถามอย่างชัดเจนฉันคิดว่าฉันพูดเป็นนัยพอที่มันเมื่อฉันเขียนคุณอาจจะป้อนข้อมูลในทางที่คุณโปรดใด ๆ ไม่ว่าจะเป็นสตริงหรืออาร์เรย์ดูเหมือนเหมาะสมที่สุดสำหรับฉัน .
Troels MB Jensen

7

Husk , 20 16 15 ไบต์

-1 ไบต์ขอบคุณ @Zgarb

ใช้อินพุตโดยไม่มีช่องว่างและใช้ตัวพิมพ์เล็ก

ṁ??¬o→LεL←gẊ¤-c

ลองออนไลน์!

คำอธิบาย

           Ẋ      Map over all adjacent pairs
            ¤-c   get the difference of their codepoints
          g       Split into groups of equal elements
ṁ                 Map then sum
 ?       ←          If the head of the list is truthy (not 0)
  ?    ε              If the length of the list is 1
   ¬                    return 0
                       Else
    o→L                 return the length + 1
                     Else
        L             return the length

ฉันคิดว่าK0สามารถอยู่¬ที่นี่
Zgarb

IA99999อืมนี้ดูเหมือนว่าจะล้มเหลวใน
Zgarb

@Zgarb เปลี่ยนรูปแบบอินพุตเป็นตัวพิมพ์เล็ก
H.PWiz

5

Python 3 , 193 85 ไบต์

-3 ไบต์ด้วยLynn

b'aa11111'จะเข้าเป็นไบต์สตริงที่มีตัวอักษรตัวพิมพ์เล็กเป็น:

def f(s):
 d=l=L=p=0
 for c in s:C=0!=d==c-l;p+=(c==l)+C*L;L=3>>C;d=c-l;l=c
 return p

ลองออนไลน์!



1
C=0!=d==c-lสั้นกว่า
Lynn

2

Java 8, 195 ไบต์

a->{int r=a[0]==a[1]?1:0,i=3,j,p=a[2],x,y,z;for(;i<7;p=a[i++])for(r+=(x=a[i])==p?1:0,j=-4;++j<4;r+=j==0?0:i<6&&p+j==x&x+j==(y=a[i+1])?++i<6&&y+j==(z=a[i+1])?++i<6&&z+j==a[i+1]?5:4:3:0);return r;}

สามารถตีกอล์ฟเพิ่มได้โดยใช้เทคนิคอื่นเพื่อตรวจสอบลำดับ

คำอธิบาย:

ลองที่นี่

a->{                      // Method with character-array parameter and integer return-type
  int r=                  //  Result-integer
        a[0]==a[1]?       //   If the two letters are equal:
         1                //    Start this result-integer at 1
        :                 //   Else:
         0,               //    Start the result-integer at 0 instead
      i=3,j,              //  Index-integers
      p=a[2],x,y,z;       //  Temp integers
   for(;i<7;              //  Loop (1) from index 3 to 7 (exclusive)
       p=a[i++])          //    And after every iteration: Set `p` and raise `i` by 1
     for(r+=(x=a[i])==p?  //   If the current digit (now `x`) equals the previous `p`:
             1            //    Raise the result-integer by 1
            :             //   Else:
             0,           //    Keep the result-integer the same
         j=-4;++j<4;      //   Inner loop (2) from -3 to 3 (inclusive)
       r+=j==0?           //    If `j` is 0:
           0              //     Skip it, so keep the result-integer the same
          :i<6            //    Else-if `i` is not 6,
           &&p+j==x       //    and the previous digit `p` + `j` equals the current digit,
           &x+j==(y=a[i+1])?
                          //    and the current digit `x` + `j` equals the next digit `y`:
            ++            //     Raise index `i` by 1 first,
              i<6         //     and check if `i` is not 6 again,
              &&y+j==(z=a[i+1])?
                          //     and if the new current digit `y` + `j` equals the next digit `z`:
               ++         //      Raise index `i` by 1 first again,
                 i<6      //      and check if `i` is not 6 again,
                 &&z+j==a[i+1]?
                          //      and if the new current digit `z` + `j` equals the next digit:
                  5       //       Raise the result-integer by 5
                 :        //      Else:
                  4       //       Raise it by 4 instead
              :           //     Else:
               3          //      Raise it by 3 instead
           :              //    Else:
            0             //     Keep it the same
     );                   //   End of inner loop (2)
                          //  End of loop (1) (implicit / single-line body)
  return r;               //  Return the result-integer
}                         // End of method

1

Pyth ,  51  50 ไบต์ (ตุปัดตุเป๋)

+/|R0.+QZslM.MlZ+kfTsmm?&!-K.+sMkhK.AKkY.:>Q2d}3 5

ตรวจสอบกรณีทดสอบทั้งหมดหรือลองที่นี่


ตอนนี้ฉันรู้ว่าฉันสามารถทำให้สั้นลง แต่จะอัปเดตหากฉันสามารถเล่นกอล์ฟได้อย่างสม่ำเสมอ
Mr. Xcoder

1

R , 153 , 145 , 143 ไบต์

function(x){p=0;s=sum;if(x[1]==x[2])p=1;a=diff(strtoi(x[3:7]));p=p+s(a==0);l=sort(table(a[a!=0]),T);(p=p+s(l[(l[((s(l)>0)&(l[1]>1))]+1)>2]+1))}

ฟังก์ชั่นไม่ระบุชื่อที่ใช้เวกเตอร์ตัวอักษรและส่งกลับจำนวนเต็ม
อินพุตที่คาดหวังz(c("A", "A", "1", "1", "1", "1", "1"))

ลองออนไลน์!

เวอร์ชันที่ไม่ดี

function(x){
  pnt <- 0; s <- sum
  if(x[1] == x[2]) pnt <- 1
  a <- diff(strtoi(x[3:7]))
  pnt <- pnt + s(a == 0)
  l <- sort(table(a[a!=0]), T)
  (pnt <- pnt + s(l[(l[((s(l) > 0) & (l[1] > 1))] + 1) > 2] + 1))
}


0

Pyth , 48 42 ไบต์

ตรงพอร์ตจากคำตอบของฉันหลาม รับอินพุตเป็นสตริงไบต์ด้วยตัวอักษรตัวพิมพ์เล็กเป็น: b'aa11111 '

นี่เป็นครั้งแรกที่ฉันเขียนโค้ดใน Pyth ดังนั้นจึงยินดีต้อนรับเคล็ดลับ: D

KJ=b0VQ=d&KqK-NJ=+b+qNJ*dZ=Z-3yd=K-NJ=JN;b

ลองที่นี่


0

JavaScript, 216 192 186 202 201 ไบต์

function f(s){var a=s.split(" "),c=a[1],a=a[0],r,h=b=i=p=0;for(i=0;i<4;i++){if(i<2&(r=a[i+1]-a[i]==a[i+2]-a[i+1])){p++;b=2}if(i>0){if(a[i]==a[i-1]){p++;h++}if(i<3&c[i]==c[i-1])p++}}return h==4?p+b:p-b}

Unminified

function f(s){
    var a=s.split(" "),c=a[1],a=a[0],r,h=b=i=p=0;
    for(i=0;i<4;i++){
        if(i<2&(r=a[i+1]-a[i]==a[i+2]-a[i+1])){
            p++;
            b=2
        }
        if(i>0){
            if(a[i]==a[i-1]){
                p++;
                h++;
            }
            if(i<3&c[i]==c[i-1]) 
                p++;
        }
    }

    return h==4?p+b:p-b
}

แก้ไขประวัติ:

  • จำกัด รหัสให้แคบลงเพื่อทำงานกับ0000 XXXรูปแบบเท่านั้น (-24 ไบต์)
  • แก้ไขตามที่แนะนำโดย @Titus (-6 ไบต์)
  • แก้ไขข้อผิดพลาดที่สี่หมายเลขที่เหมือนกันให้คะแนน 7 แทน 3 (+16 ไบต์)
  • ลบเซมิโคลอนสุดท้าย (-1 ไบต์)
  • แก้ไขการพิมพ์ผิดในรหัส (ไม่มีการเปลี่ยนแปลงไบต์)

ฉันจะนับไบต์ได้อย่างไร
Brian H.


im จริงๆเกลียดความจริงที่ว่าบล็อกรหัสไม่ได้ตระหนักถึงภาษา ...
ไบรอันเอช

ต้องการเน้นไวยากรณ์หรือไม่
H.PWiz

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