ナンバープレートは何ポイントを与えますか?


31

(これは私の最初のコードゴルフの質問です)

私が子供の頃、父と私は、車にあるナンバープレートがいくつかの単純なルールに基づいて特定のポイントを与えることができるゲームを発明しました。

同じ文字または数字のX個の量は、X-1ポイントを与えます。例:

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

数字は互いに隣り合っている必要があるため3353、5は3のシーケンスを中断するため、1ポイントしか与えません。

昇順または降順の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)ことは許可されていません:許可されていません。

タスクは、シーケンスが与えられ、ナンバープレートが与えるポイントの数を決定します。

デンマークでは、ナンバープレートは次のように構成されています。CCII III、Cは文字、Iは整数です。したがって、入力例はこの構造を反映しています。必要に応じて、シーケンスを独自の構造に適合させることができます。または、本当に冒険したい場合は、プログラムにナンバープレートの構造を分析させ、世界中のあらゆるタイプのナンバープレートで機能させることができます。ただし、回答で使用することにした構造を明示的に述べてください。

入力は任意の方法で取得できます。文字列または配列のいずれかが、私にとって最も理にかなっているようです。

テスト入力| 出力:

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へようこそ。最初の質問です。
ミスターXcoder

推奨されるテストケース:XX 87 654。すべてのテストケースで正しいが、このテストケースでは何らかの形で正しくないものを思いつきました。
ケビンCruijssen

7
特定の構造を修正することを強くお勧めします(CCIIIIIスペースを使用しないことをお勧めします)。そうしないと、この問題には客観的な勝利基準がありません。現状のまま(「CICICのように入力しないで、自分で簡単にするため」)は非常に主観的です。許容される構造とは何ですか?
リン

1
@Lynn許容構造とは、実際にポイントを生成できる構造のことです。CICICには、ポイントを生成するシーケンスがないため、許容されません。それに加えて、「選択したプログラミング言語と選択した構造に関するバイト単位の最短回答」が明確で客観的な勝利基準ではないのはなぜですか?この勝利基準には、まっすぐで従うのが簡単なルールがありますが、開発者は、どの種類の構造を使用するかを自由に選択できます。確かに、それは多くの異なる勝者を持っているかもしれませんが、本当に、それで何ですか?
Troels MBジェンセン

3
テストケース:(IA99999数字ではなくコードポイントの減少シーケンスが含まれています)。
ズガルブ

回答:


7

05AB1E25 22 20 18バイト

スペースなしで小文字のアルファベット文字と数字の文字列を受け入れます。

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

オンラインでお試しください! またはテストスイートとして


説明なしに05AB1Eを読むことはできません;)しかし、スペースなしで入力を取得することでバイトを節約できますか?
ケビンCruijssen

@ Mr.Xcoder私もそれを疑います。しかし、私は個人的に05AB1Eを読むことができないので、スペースを取り除く/無視するためにエミグナがコードを追加したのではないかと思いました。おそらく余分なバイトなしで暗黙的にこれを行いますが、そうしなかった場合に備えて尋ねました。
ケビンCruijssen

私はあなたのコードをスイングのために取りました。唯一の「問題」は、ABCにも3ポイントを付与することです。それ自体は間違いではありません。デンマークでは互いに2文字しか隣接していないため、説明しませんでした。
トロールズMBジェンセン

2
@KevinCruijssen:入力にスペースがないと、数バイト節約できます。私たちが自分でそれを決めることができる部分を見逃しました。ヘッドアップをありがとう。(説明も来ています)。
エミグナ

@Emigna私は質問でそれを明示的に述べていませんでしたが、私が書いたときにそれを十分に示唆していると思いました。あなたが好きな方法で入力を取ることができます。
トロールズMBジェンセン

7

20 16 15バイト

@Zgarbのおかげで-1バイト

スペースなしで小文字で入力します。

ṁ??¬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ことができると思い¬ます。
ズガルブ

うーん、これは失敗するようIA99999です。
ズガルブ

@Zgarb、入力形式を小文字に変更しました。
H.PWiz


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

R153145、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

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}

未縮小

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バイト)
  • 4つの同一の数字が3ではなく7のスコアを与えるバグを修正しました(+16バイト)
  • 最後のセミコロンを削除しました。(-1バイト)
  • コードの誤字を修正しました。(バイト変更なし)

バイトをカウントするにはどうすればよいですか?
ブライアンH.


イムは、実際にコードブロックが...言語を認識していないという事実嫌う
ブライアンH.

構文の強調表示が必要ですか?
H.PWiz

ところで、00007点を与える、それは正しいですか?(それは算術シーケンスと繰り返し数シーケンスとして同時に読み取られます)
ブライアンH.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.