Wie viele Punkte gibt mein Kennzeichen?

31

(Dies ist meine erste Code-Golf-Frage)

Als ich ein Kind war, haben mein Vater und ich ein Spiel erfunden, bei dem das Nummernschild, das wir auf Autos sehen, bestimmte Punkte auf der Grundlage einiger recht einfacher Regeln enthalten kann:

X Betrag des gleichen Buchstabens oder der gleichen Zahl geben X-1 Punkte, Beispiele:

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

Die Zahlen müssen nebeneinander stehen, geben also 3353nur 1 Punkt, da die 5 die Reihenfolge der 3er durchbricht.

Eine Folge von X-Nummern in aufsteigender oder absteigender Reihenfolge, mindestens 3, ergibt X-Punkte. Beispiele:

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

Das Punktesystem funktioniert nur für 1-stellige Zahlen, gibt also 1919keine Punkte und 14710nur 3 (147).

Sequenzen können kombiniert werden, um mehr Punkte zu erzielen. Beispiele:

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

Es ist jedoch nicht gestattet, eine größere Sequenz in zwei kleinere Sequenzen zu zerlegen, um zusätzliche Punkte zu erhalten. Dies 1234 = 123, 234 (6 points)ist nicht zulässig.

Ihre Aufgabe ist es, in einer vorgegebenen Reihenfolge die Anzahl der Punkte zu bestimmen, die das Kennzeichen angibt.

In Dänemark sind die Nummernschilder folgendermaßen aufgebaut: CC II III, wobei C ein Zeichen und I eine Ganzzahl ist, und daher spiegeln meine Beispieleingaben diese Struktur wider. Wenn Sie möchten, können Sie die Sequenz an Ihre eigene Struktur anpassen oder, wenn Sie sich wirklich abenteuerlustig fühlen, das Programm die Struktur des Kennzeichens analysieren lassen, damit es auf allen Arten von Kennzeichen auf der ganzen Welt funktioniert. Geben Sie jedoch explizit die Struktur an, die Sie in Ihrer Antwort verwenden möchten.

Sie können die Eingabe nach Belieben vornehmen. Eine Zeichenfolge oder ein Array scheint mir am sinnvollsten zu sein.

Testeingang | Ausgabe:

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

Aufgrund der Art und Weise, wie Sie Ihre eigene Struktur auswählen oder sogar alle Strukturen abdecken, sehe ich nicht unbedingt, wie ein Gewinner explizit bestimmt werden kann. Ich nehme an, der Gewinner sind die kürzesten Bytes der Struktur, für die man sich entschieden hat. (Und nehmen Sie keine Eingabe wie CICIC, um es sich einfach zu machen)

BEARBEITEN:

Aufgrund von Kommentaren habe ich ein paar zusätzliche Informationen zu teilen: Eine Folge von aufsteigenden oder absteigenden Zahlen bezieht sich auf eine arithmetische Folge, also X +/- a * 0, X +/- a * 1, ... X +/- a * n usw. So ist beispielsweise 3-5-7 3 + 2 * 0, 3 + 2 * 1, 3 + 2 * 2. Die Sequenz muss jedoch nicht bei 0 beginnen oder mit enden 0.

MEHR BEARBEITEN:

Sie können die Eingabe nach Belieben vornehmen. Sie müssen keine Leerzeichen, Gedankenstriche oder andere Zeichen eingeben, die die Lesbarkeit eines Kennzeichens verbessern. Wenn Sie Bytes sparen können, indem Sie nur Großbuchstaben oder ähnliches akzeptieren, können Sie dies auch tun. Die einzige Voraussetzung ist, dass Ihr Programm eine Zeichenfolge / ein Array / irgendetwas, das sowohl Zeichen als auch Zahlen enthält, aufnehmen und die richtige Anzahl von Punkten gemäß den angegebenen Regeln ausgeben kann.

Troels MB Jensen
quelle
Locker verwandt . Willkommen bei PPCG und schöne erste Frage!
Mr. Xcoder
Empfohlene Testfall: XX 87 654. Ich habe mir etwas ausgedacht, das für alle Ihre Testfälle richtig war, aber für diese irgendwie falsch. Ich arbeite daran, es zu beheben.
Kevin Cruijssen
7
Ich empfehle dringend, eine bestimmte Struktur zu reparieren (ich schlage vor CCIIIII, keine Leerzeichen), sonst fehlt diesem Problem ein objektives Gewinnkriterium, das wir hier benötigen. So wie es ist, ist "(und nehmen Sie keine Eingabe wie CICIC, um es sich einfach zu machen)" sehr subjektiv. Was ist und ist keine zulässige Struktur?
Lynn
1
@Lynn Eine zulässige Struktur kann tatsächlich Punkte liefern. CICIC hat niemals eine Sequenz, die Punkte liefert. Sie ist daher nicht zulässig. Und obendrein, warum ist die kürzeste Antwort in Bytes auf die gewählte Programmiersprache und die gewählte Struktur kein klares, objektives Gewinnkriterium? Dieses Gewinnkriterium hat eine klare, leicht zu befolgende Regel, gibt dem Entwickler jedoch die Freiheit zu wählen, mit welcher Art von Struktur er arbeiten möchte. Zugegeben, es gibt viele verschiedene Gewinner, aber wirklich, na und?
Troels MB Jensen
3
Testfall: IA99999(enthält eine abnehmende Folge von Codepunkten, jedoch keine Zahlen).
Zgarb

