Berapa poin yang diberikan plat saya?

31

(Ini adalah pertanyaan kode-golf pertama saya)

Ketika saya masih kecil, ayah saya dan saya menciptakan sebuah permainan di mana plat nomor yang kita lihat di mobil dapat memberikan poin tertentu berdasarkan beberapa aturan sederhana:

Jumlah X dari huruf atau angka yang sama memberikan X-1 poin, contoh:

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

Angka-angka harus di sebelah satu sama lain, jadi 3353 hanya memberikan 1 poin, karena 5 memecah urutan 3's.

Urutan nomor X dalam urutan naik atau turun, minimal 3, berikan X poin, contoh:

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

Sistem poin hanya berfungsi untuk angka 1-digit, jadi 1919tidak memberikan poin, dan14710 hanya memberikan 3, (147).

Urutan dapat digabungkan untuk menghasilkan lebih banyak poin, contoh:

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

Namun Anda tidak diizinkan memotong urutan yang lebih besar menjadi 2 urutan yang lebih kecil untuk poin tambahan: 1234 = 123, 234 (6 points) tidak diizinkan.

Tugas Anda adalah, diberi urutan, untuk menentukan jumlah poin yang diberikan oleh plat nomor.

Di Denmark, pelat lisensi disusun seperti ini: CC II III, di mana C adalah karakter dan saya adalah bilangan bulat, dan dengan demikian input contoh saya akan mencerminkan struktur ini. Jika Anda mau, Anda dapat membuat urutan sesuai dengan struktur Anda sendiri, atau, jika Anda merasa benar-benar suka berpetualang, biarkan program menganalisis struktur plat nomor dan dengan demikian membuatnya bekerja pada semua jenis plat nomor di seluruh dunia. Nyatakan secara eksplisit struktur yang Anda putuskan untuk digunakan dalam jawaban Anda.

Anda dapat mengambil input dengan cara apa pun yang Anda suka, baik string atau array tampaknya paling masuk akal bagi saya.

Masukan tes | keluaran:

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

Karena sifat memilih struktur Anda sendiri, atau bahkan mencakup semua struktur, saya tidak perlu melihat bagaimana pemenang dapat ditentukan secara eksplisit. Saya kira pemenang akan menjadi byte terpendek pada struktur yang telah diputuskan. (Dan jangan mengambil input seperti CICIC, hanya agar mudah bagi Anda sendiri)

EDIT:

Sehubungan dengan komentar yang diajukan, saya memiliki beberapa informasi tambahan untuk dibagikan: Urutan angka naik atau turun mengacu pada urutan aritmatika, jadi X +/- a * 0, X +/- a * 1, ... X +/- a * n dll. Jadi 3-5-7 misalnya adalah 3 + 2 * 0, 3 + 2 * 1, 3 + 2 * 2. Namun, urutannya tidak harus dimulai dari 0 atau berakhir pada 0.

LEBIH EDIT:

Anda dapat memberikan input dengan cara apa pun yang Anda inginkan, Anda tidak perlu memasukkan spasi, tanda hubung atau hal lain yang membuat plat nomor lebih mudah dibaca. Jika Anda dapat menyimpan byte dengan hanya menerima huruf kapital atau sesuatu seperti itu, Anda dapat melakukannya juga. Satu-satunya persyaratan adalah bahwa program Anda dapat mengambil string / array / apa pun yang mengandung karakter dan angka, dan menampilkan jumlah poin yang benar sesuai dengan aturan yang dinyatakan.

Troels MB Jensen
sumber
Terkait longgar . Selamat datang di PPCG dan pertanyaan pertama yang menyenangkan!
Tn. Xcoder
Kasus uji yang disarankan: XX 87 654. Saya datang dengan sesuatu yang benar untuk semua kasus pengujian Anda tetapi entah bagaimana salah untuk yang satu ini .. Bekerja untuk memperbaikinya.
Kevin Cruijssen
7
Saya sangat menyarankan Anda memperbaiki struktur tertentu (saya sarankan CCIIIII, tidak ada spasi), atau masalah ini tidak memiliki kriteria menang objektif, yang kami butuhkan di sini. Seperti apa adanya, “(Dan jangan mengambil input seperti CICIC, hanya untuk membuatnya mudah bagi diri Anda sendiri)” sangat subyektif. Apa itu struktur yang bisa dan tidak bisa diterima?
Lynn
1
@ Lynn Struktur yang dapat diterima adalah struktur yang benar-benar dapat menghasilkan poin, CICIC tidak akan pernah memiliki urutan yang menghasilkan poin apa pun, oleh karena itu tidak dapat diterima. Dan di atas semua itu, mengapa 'jawaban terpendek dalam byte pada bahasa pemrograman yang dipilih dan struktur yang dipilih' bukan kriteria menang yang objektif dan objektif? Kriteria kemenangan ini memiliki aturan yang lurus, mudah diikuti, namun memberi kebebasan pengembang untuk memilih struktur seperti apa yang mereka inginkan. Memang itu mungkin memiliki banyak pemenang yang berbeda, tetapi, sungguh, jadi apa?
Troels MB Jensen
3
Test case: IA99999(berisi urutan poin kode yang menurun, tetapi bukan angka).
Zgarb

