ほぼ完璧なナンバープレートを検出する


15

注:これは@ Willbeingによる特定の長さの完璧なプレートの数を数えることがこの質問に触発されたものですが、わずかに異なります。


テキストが次の条件を満たす完璧なナンバープレートを呼び出します。

  • 文字で構成され、大文字([A-Z])または数字([0-9])のいずれかです。
  • 英語のアルファベットの文字の位置を合計すると、1のインデックスが付けられます(つまり:)A=1,B=2,...,Z=26整数nが得られます
  • 各桁のチャンクを取得し、それらを合計してからすべての結果を乗算すると、同じ結果nが得られます
  • nは完全な正方形です(例:49 (7 216 (4 2

ほぼ完全なライセンスプレートは、ことを除いて、完璧なナンバープレートのための条件を満たしているnがあるではない完全な方形。


入力

ナンバープレートのテキストを表す文字列。ハードコーディングを除き、標準形式の入力として使用されます。

出力

与えられた文字列がほぼ完璧なナンバープレートを表す場合、真の値(例:True/ 1)を返し、そうでない場合は偽の値(例:False/ 0)を返します。この抜け穴は厳密に禁止されていることに注意しながら、標準形式の出力はすべて受け入れられます。


licence plate -> output


A1B2C3 -> 1

A + B + C = 1 + 2 + 3 = 6
1 * 2 * 3 = 6 
6 is not a perfect square, 6 = 6 => nearly perfect plate

01G61 -> 1

(0 + 1) * (6 + 1) = 7
G = 7
7 is not a perfect square, 7 = 7 => nearly perfect plate

11BB2 -> 0

(1 + 1) * 2 = 4
B + B = 2 + 2 = 4
4 = 4, but 4 is the square of 2 => perfect license plate (not what we want)

67FF1 -> 0

(6 + 7) * 1 = 13
F + F = 6 + 6 = 12
12 != 13 => not perfect at all!

得点

これはなので、バイト単位の最短回答が勝ちです!



これはコードゴルフとしてより良いと思います
エリックアウトゴルファー

これを確実に理解させてください。ナンバープレートが完全で、そうでない場合にのみ、真実を出力しますn完全な方形?
数学中毒

@mathjunkieはい。 TL; DR:ライセンスがある場合にのみ、ほぼ(PS申し訳ありません後半の応答のために)完璧な
氏Xcoder

1
誰もがs/licence/license/igこれを行う前に、「ライセンス」が英国英語(および世界の他の地域の英語)の正しいスペルであることに注意してください。
メゴ

回答:


7

ゼリー29 28 30 バイト

バグを修正するために1バイトがために偽陽性を修正するために1バイト(誤っゼロのみの部分文字列を扱う)ChristianSieversによって発見"0""00"、...(0は完全な正方形である)上記固定中に発見されました。

i@€ØAS;Ʋ$
e€ØAœpV€€LÐfS€P;0⁼Ç

オンラインでお試しください!、またはテストを実行する

どうやって?

i@€ØAS;Ʋ$ - Link 1: [letter-sum, letter-sum is perfect square?]: plate
i@€        - index of €ach char in plate [reversed @rguments] (1-based, 0 otherwise) in:
   ØA      -     uppercase alphabet
     S     - sum
         $ - last two links as a monad:
      ;    -     concatenate with:
       Ʋ  -         is square?

e€ØAœpV€€LÐfS€P;0⁼Ç - Main link: plate                        e.g. "11BB2"
    œp              - partition plate at truthy values of:
e€                  -     is in? for €ach char in plate:
  ØA                -         uppercase alphabet                   [['1','1'],[''],['2']]
      V€€           - evaluate for €ach for €ach                   [[1,1],[],[2]]
          Ðf        - filter keep:
         L          -     length                                   [[1,1],[2]]
            S€      - sum each                                     [2,2]
              P     - product                                      4
               ;0   - concatenate a zero                           [4,0]
                  Ç - last link (1) as a monad (taking plate)      [4,1]
                 ⁼  - equal? (non-vectorising)                     0

うわー、天才ゼリーソリューション!
ミスターXcoder


@ChristianSievers、良いキャッチ。関連する別の種類のバグとともに修正され、テストスイートが拡張されました。
ジョナサンアラン

7

MATL、 36 34 33 35バイト

3Y432YXU"@V!Usvp]GlY2&msy=wtQ:qUm~v

で試してみてください MATL Onlineお

説明

        % Implicitly grab input as a string
3Y4     % Push the predefined literal '[A-Za-z]+' to the stack
32      % Push the literal 32 to the stack (ASCII for ' ')
YX      % Replace the matched regex with spaces (puts a space in place of all letters)
U       % Convert the string to a number. The spaces make it such that each group of
        % of consecutive digits is made into a number
"       % For each of these numbers
  @V!U  % Break it into digits
  s     % Sum the digits
  v     % Vertically concatenate the entire stack
  p     % Compute the product of this vector
]       % End of for loop
G       % Explicitly grab the input again
lY2     % Push the predefined literal 'ABCD....XYZ' to the stack
&m      % Check membership of each character in the input in this array and 
        % return an array that is 0 where it wasn't a letter and the index in 'ABC..XYZ'
        % when it was a letter
s       % Sum the resulting vector
y       % Duplicate the product of the sums of digits result
=       % Compare to the sum of letter indices result
w       % Flip the top two stack elements
Q       % Add one to this value (N)
t:      % Duplicate and compute the array [1...N]
q       % Subtract 1 from this array to yield [0...N-1]
U       % Square all elements to create all perfect squares between 1 and N^2
m~      % Check to ensure that N is not in the array of perfect squares
v       % Vertically concatenate the stack.
        % Implicitly display the truthy/falsey result

ゼロのみで構成されるプレートに対して誤検知を生成します。たとえば、'0'または'00'(FWIW私もコードで修正しました)。
ジョナサンアラン

1
@JonathanAllanが更新されました。
-Suever

6

Python 2、 120 118バイト

s=t=p=0;r=1
for n in input():
 h=int(n,36)
 if h>9:s+=h-9;r*=t**p
 p=h<10;t=(t+h)*p
print(s==r*t**p)&(int(s**.5)**2<s)

オンラインでお試しください!

各文字をbase-36(h)の数字として解釈します。10進数に変換し、if h>9(文字であることを意味する)の合計に加算します。それ以外の場合は、変数に加算して乗算し、後で実行中の製品を形成します。


4

Perl 5バイト

79バイトのコード+ -pフラグ。

$.*=eval s/./+$&/gr for/\d+/g;$t-=64-ord for/\pl/g;$_=$.==$t&&($.**.5|0)**2!=$.

オンラインでお試しください!

$.*=eval s/./+$&/gr for/\d+/g;連続する数字の合計を乗算します。($.初期値が1であるため使用しています。これは乗算のニュートラル要素であることを意味します)。より正確には、数字のチャンク(for/\d+/g)ごとに、各数字の前にs/./+$&/graを配置すると+、文字列が使用さevalれ、現在の積で乗算されます。
次に、各文字の$t-=64-ord for/\pl/g;合計$tfor/\pl/g)。(ord文字のASCIIコードを返し、64-..1から26の間になります。
最後に、$.==$t両方の値が同じであり($.**.5|0)**2!=$.、完全な正方形でもないことを確認します。



4

Pythonの3163の156 155 164 161バイト

from math import*
m=1;s=t=p=0
for x in input():
 try:t+=int(x);p=1
 except:m*=[1,t][p];p=t=0;s+=ord(x.upper())-64
if p:m*=t
print(m==s and sqrt(m)!=int(sqrt(m)))

オンラインでお試しください!

  • ジョナサンのおかげで7バイト節約し、シューキーの節約
  • 1バイトの保存:誤検知の問題も修正しました。ジョナサンに感謝指摘してにします!
  • 11バイトの追加:前の編集が間違っていました(数字の合計の乗算が不要なループで行われていました)

1
from math import*短い
-shooqie

1
必要ありませんa、ただ使用してくださいfor x in input():11AA00最終版m*=tは実行されないため、ゼロの文字列で終わるプレート(例:)に対して誤検知が発生する可能性があります。
ジョナサンアラン

1
どうやら、私のコードは、孤立したゼロを含む文字列に対して偽陽性を示します(3A0Bもtrueと表示されます)。@JonathanAllanを指摘してくれてありがとう。私はそれを修正しようとします。
officialaimm

新しいバージョンを確認してください...数字の合計を乗算するかどうかを決定するために、新しいフラグ変数「p」を追加しました。
officialaimm

3

網膜、143バイト

trueの場合は1、falseの場合は0を返します

[1-9]
$ *
10 | 01
1
S_`(\ D)
O`
{`1(?= 1 * \ n(1+))
1ドル
)2 = `1 + \ n

[JS]
1 $ +
[TZ]
2 $ +
T`0L`ddd
1> `\ d + \ n?
$ *
^((?(1)((?(2)\ 2(11)| 111))| 1))* \ n

^(1 *)\ n \ 1 $

オンラインでお試しください!

説明:

[1-9]
$ *
10 | 01
1

最初に、ゼロ以外のすべての数字を単項表現に置き換えます。単項演算に影響しないように、隣接する数字のゼロを削除します

S_`(\ D)

空の行を除外するように注意して、結果の文字列を文字で分割します(2文字が連続している場合、これは問題AAです)。

O`
{`1(?= 1 * \ n(1+))
1ドル
)2 = `1 + \ n

文字列を辞書式にソートします。その後、繰り返し以下を実行します

1)それぞれ11次の行のs の数で置き換えます(これは乗算を模倣します)

2)1sの2行目を削除します

[JS]
1 $ +
[TZ]
2 $ +
T`0L`ddd

手紙を交換しJ-S1J1Kなどと手紙を交換T-Zして2T2U各グループを置き換える、その後など、A-IJ-S、およびT-Z1-9。私たちは、各文字の数値が残されます(例えば13のためM)。

1> `\ d + \ n?
$ *

最初の行を除くすべての行を単項に変換します(最初の行は既に単項になっています)。これらの行を連結します。これで、次の形式の文字列が残り<product of digits>\n<sum of letters>ます。

^((?(1)((?(2)\ 2(11)| 111))| 1))* \ n

平方数を空の文字列で置き換えます。これは、「差分ツリー」メソッドを使用します。

^(1 *)\ n \ 1 $

一致の1両側の2つの文字列が\n一致する場合に返します。そうでなければ、を返し0ます。


以下のための偽陽性11AA00AA11など
ジョナサン・アラン

@JonathanAllanありがとう!修正に11バイトかかりました
数学中毒者
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.