Antworten:

7

05AB1E , 25 22 20 18 Bytes

Akzeptiert eine Zeichenfolge aus alphabetischen Kleinbuchstaben und Zahlen ohne Leerzeichen.

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

Probieren Sie es online! oder als Test Suite

Emigna
quelle
Ich kann 05AB1E nicht ohne eine Erklärung lesen;) Aber können Sie Bytes sparen, indem Sie die Eingabe ohne Leerzeichen erhalten?
Kevin Cruijssen
@ Mr.Xcoder Ich bezweifle es auch. Aber ich persönlich kann 05AB1E nicht lesen, also dachte ich, Emigna hätte vielleicht irgendeinen Code hinzugefügt, um die Leerzeichen loszuwerden / zu ignorieren. Wahrscheinlich tut es dies implizit ohne zusätzliche Bytes, aber ich habe nur gefragt, falls es nicht so ist.
Kevin Cruijssen
Ich habe gerade Ihren Code für eine Schaukel genommen und Heiliger Mist, er funktioniert tatsächlich für jede Länge oder Sequenz! Das einzige "Problem" ist, dass es auch 3 Punkte für ABC gibt, was an und für sich nicht falsch ist, ich habe es einfach nicht erklärt, da wir in Dänemark nur 2 Buchstaben nebeneinander haben.
Troels MB Jensen
2
@ KevinCruijssen: Nein Leerzeichen in der Eingabe würden ja mehrere Bytes sparen. Ich habe den Teil verpasst, in dem wir das selbst entscheiden konnten. Vielen Dank für die Köpfe hoch. (Eine Erklärung kommt auch).
Emigna
@Emigna Ich hatte es in der Frage nicht explizit angegeben, ich dachte, ich hätte es genug angedeutet, als ich schrieb. Sie können die Eingabe auf eine beliebige Weise nehmen, entweder eine Zeichenfolge oder ein Array scheinen für mich am sinnvollsten zu sein. .
Troels MB Jensen
7

Schale , 20 16 15 Bytes

-1 Byte dank @Zgarb

Nimmt Eingaben ohne Leerzeichen und in Kleinbuchstaben vor.

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

Probieren Sie es online!

Erläuterung

           Ẋ      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.PWiz
quelle
Ich denke K0kann ¬hier sein.
Zgarb
Hmm, das scheint zu scheitern IA99999.
Zgarb
@Zgarb, Eingabeformat in Kleinbuchstaben geändert.
H.PWiz
5

Python 3 , 193 85 Bytes

-3 Bytes dank Lynn

Nimmt die Eingabe als Byte-String mit Kleinbuchstaben als: 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

Probieren Sie es online!

Felipe Nardi Batista
quelle
131 Bytes
Mr. Xcoder
1
C=0!=d==c-list noch kürzer.
Lynn
2

Java 8, 195 Bytes

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

Kann definitiv noch mehr golfen werden, indem eine andere Technik verwendet wird, um nach Sequenzen zu suchen.

Erläuterung:

Probieren Sie es hier aus.

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
quelle
1

R , 153 , 145 , 143 Bytes

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

Anonyme Funktion, die einen Zeichenvektor verwendet und eine Ganzzahl zurückgibt.
Erwartete Eingabez(c("A", "A", "1", "1", "1", "1", "1"))

Probieren Sie es online!

Ungolfed-Version

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
quelle
0

Pyth , 48 42 Bytes

Direkter Port von meiner Python-Antwort. Übernimmt die Eingabe als Byte-Zeichenfolge mit Kleinbuchstaben als: b'aa11111 '.

Dies ist mein erstes Mal, dass ich in Pyth programmiere, daher sind alle Tipps willkommen: D

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

Probieren Sie es hier aus

Felipe Nardi Batista
quelle
0

JavaScript, 216 192 186 202 201 Bytes

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}

Uneingeschränkt

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
}

Verlauf bearbeiten:

  • Der Code wurde so eingegrenzt, dass er nur mit 0000 XXXFormat funktioniert . (-24 Bytes)
  • Bearbeitet wie von @Titus vorgeschlagen. (-6 Bytes)
  • Ein Fehler wurde behoben, durch den vier identische Zahlen eine Punktzahl von 7 anstelle von 3 ergaben. (+16 Bytes)
  • Letztes Semikolon entfernt. (-1 Byte)
  • Ein Tippfehler im Code wurde behoben. (keine Byteänderung)
Brian H.
quelle
Wie zähle ich die Bytes?
Brian H.
1
Bytezähler
H.PWiz
Ich hasse wirklich die Tatsache, dass der Codeblock die Sprache nicht erkennt ...
Brian H.
Möchten Sie die Syntax hervorheben?
H.PWiz
Übrigens, 0000gibt 7 Punkte, ist das richtig? (Es wird als eine arithmetische Folge und eine wiederholte Zahlenfolge gleichzeitig gelesen)
Brian H.