Jawaban:

7

05AB1E , 25 22 20 18 byte

Menerima serangkaian karakter alfabet huruf kecil dan angka tanpa spasi.

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

Cobalah online! atau sebagai Test Suite

Emigna
sumber
Saya tidak bisa membaca 05AB1E tanpa penjelasan;) Tetapi bisakah Anda menyimpan byte dengan mendapatkan input tanpa spasi?
Kevin Cruijssen
@ Mr.Xcoder Saya ragu juga. Tapi saya pribadi tidak bisa membaca 05AB1E, jadi saya pikir mungkin Emigna telah menambahkan kode untuk menghilangkan / mengabaikan spasi. Mungkin ini melakukan ini secara implisit tanpa byte tambahan, tapi saya hanya bertanya kalau-kalau tidak.
Kevin Cruijssen
Saya hanya mengambil kode Anda untuk ayunan, dan omong kosong, itu benar-benar bekerja untuk panjang atau urutan apa pun! Satu-satunya 'masalah' adalah bahwa ia juga memberikan 3 poin untuk ABC, yang dengan sendirinya tidak salah, saya hanya tidak menjelaskannya, karena di Denmark kami hanya memiliki 2 huruf di sebelah satu sama lain.
Troels MB Jensen
2
@KevinCruijssen: Tidak ada spasi di input akan menghemat beberapa byte ya. Saya merindukan bagian di mana kita dapat memutuskan itu sendiri. Terimakasih atas peringatannya. (Penjelasan akan datang juga).
Emigna
@ Emigna Saya tidak menyatakannya dalam pertanyaan secara eksplisit, saya pikir saya mengisyaratkan cukup ketika saya menulis Anda dapat mengambil input dengan cara apa pun yang Anda suka, baik string atau array tampaknya masuk akal bagi saya. .
Troels MB Jensen
7

Sekam , 20 16 15 byte

-1 byte terima kasih kepada @Zgarb

Mengambil input tanpa spasi dan dalam huruf kecil.

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

Cobalah online!

Penjelasan

           Ẋ      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
H.Piz
sumber
Saya pikir K0bisa di ¬sini.
Zgarb
Hmm, ini sepertinya gagal IA99999.
Zgarb
@Zgarb, mengubah format input menjadi huruf kecil.
H.PWiz
5

Python 3 , 193 85 byte

-3 byte terima kasih Lynn

Mengambil input sebagai byte-string dengan huruf kecil seperti: 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

Cobalah online!

Felipe Nardi Batista
sumber
131 bytes
Mr. Xcoder
1
C=0!=d==c-lbahkan lebih pendek.
Lynn
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;}

Pasti bisa bermain golf lagi dengan menggunakan teknik lain untuk memeriksa urutan.

Penjelasan:

Coba di sini.

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
Kevin Cruijssen
sumber
1

Pyth ,  51  50 byte (mengejutkan)

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

Verifikasi semua kasus uji atau Coba di sini.

Tuan Xcoder
sumber
Saya sekarang sadar bahwa saya dapat membuatnya lebih pendek, tetapi akan memperbarui jika saya dapat golf secara konsisten.
Tn. Xcoder
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))}

Fungsi anonim yang mengambil vektor karakter dan mengembalikan integer.
Masukan yang diharapkanz(c("A", "A", "1", "1", "1", "1", "1"))

Cobalah online!

Versi tidak disatukan

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))
}
AndriusZ
sumber
0

Pyth , 48 42 byte

Port langsung dari jawaban python saya. Mengambil input sebagai byte-string dengan huruf kecil sebagai: b'aa11111 '.

Ini adalah pengkodean pertama saya di Pyth, jadi ada sarannya: D

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

Coba di sini

Felipe Nardi Batista
sumber
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}

Tidak ditambang

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
}

Edit riwayat:

  • Mempersempit kode hanya untuk bekerja dengan 0000 XXX format. (-24 byte)
  • Suntingan seperti yang disarankan oleh @Titus. (-6 byte)
  • memperbaiki bug di mana empat angka identik memberi skor 7 bukannya 3. (+16 bytes)
  • Semi-colon terakhir yang dihapus. (-1 byte)
  • Memperbaiki kesalahan ketik dalam kode. (tidak ada perubahan byte)
Brian H.
sumber
Bagaimana saya menghitung byte?
Brian H.
1
Counter Byte
H.PWiz
Saya benar-benar benci kenyataan bahwa blok kode tidak mengenali bahasa ...
Brian H.
Ingin penyorotan sintaksis?
H.PWiz
btw, 0000memberi 7 poin, apakah itu benar? (Ini dibaca sebagai urutan aritmatika dan urutan angka yang diulang pada saat yang sama)
Brian H.