Biển số xe của tôi cho bao nhiêu điểm?


31

(Đây là câu hỏi golf-code đầu tiên của tôi)

Khi tôi còn là một đứa trẻ, bố và tôi đã phát minh ra một trò chơi trong đó biển số xe chúng ta thấy trên ô tô có thể cho một số điểm nhất định dựa trên một số quy tắc khá đơn giản:

Số lượng X của cùng một chữ cái hoặc số cho X-1 điểm, ví dụ:

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

Các số phải ở cạnh nhau, vì vậy 3353chỉ cho 1 điểm, vì 5 số phá vỡ chuỗi 3 giây.

Một chuỗi các số X theo thứ tự tăng dần hoặc giảm dần, tối thiểu là 3, cho X điểm, ví dụ:

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

Hệ thống điểm chỉ hoạt động đối với các số có 1 chữ số, vì vậy 1919không cho điểm và 14710chỉ cho 3, (147).

Trình tự có thể được kết hợp để tạo thêm điểm, ví dụ:

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

Tuy nhiên, bạn không được phép cắt một chuỗi lớn hơn thành 2 chuỗi nhỏ hơn để có thêm điểm: 1234 = 123, 234 (6 points)không được phép.

Nhiệm vụ của bạn là, đưa ra một chuỗi, để xác định số điểm mà biển số xe đưa ra.

Ở Đan Mạch, các biển số xe được cấu trúc như thế này: CC II III, trong đó C là ký tự và I là số nguyên, và do đó, ví dụ đầu vào của tôi sẽ phản ánh cấu trúc này. Nếu bạn muốn, bạn có thể làm cho trình tự phù hợp với cấu trúc của riêng bạn, hoặc, nếu bạn cảm thấy thực sự mạo hiểm, hãy để chương trình phân tích cấu trúc của biển số xe và do đó nó hoạt động trên bất kỳ loại biển số nào trên thế giới. Mặc dù rõ ràng cấu trúc bạn quyết định sử dụng trong câu trả lời của bạn.

Bạn có thể lấy đầu vào theo bất kỳ cách nào bạn muốn, một chuỗi hoặc một mảng dường như có ý nghĩa nhất đối với tôi.

Kiểm tra đầu vào | đầu ra:

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

Do tính chất của việc chọn cấu trúc của riêng bạn hoặc thậm chí bao gồm tất cả các cấu trúc, tôi không nhất thiết phải thấy cách người chiến thắng có thể được xác định rõ ràng. Tôi cho rằng người chiến thắng sẽ là byte ngắn nhất trên cấu trúc mà người ta đã quyết định. (Và đừng lấy đầu vào như CICIC, chỉ để giúp bạn dễ dàng hơn)

CHỈNH SỬA:

Do ý kiến ​​hỏi, tôi có thêm một vài thông tin để chia sẻ: Một chuỗi các số tăng dần hoặc giảm dần đề cập đến một chuỗi số học, vì vậy X +/- a * 0, X +/- a * 1, ... X +/- a * n v.v ... Vì vậy, 3-5-7 chẳng hạn là 3 + 2 * 0, 3 + 2 * 1, 3 + 2 * 2. Tuy nhiên, chuỗi không cần phải bắt đầu từ 0 cũng không kết thúc bằng 0.

EDIT THÊM:

Bạn có thể cung cấp đầu vào theo bất kỳ cách nào bạn muốn, bạn không cần phải nhập dấu cách, dấu gạch ngang hoặc bất kỳ thứ gì khác làm cho biển số dễ đọc hơn. Nếu bạn có thể lưu byte bằng cách chỉ chấp nhận chữ in hoa hoặc một cái gì đó tương tự, bạn có thể làm điều đó cũng tốt. Yêu cầu duy nhất là chương trình của bạn có thể lấy một chuỗi / mảng / bất cứ thứ gì chứa cả ký tự và số và xuất ra số điểm chính xác theo các quy tắc đã nêu.


Liên quan lỏng lẻo . Chào mừng bạn đến với PPCG và câu hỏi đầu tiên tốt đẹp!
Ông Xcoder

Trường hợp thử nghiệm đề xuất : XX 87 654. Tôi đã đưa ra một cái gì đó là chính xác cho tất cả các trường hợp thử nghiệm của bạn nhưng bằng cách nào đó không chính xác cho trường hợp này .. Làm việc để sửa nó.
Kevin Cruijssen

7
Tôi thực sự khuyên bạn nên sửa một cấu trúc nhất định (tôi đề nghị CCIIIII, không có khoảng trắng), nếu không thì vấn đề này thiếu một tiêu chí giành chiến thắng khách quan, mà chúng tôi yêu cầu ở đây. Như hiện tại, và (Không lấy đầu vào như CICIC, chỉ để dễ dàng cho chính mình), rất là chủ quan. Cấu trúc được chấp nhận là gì?
Lynn

