Plakalarım kaç puan verir?


31

(Bu benim ilk kod golf sorumu)

Çocukken, babam ve ben arabalarda gördüğümüz plakanın oldukça basit kurallara dayanarak bazı puanlar verebileceği bir oyun icat ettik:

Aynı harf veya sayıdaki X miktarı, X-1 puanını verir, örnekler:

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

Sayıların birbirinin yanında olması gerekir, bu nedenle 33535, 3'lerin sırasını kırdığından yalnızca 1 puan verir.

En az 3 olmak üzere, artan veya azalan düzende bir X sayıları dizisi, X puanları verir, örnekler:

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

Nokta sistemi sadece 1 basamaklı sayılar için çalışır, bu yüzden 1919puan vermez ve 14710sadece 3 (147) verir.

Daha fazla puan vermek için diziler birleştirilebilir, örnekler:

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

Bununla birlikte, ekstra noktalar için daha küçük bir diziyi 2 küçük diziye bölmenize 1234 = 123, 234 (6 points)izin verilmez : izin verilmez.

Göreviniz, plakanın verdiği puan sayısını belirlemek için bir sıra verilir.

Danimarka'da, plakalar şu şekilde yapılandırılmıştır: C II ve I'nin tamsayı olduğu CC II III, bu nedenle örnek girdilerim bu yapıyı yansıtacaktır. Arzu ederseniz, diziyi kendi yapınıza uygun hale getirebilir veya gerçekten maceracı hissediyorsanız, programın plakanın yapısını analiz etmesine izin verin ve böylece dünyanın her yerindeki herhangi bir plakanın üzerinde çalışmasını sağlayın. Ancak cevabınızda kullanmaya karar verdiğiniz yapıyı açıkça belirtiniz.

İstediğiniz herhangi bir şekilde girişi alabilirsiniz, bir dize veya bir dizi bana en anlamlı geliyor.

Test girişi | çıktı:

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

Kendi yapınızı seçme ve hatta tüm yapıları kapsayan doğa nedeniyle, bir kazananın açıkça nasıl belirlenebileceğini görmüyorum. Galiba bir karar vermiş olan yapıdaki en kısa bayt olacak. (Ve sadece kendiniz için kolaylaştırmak için CICIC gibi bir giriş yapmayın)

DÜZENLE:

Soran yorumlar nedeniyle, paylaşılacak birkaç ekstra bilgi parçam var: Artan veya azalan bir sayı dizisi aritmetik bir diziyi belirtir, yani X +/- a * 0, X +/- a * 1, ... X +/- a * n vb. Öyleyse 3-5-7, örneğin 3 + 2 * 0, 3 + 2 * 1, 3 + 2 * 2'dir. Ancak, dizinin 0'dan başlaması veya sonunda bitmesi gerekmez. 0.

DAHA FAZLASI:

Girişinizi istediğiniz şekilde verebilirsiniz, boşluk, çizgi veya bir plakanın daha okunaklı olmasını sağlayan başka bir şey girmenize gerek yoktur. Baytları yalnızca büyük harfleri veya bunun gibi bir şeyi kabul ederek kurtarabilirseniz, bunu da yapabilirsiniz. Tek gereksinim programınızın hem karakter hem de sayı içeren bir dize / dizi / herhangi bir şey alabilmesi ve belirtilen kurallara göre doğru miktarda puan verebilmesidir.


Gevşek ilgili . PPCG'ye hoş geldiniz ve ilk güzel soru!
Bay Xcoder

Önerilen test durumu: XX 87 654. Tüm test durumlarınız için doğru olan bir şey buldum, bunun için bir şekilde yanlış oldum .. Tamir etmeye çalışıyorum.
Kevin Cruijssen

7
Belli bir yapıyı düzeltmenizi şiddetle tavsiye ediyorum (öneriyorum CCIIIII, boşluk yok), ya da bu problem burada ihtiyaç duyduğumuz objektif bir kazanma kriterinden yoksundur. “(CICIC gibi bir girişi almayın, sadece kendiniz için kolaylaştırmak için)” olduğu gibi çok özneldir. Kabul edilebilir bir yapı nedir ve ne değildir?
Lynn

