フランスのナンバープレート


41

サンドボックス

フランスのナンバープレート

フランスのナンバープレートは、数字と文字の特定のパターンに従って、順番に並んでいます。AB-012-CD

チャレンジ

特定の番号について、対応するフランスのナンバープレート番号を出力するプログラムまたは関数を作成します。プログラムは、リンクされたページで指定されているような特別なケースを処理しないでください。26*26*1000*26*26 => 456 976 000可能な限り完全なプレートを生成できるか、言語がサポートできる範囲である必要があります。

番号付けシステムは次のとおりです。

  • AA-000-AAからAA-999-AA(数字が最初に進化);
  • AA-000-ABからAA-999-AZ(その後、右の最後の文字);
  • AA-000-BAからAA-999-ZZ(右の最初の文字);
  • AB-000-AAからAZ-999-ZZ(左の最後の文字);
  • BA-000-AAからZZ-999-ZZ(左の最初の文字)。

入力

  • 整数としてのプレート番号のインデックス

出力

  • 対応するフランスのナンバープレート番号

追加情報

  • 文字は大文字でなければなりません
  • 0ベースと1ベースの両方のインデックスを使用してプレートを生成できます(AA-000-AAは、0または1に対応できます。他のすべてのテストケースが同じインデックスを使用すると仮定します。

これはcode-golfであり、すべての言語の最短回答が勝ちです!

テストケース(0ベースのインデックス付け)

          0 -> AA-000-AA
          1 -> AA-001-AA
        999 -> AA-999-AA
       1000 -> AA-000-AB
    675 999 -> AA-999-ZZ
    676 000 -> AB-000-AA
456 975 999 -> ZZ-999-ZZ

2
より難しいバリエーションを作成したい場合は、Wikipediaから直接、いくつかの要件があります。また、SSの組み合わせは除外されます。これは、一時的なプレートを示すため、最初の文字グループのナチス組織とWWを連想させるためです。」
エリックドゥミニル

4
@EricDuminilチャレンジに不愉快な制約を追加しただけなので、意図的に除外しました。しかし、それはそれを行うのは興味深いかもしれない事実ですが、それでも「ボーナスポイント」と、私はそれがこれらの規則を実装する価値があるだろう疑う
Elcan

回答:


17

Pure Bash(外部ユーティリティなし)、64

  • @NahuelFouilleulのおかげで2バイト節約
x={A..Z}
eval f=($x$x-%03d-$x$x)
printf ${f[$1/1000]} $[$1%1000]

オンラインでお試しください!-7つのテストケースを実行するのに約10秒かかります。

  • 行#1は、変数への文字列の単純な割り当てです。
  • 行#2は、まだ指定されていない数字を使用して、456,976のすべての可能な文字の組み合わせに対応するprintf形式の文字列の配列を構築する中括弧の拡張です。これevalは、ブレース展開の前に(xの)変数展開を確実に行うために必要です。
  • 3行目は、適切なフォーマット文字列を取得するために配列のインデックスを作成し、そのパラメーターとして数字部分を取ります。


13

Perl 5(-ap)、47バイト

$_=AAAA000;$_++while$F[0]--;s/(..)(\d+)/-$2-$1/

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


PHP、74バイト

for($a=AAAA000;$argn--;$a++);echo preg_replace('/(..)(\d+)/','-$2-$1',$a);

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


2
PHPの+ 1、PHPで文字をインクリメントできることは知っていましたが、文字と数字の組み合わせをインクリメントできることを知りませんでした。PHPは毎日私を驚かせます!そして、おかげで私は何か新しいことを学びました。
ナイト2

8

Pythonの379の78 77バイト

lambda n:f"%c%c-{n%1000:03}-%c%c"%(*(65+n//1000//26**i%26for i in[3,2,1,0]),)

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

f"string"Black Owl Kaiの答えを見るまで、フォーマットのショートカットが存在することをどういうわけか私は決して知りませんでした。


置き換えtuple78バイト(*...,)
Black Owl Kai

を使用f"string"すると、Python 3.6+の回答が排他的になります。いい仕事だ!
connectyourcharger

8

Ruby、61 59 55バイト

->n{s='AA-AA000-';eval's.succ!;'*n;s[2]+=s[5,4];s[0,9]}

また55バイト:

->n{s='AA-AA000-';eval's.succ!;'*n;s[2]+=s.slice!5,4;s}

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

これは、カウンターをAA-AA000-に初期化し、それをn(nとevalingでコードの文字列を乗算することにより)インクリメントし、3番目の後に最後の4文字を移動します。


->n{s=('AA-AA000-'..?Z*9).step.take(n)[-1];s[2]+=s.slice!5,4;s}長いですが、短くすることは可能かと思います。
エリックドゥミニル

理論的に->n{s=[*'AA-AA000-'..?Z*9][n];s[2]+=s.slice!5,4;s}は機能するはずで、長さは50バイトしかありませんが、最初にすべての可能なプレートを生成します。:-/
エリックドゥミニル

1
50バイトの場合は「s + = s.slice!3,2」
GB

次に、これも動作するはず:45のバイトを
GB

7

PHP96 84 79バイト

Ismael Miguelの素晴らしいコメントに感謝します。

for($s=AAAA;$x++^$argn/1e3;)$s++;printf('%.2s-%03u-'.$s[2].$s[3],$s,$argn%1e3);

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

PHPで文字をインクリメントできるという事実を利用します!そうAAAA++なってしまうAAABAAAZ++なりますAABA。の整数部分を取得することで、文字をインクリメントする回数を計算しますinput/1000。次に、4文字の長さを何度もインクリメントし、最初の2文字と最後の2文字が自動的にプレートの左右になります。

たとえば675999、文字の増分数の入力は(int)(675999 / 1000) = 675ですので、AAAAとなりAAZZます。

最後に、中央の数値が計算されinput%1000printfを使用してすべてが指定された形式で印刷されます。%.2s文字列の最初の2文字を出力%03uし、左の数字に3つのゼロを埋め込みます。


2
@Elcan申し訳ありませんが、12バイトのコストで問題を修正しました。P:私は台無しにするために、3匹の猫によって攻撃を受けているの言い訳持って
Night2

1
代わりに%0.2s書くことができます%.2s。これにより、1バイト節約できます。(小さなヒントとして:特定の小数点以下の桁数の10進数を出力する場合は%.2f、同じように機能するため、(または他の修飾子)を実行できます)
Ismael Miguel

1
@IsmaelMiguelありがとう、私たちがドロップできることを知らなかった0。編集:ドキュメントを見ると、そもそもそれを必要としなかったようです:P
Night2

1
ああ、そう、あなたはそれらを落とすことができる。また、$x++^$argn/1e3代わりに行うことができ、$x++<(0^$argn/1e3)4バイトを節約する必要があります。この意志までループ($x++^$argn/1e3) === 0、それがある0場合$xとは、$argn/1e3同じである整数の数(使用して^整数に番号をキャストします)。これはsandbox.onlinephpfunctions.com/code/…で
Ismael Miguel

1
@IsmaelMiguelどうもありがとう、非常に賢いアイデア。あなたはこの答えをJSのものよりも短くしました。それは成果です:P
Night2

7

C、88 86バイト

#define d(b)a / b / 1000%26 + 65
f(a){printf( "%c%c-%03d-%c%c"、d(17576)、d(676)、a%1000、d(26)、d(1));}

非常に簡単で、除算とモジュラスを使用してフィールドを抽出し、文字に「A」を追加してそれらをASCII文字にマップし、printfで数値をフォーマットします。

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



6

05AB1E25 22 20 バイト

Au2ããs₄‰`UèX₄+¦'-.øý

@Grimyのおかげで、-2バイト(およびリスト全体を生成しないことでパフォーマンスが向上しました)。

0ベースのインデックス付け。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

Au            # Push the lowercase alphabet, and uppercase it
  2ã          # Create all possible pairs by taking the cartesian product with itself:
              #  ["AA","AB","AC",...,"ZY","ZZ"]
    ã         # Get the cartesian product of this list with itself:
              #  [["AA","AA"],["AA","AB"],...,["ZZ","ZZ"]]
s             # Swap to push the (implicit) input
 ₄‰           # Take the divmod-1000 of it
              #  i.e. 7483045 becomes [7483,45]
    `         # Push these values separated to the stack
     U        # Pop and store the remainder part in variable `X`
      è       # Index the integer part into the list of letter-pairs we created earlier
              #  i.e. 7483 will result in ["AL","BV"]
X             # Push the remainder part from variable `X` again
 ₄+           # Add 1000 to it
   ¦          # And remove the leading 1 (so now the number is padded with leading 0s)
              #  i.e. 45 becomes 1045 and then "045"
    '-.ø     '# Surround this with "-" (i.e. "045" becomes "-045-")
        ý     # Join the two pairs of letters by this
              #  i.e. ["AL","BV"] and "-045-" becomes "AL-045-BV"
              # (after which the top of the stack is output implicitly as result)

最後の部分は、( s₄‰`UèX₄+¦'-.øý)可能性がI₄÷èI₄+3.£.ý'-ý等しいバイトの代替のために:
オンラインそれを試してみたり、すべてのテストケースを確認してください

I₄÷           # Push the input, integer-divided by 1000
   è          # Use it to index into the letter-pairs we created earlier
              #  i.e. 7483045 becomes 7483 and then ["AL","BV"]
I₄+           # Push the input again, and add 1000
   3.£        # Only leave the last three digits
              #  i.e. 7483045 becomes 7484045 and then "045"
            # Intersperse the pair with this
              #  i.e. ["AL","BV"] and "045" becomes ["AL","045","BV"]
        '-ý  '# And join this list by "-"
              #  i.e. ["AL","045","BV"] becomes "AL-045-BV"
              # (after which the top of the stack is output implicitly as result)

1
Au2ããI₄‰`UèX₄+¦'-.øýまたはで20 Au2ããI₄÷èI₄+3.£'-.øý
グリムミー

1
@Grimyありがとう!また、完全なリストへの生成とインデックス付けを行わないことにより、さらに高速になりました。:)
ケビン・クルーッセン

6

J56 49 46バイト

226950 A.'--',7$_3|.4,@u:65 48+/(4 3#26 10)#:]

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

FrownyFrogのおかげで-3バイト

全体は7つのネストされたトレインにすぎません。それが面白くないのなら、何ですか。

  ┌─ 226950                                            
  ├─ A.                                                
  │        ┌─ '--'                                     
──┤        ├─ ,                                        
  │        │      ┌─ 7                                 
  └────────┤      ├─ $                                 
           │      │   ┌─ _3                            
           └──────┤   ├─ |.                            
                  │   │    ┌─ 4                        
                  └───┤    │     ┌─ ,                  
                      │    ├─ @ ─┴─ u:                 
                      └────┤                           
                           │     ┌─ 65 48              
                           │     ├─ / ───── +          
                           └─────┤                     
                                 │       ┌─ '4 3#26 10'
                                 └───────┼─ #:         
                                         └─ ]         

1
クール!結果の文字列をフォーマットするには、順列を使用するのが良い方法です。
ガレンイワノフ


ありがとう@FrownyFrog!
ジョナ



5

R、101バイト

b=0:3;a=scan()%/%c(10^b,1e3*26^b)%%rep(c(10,26),e=4);intToUtf8(c(a[8:7],-20,a[3:1]-17,-20,a[6:5])+65)

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

必要な算術計算を行うだけです。にa役に立たない値をベクターに含めることで5バイトを節約しa[4]、ヘルパーベクターを再利用できるようにしましたb

たとえば、2番目の文字(Bin AB-012-CD)を考えてください。そのキャラクターはごとに変化します26×26×1000=676000nn %/% 676000 %% 26%/%%%


4

ゼリー 26  22 バイト

ØAṗ2,`ØDṗ3¤ṭŒp⁸ị2œ?j”-

文字のリストを生成する整数(1から始まる)を受け入れる単項リンク...最初にすべてのプレートを作成するため、非常に遅いです!

オンラインでお試しください!(完了しません)
または、アルファベットを減らしたバージョンを試してください(文字は「ABC」のみ)。


タイムリーに完了するコードの場合、32バイトのフルプログラム(0インデックス付き)があります。これは、モジュラー算術と数値ベース圧縮を使用する代わりに単一のプレートを作成します。

dȷ+“©L§“£ż’µḢṃØAṙ1¤ḊŒHW€jDḊ€$j”-

これを試してください!


ダッシュを紛失したように見えるので、現時点ではチャレンジのルールに適合していません:P
Elcan

1
ああ、私はそれらをある種の区切りとして完全に無視しました!これらの方法には大きな違いがあります:(
Jonathan Allan

それについてすみません:c
エルカン

それらを追加するために7バイトを追加しました。今では全体的な方法がより短くなっ
Jonathan Allan

おっと、@ Grimyに感謝します-私がここにいる間に3でゴルフをするかもしれません:p –ジョナサンアラン1分前
ジョナサンアラン


3

、33バイト

Nθ¹✂I⁺θφ±³≔⪪⍘⁺X²⁶¦⁵÷θφα²η¹⊟ηM⁹←⊟η

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Nθ

番号を入力してください。

¹

を印刷し-ます。

✂I⁺θφ±³

数値に1000を加算し、結果を文字列にキャストして、最後の3桁を出力します。

≔⪪⍘⁺X²⁶¦⁵÷θφα²η

数値を1000で除算し、26⁵を追加します。大文字のアルファベットを使用してカスタムベースに変換すると、長さ6の文字列になり、文字のペアに分割されます。

¹

を印刷し-ます。

⊟η

文字の最後のペアを印刷します。

M⁹←

ナンバープレートの先頭に移動します。

⊟η

必要な文字の残りを印刷します。



3

エクセル、183の 167 155 147バイト

@Neilのおかげで-16バイト。(6を使用してE3

@Keetaのおかげで-12バイト。(のTRUNC代わりにQUOTIENT

@Jonathan Laroucheのおかげで-8バイト(INTではなくTRUNC

=CHAR(65+INT(A1/17576E3))&CHAR(65+MOD(INT(A1/676E3),26))&"-"&TEXT(MOD(A1,1E3),"000")&"-"&CHAR(65+MOD(INT(A1/26E3),26))&CHAR(65+MOD(INT(A1/1E3),26))

5つの部分を連結します。

CHAR(65+INT(A1/17576E3))
CHAR(65+MOD(INT(A1/676E3),26))
TEXT(MOD(A1,1E3),"000")
CHAR(65+MOD(INT(A1/26E3),26))
CHAR(65+MOD(INT(A1/1E3),26))

動作しMOD(QUOTIENT(A1,1E3),26)ませんか?また、なぜ1E3のため1000ではなく、26E3など?
ニール

TRUNCを完全に削除し、部門をMOD内に移動すると、さらに節約できます。= CHAR(65 + A1 / 17576E3)&CHAR(65 + MOD(A1 / 676E3,26))& "-"&TEXT(MOD(A1,1E3)、 "000")& "-"&CHAR(65 + MOD(A1 / 26E3,26))&CHAR(65 + MOD(A1 / 1E3,26))127バイトに縮小します。
キータ

QUOTIENTを削除するつもりでした。もともと、コンマの代わりに/を使用して商を切り捨てることを提案していました。
キータ

@Keeta、あなたの127バイトのソリューションは、いくつかの値のために失敗します。例えば456 975 996- >[Z-996-ZZ
Wernisch

@キータ、CHAR(65+)小数を静かに切り捨てるように見え%.9999997614649ます。それより大きい場合は切り上げられます。とを比較CHAR(65+24.9999997614649)CHAR(65+24.999999761465)ます。
ヴェルニッシュ


2

Japt、21 バイト

わいせつ遅い!真剣に、それを実行しようとしないでください!

昨夜この仕事をするために戦っているとき、私がどこに間違っていたのかを理解させてくれたケビンへの帽子の先端。

;gBï ï ïq#d0o ùT3 û-5

試してください -番号の範囲をに制限し000-005ます。

;gBï ï ïq#d0o ùT3 û-5     :Implicit input of integer
 g                        :Index into
; B                       :  Uppercase alphabet
   ï                      :  Cartesian product with itself
     ï                    :  Cartesian product of the result with itself
       ï                  :  Cartesian product of that with
         #d0              :    1000
            o             :    Range [0,1000)
              ùT3         :    Left pad each with 0 to length 3
                  û-5     :    Centre pad each with "-" to length 5
        q                 :  Join the first element (the 2 pairs of letters) with the second (the padded digit string) 

2

Forth(gforth)、94バイト

: x /mod 65 + emit ; : f dup 1000 / 17576 x 676 x ." -"swap 0 <# # # # #> type ." -"26 x 1 x ;

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

0インデックス。入力はスタックの最上部から取得されます

コードの説明

\ extract out some common logic
: x             \ start a new word definition
  /mod          \ divide first argument by second and get both quotient and remainder
  65 +          \ add 65 (ascii A) to quotient
  emit          \ output
;               \ end word definition

: f             \ start a new word definition
  dup 100 /     \ duplicate input and divide by 1000
  17576 x       \ divide by 26^3 and output ascii char
  676 x         \ divide by 26^2 and output ascii char
  ." -"         \ output "-"
  swap 0        \ grab original number and convert to double-cell number
  <# # # # #>   \ convert last 3 chars of number to a string
  type ." -"    \ output string followed by "-"
  26 x          \ divide result of last mod by 26 and output ascii char
  1 x           \ output ascii char for remaining amount
;               \ end word definition





1

MATLAB、113バイト

c=@(x,p)char(mod(idivide(x,1000*26^p),26)+65);
s=@(n)[c(n,3),c(n,2),num2str(mod(n,1000),'-%03d-'),c(n,1),c(n,0)]

説明:

最初の行は、2つの入力の文字(from AからZ)を生成する関数を定義します。xプレート番号に変換するインデックス番号、およびp26の指数として使用される整数(つまり26^p)。この2番目の入力により、最初の英数字プレートの数字(p=3)から最後の数字()まで計算を調整できp=0ます。

たとえば、1000 * 26 * 26の反復ごとに循環する2桁目の場合、操作mod(idivide(x,1000*26^2),26)は0から25の間のインデックスを返し、char65を追加することでASCIIに変換されます(インデックスは0ベースであるため)

2行目は、単に文字を連結するだけです。各英数字は、関数を使用してc(x,p)計算moduloされます。数字は、操作で単純に計算され、文字列に変換されます。

プレート番号を構成する文字列の各コンポーネントは次のとおりです。

digit #     |    how often is it cycled             |  code
----------------------------------------------------------------
digit 1     | cycle every 1000*26*26*26=1000*26^3   | c(n,3) 
digit 2     | cycle every 1000*26*26   =1000*26^2   | c(n,2) 
digit 3,4,5 | cycle every iteration                 | num2str(mod(n,1000),'-%03d-')
digit 6     | cycle every 1000*26      =1000*26^1   | c(n,1) 
digit 7     | cycle every 1000         =1000*26^0   | c(n,0) 

MATLABをオンラインで試すことはできません(編集:実際にオンラインで試すことができます)ので、MATLABユーザーにテストケースを検証できるようにします。

% chose some test cases
n = uint32([0;1;999;1000;675999;676000;456975999]) ;

% work out their plate numbers
plates = s(n) ;

% display results
fprintf('\n%10s | Plate # \n','Index')
for k=1:numel(n)
    fprintf('%10d : %s\n',n(k),plates(k,:))
end

出力:

     Index | Plate # 
         0 : AA-000-AA
         1 : AA-001-AA
       999 : AA-999-AA
      1000 : AA-000-AB
    675999 : AA-999-ZZ
    676000 : AB-000-AA
 456975999 : ZZ-999-ZZ

バリアント:数値から文字への変換 を許可sprintfまたは処理fprintfするオプションが可能であることに注意してください。関数を簡素化できますcが、全体的に、この実装ではさらに数バイト(119バイト)になります。

c=@(x,p)mod(idivide(x,1000*26^p),26)+65 ;
s=@(n)sprintf('%c%c-%03d-%c%c\n',[c(n,3),c(n,2),mod(n,1000),c(n,1),c(n,0)]')

1

q、78バイト

{sv["-","0"^-4$($:[x mod 1000]),"-"]2 2#(|).Q.A mod[x div 1000*26 xexp(!)4]26}

                                                    x div 1000*26 xexp(!)4     / input (floor) divided by 1000*26 ^ 0 1 2 3
                                                mod[                      ]26  / mod 26
                                           .Q.a                                / alphabet uppercase, indexed into by preceeding lines, for x=1000, we'd get "BAAA"
                                    2 2#(|)                                    / reverse and cut into 2x2 matrix ("AA";"AB")
               ($:[x mod 1000]),"-"                                            / string cast x mod 1000 and append "-"
            -4$                                                                / left pad to length 4, "  0-"
    "-","0"^                                                                   / fill nulls (" ") with "0" and prepend "-"
 sv[              x                ]y                                          / join elems of y by x

1

C(GCC) 136の 106 105バイト

#define P(i)s[i]=65+x%26;x/=26;
z;s[]=L"  -%03d-  ";f(x){z=x%1000;x/=1e3;P(9)P(8)P(1)P(0)wprintf(s,z);}

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

celingcatソリューションから-7バイト、それに触発された-23

を暗黙的にキャストするに変更することにより、ceilingcatのソリューションから-1バイトchar[]wchar_t[]int[]

0ベースのインデックスを使用します。

説明/ゴルフなし:

int s[] = L"  -%03d-  "; // Pre-made wide-string with dashes and ending null byte
                         // and wprintf directive for digits
int z;                   // Temporary variable to store the digit part
void f(int x) {
    z = x % 1000;        // The digits represent x % 1000
    x /= 1000;           
    s[9] = 'A' + x % 26; // Place least significant letter
    x /= 26;             // Divide off least significant letter
    s[8] = 'A' + x % 26; // Place second letter
    x /= 26;             // Divide off second letter
    s[1] = 'A' + x % 26; // Place third letter
    x /= 26;             // Divide off third letter
    s[0] = 'A' + x;      // Place fourth letter (Don't need to % 26 because x < 26 now)
    wprintf(s, z); // Print finished string (with x%1000 replacing %03d)
}

@ceilingcatありがとう!そのアイデアを使用して、マクロからabパラメーターを削除し、106バイトになりました
pizzapants184



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.