1
@Lynn Một cấu trúc được chấp nhận là một cấu trúc thực sự có thể mang lại điểm, CICIC sẽ không bao giờ có một chuỗi mang lại bất kỳ điểm nào, do đó nó không được chấp nhận. Và trên hết, tại sao 'câu trả lời ngắn nhất tính theo byte trên ngôn ngữ lập trình được chọn và cấu trúc được chọn' không phải là một tiêu chí chiến thắng khách quan, rõ ràng? Tiêu chí giành chiến thắng này có một quy tắc thẳng, dễ tuân theo, nhưng cho phép nhà phát triển tự do lựa chọn loại cấu trúc mà họ muốn nó hoạt động. Cấp nó có thể có rất nhiều người chiến thắng khác nhau, nhưng, thực sự, vậy thì sao?
Troels MB Jensen

3
Trường hợp kiểm tra: IA99999(chứa một chuỗi các điểm mã giảm, nhưng không phải là số).
Zgarb

Câu trả lời:


7

05AB1E , 25 22 20 18 byte

Chấp nhận một chuỗi các ký tự chữ cái viết thường và các số không có khoảng trắng.

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

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm


Tôi không thể đọc 05AB1E mà không có lời giải thích;) Nhưng bạn có thể lưu byte bằng cách lấy đầu vào mà không có khoảng trắng không?
Kevin Cruijssen

@ Mr.Xcoder Tôi cũng nghi ngờ điều đó. Nhưng cá nhân tôi không thể đọc 05AB1E, vì vậy tôi nghĩ có lẽ Emigna đã thêm bất kỳ mã nào để loại bỏ / bỏ qua khoảng trắng. Có lẽ nó thực hiện điều này một cách ngầm định mà không có thêm byte nào, nhưng tôi chỉ hỏi trong trường hợp không có.
Kevin Cruijssen

Tôi chỉ lấy mã của bạn cho một cú swing, và crap thần thánh, nó thực sự hoạt động cho bất kỳ độ dài hoặc trình tự! "Vấn đề" duy nhất là nó cũng mang lại 3 điểm cho ABC, điều mà bản thân nó không sai, tôi chỉ không tính đến nó, vì ở Đan Mạch chúng tôi chỉ có 2 chữ cái bên cạnh nhau.
Troels MB Jensen

2
@KevinCruijssen: Không có khoảng trắng nào trong đầu vào sẽ tiết kiệm được vài byte có. Tôi đã bỏ lỡ phần mà chúng ta có thể tự quyết định. Cảm ơn cho những người đứng đầu lên. (Một lời giải thích cũng đang đến).
Emigna

@Emigna Tôi đã không nói rõ ràng trong câu hỏi, tôi nghĩ rằng tôi đã gợi ý đủ về nó khi tôi viết Bạn có thể lấy đầu vào theo bất kỳ cách nào bạn muốn, một chuỗi hoặc một mảng dường như có ý nghĩa nhất đối với tôi. .
Quân đội MB Jensen

7

Husk , 20 16 15 byte

-1 byte nhờ @Zgarb

Đưa đầu vào không có khoảng trắng và trong trường hợp thấp hơn.

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

Hãy thử trực tuyến!

Giải trình

           Ẋ      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

Tôi nghĩ K0có thể ¬ở đây.
Zgarb

Hmm, điều này dường như thất bại trên IA99999.
Zgarb

@Zgarb, thay đổi định dạng đầu vào thành chữ thường.
H.PWiz


2

Java 8, 195 byte

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

Chắc chắn có thể được đánh gôn thêm bằng cách sử dụng một kỹ thuật khác để kiểm tra trình tự.

Giải trình:

Hãy thử nó ở đây.

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

R , 153 , 145 , 143 byte

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

Hàm ẩn danh lấy một vectơ ký tự và trả về một số nguyên.
Đầu vào dự kiếnz(c("A", "A", "1", "1", "1", "1", "1"))

Hãy thử trực tuyến!

Phiên bản ung dung

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 byte

Cổng trực tiếp từ câu trả lời python của tôi. Lấy đầu vào dưới dạng một chuỗi byte với các chữ cái viết thường là: b'aa11111 '.

Đây là lần đầu tiên tôi viết mã ở Pyth, vì vậy mọi lời khuyên đều được chào đón: D

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

Hãy thử nó ở đây


0

JavaScript, 216 192 186 202 201 byte

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}

Chưa hoàn thành

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
}

Chỉnh sửa lịch sử:

  • Thu hẹp mã để chỉ làm việc với 0000 XXXđịnh dạng. (-24 byte)
  • Chỉnh sửa theo đề xuất của @Titus. (-6 byte)
  • đã sửa một lỗi trong đó bốn số giống nhau cho điểm 7 thay vì 3. (+16 byte)
  • Loại bỏ dấu chấm phẩy cuối cùng. (-1 byte)
  • Đã sửa lỗi chính tả trong mã. (không thay đổi byte)

Làm thế nào để tôi đếm các byte?
Brian H.


Tôi thực sự ghét sự thật là khối mã không nhận ra ngôn ngữ ...
Brian H.

Bạn có muốn làm nổi bật cú pháp?
H.PWiz

btw, 0000cho 7 điểm, điều đó có đúng không? (nó được đọc như một chuỗi số học và một chuỗi số lặp đi lặp lại cùng một lúc)
Brian H.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.