1
@Lynn Kabul edilebilir bir yapı, aslında puan verebilecek yapıdır, CICIC hiçbir zaman puan vermeyen bir diziye sahip olmayacaktır, bu nedenle kabul edilemez. Ve bunun da ötesinde, neden “seçilen programlama dili ve seçilen yapı ile ilgili baytlarda en kısa cevap” açık, objektif bir kazanma kriteri değil? Bu galibiyet kriterleri basit ve takip etmesi kolay bir kurala sahip, ancak geliştiriciye ne tür bir yapıyla çalışmak istediklerini seçme özgürlüğü veriyor. Pek çok farklı kazananı olabilir, ancak, gerçekten, peki ne?
Troels MB Jensen

3
Test durumu: IA99999(azalan bir kod noktası sırası içeriyor, ancak sayı değil).
Zgarb

Yanıtlar:


7

05AB1E , 25 22 20 18 bayt

Boşluk içermeyen küçük harfli alfabetik karakterlerden ve sayılardan oluşan bir dizeyi kabul eder.

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

Çevrimiçi deneyin! veya Test Paketi olarak


Bir açıklama olmadan 05AB1E okuyamıyorum;) Ama girişi boşluk olmadan alarak bayt kaydedebilir misiniz?
Kevin Cruijssen

@ Mr.Xcoder Ben de şüpheliyim. Ama ben şahsen 05AB1E okuyamıyorum, bu yüzden belki de Emigna'nın uzaydan kurtulmak / görmezden gelmek için herhangi bir kod eklediğini düşündüm . Muhtemelen bunu fazladan bayt olmadan örtük olarak yapar, ama ben yapmamış olması durumunda sordum.
Kevin Cruijssen

Sadece bir salıncak için kodunuzu aldım ve kutsal bir saçmalık, aslında herhangi bir uzunluk veya sıra için işe yarıyor! Tek “sorun”, ABC'ye 3 puan vermesidir, bu da kendi içinde yanlış değildir, sadece hesaba katmadım, Danimarka'da olduğu gibi birbirinden yanlızca 2 harfimiz var.
Troels MB Jensen

2
@KevinCruijssen: Girişte hiçbir boşluk birkaç bayttan tasarruf etmiyor. Buna kendimiz karar verebileceğimiz kısmı özledim. Başınız için teşekkürler. (Bir açıklama da geliyor).
Emigna

@Emigna Açıkça soruda söylememiştim, yazdığımda yeterince ima ettiğimi düşündüm . Girdiyi dilediğiniz herhangi bir şekilde aldınız, bir dize ya da bir dizi bana en anlamlı geliyor. .
Troels MB Jensen

7

Kabuğu , 20 16 15 bayt

@Zgarb sayesinde -1 bayt

Boşluksuz ve küçük harflerle girdi alır.

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

Çevrimiçi deneyin!

açıklama

           Ẋ      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

Sanırım burada K0olabilir ¬.
Zgarb

Hmm, bu başarısız gibi görünüyor IA99999.
Zgarb

@Zgarb, giriş biçimini küçük harf olarak değiştirdi.
H.PWiz


2

Java 8, 195 bayt

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

Dizileri kontrol etmek için başka bir teknik kullanarak kesinlikle biraz daha golf oynayabilirsiniz.

Açıklama:

Burada dene.

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 bayt

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

Bir karakter vektörünü alan ve bir tam sayı döndüren adsız işlev.
Beklenen girişz(c("A", "A", "1", "1", "1", "1", "1"))

Çevrimiçi deneyin!

Ungolfed versiyonu

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 bayt

Python cevabımdan direkt port. Girdiyi küçük harflerle bir bayt dizisi olarak alır: b'aa11111 '.

Bu benim Pyth kodunu ilk kez girdiğim için ipuçlarından hoş geldiniz: D

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

Burada dene


0

JavaScript, 216 192 186 202 201 bayt

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
}

Geçmişi düzenle:

  • Kodu yalnızca 0000 XXXformatla çalışmak için daraltın . (-24 bayt)
  • @Titus tarafından önerilen şekilde düzenler. (-6 bayt)
  • dört özdeş sayının 3 yerine 7 puan verdiği bir hatayı düzeltti. (+16 bytes)
  • Kaldırılan son yarı-kolon. (-1 bayt)
  • Koddaki bir yazım hatası düzeltildi. (bayt değişikliği yok)

Baytları nasıl sayarım?
Brian H.


kod bloğunun dili tanımıyor olmasından gerçekten nefret ediyorum ...
Brian H.

Sözdizimi vurgulamak ister misiniz?
H.PWiz

btw, 00007 puan veriyor, doğru mu? (aritmetik bir dizi ve aynı anda tekrarlanan bir sayı dizisi olarak okunuyor)
Brian H.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.