適切なナンバープレートを生成してください!


15

シナリオ:あなたは、自動車やその他の車両のナンバープレートを設計する政府の会社で働くソフトウェアデザイナーです。ナンバープレートを生成するソフトウェアの開発を求められました。仕事を始める前に、上司はこれらの基本ルールを定めました。


ナンバープレートには以下を含めることはできません。

  • ASS
  • 666
  • 69<any number here>
  • <any number here>69
  • KKK
  • SHT

ルールと要件:

  • ナンバープレートランダムに生成する必要あります。
  • ランダムライセンスプレートが生成されると、同じライセンスプレートを再度生成することはできません。
  • 少なくとも200の一意のナンバープレートを出力する必要があります。必要に応じてさらに生成できます
  • 生成されたプレートをファイルに保存して、それらを「記憶」することができます。
  • :ナンバープレートは2節、3つだけの文字を含むもの、およびこのようなダッシュで区切られただけで3つの数字を、含有するものが含まれ233-ADFたりしますADF-233
  • 数字と大文字のみを使用できます。
  • ナンバープレートは、標準出力またはファイルに書き込むことができます。
  • ナンバープレートの各「側面」には、3つの数字または文字が含まれます。
  • これはので、最短で最も人気のある回答が勝ちます。勝者は7日後に選ばれます。

一般的なルール

  • 回答に次のものが含まれますが、これらに限定されません。
  • 言語名。
  • 文字カウント。
  • ファイルサイズ。
  • コードの実行方法。
  • コード自体。
  • 例:Pythonの234文字またはPythonの23メガバイト

追加の詳細を明確にする必要がある場合は、コメントにその旨を記載してください。投稿に追加します。とにかく、頑張って、適切なナンバープレートを生成してください!


更新1:勝者は少し前に選ばれます。

すぐに旅行に行かなければならないことがわかったので、7月25日00:00 UTCあたりに勝者を選択します。勝者が選択された後でも、勝者が選択されたことを知って全体を送信できます。バイ。


更新2:勝者!

勝者がいます!わーい!参加したすべての人にチーズとワインを!誰が勝ちましたか。

  • 1位:Àngel-Bash(95文字)
  • 2位:MartinBüttner-Mathematica(182バイト)
  • 2位:Emilio M Bumachar-Pyg(92?)
  • 2位:Peter Taylor-Golfscript(98文字)
  • 3位:Mark Thomas-Ruby(127文字)

うわー、3位2位タイ。ワオ。競争は終わりましたが、必要に応じてエントリーを送信してください。バイ!



2
ランダムナンバープレートが生成されると、同じナンバープレートを再度生成することはできません。」ランダムナンバープレートはどうですか?
ピーターテイラー14

4
これを行うための明らかな方法(そしておそらく実際の動作方法)は、順番に数字を生成することです。
ピーターテイラー14

5
「ランダムに生成」は不正確です。たとえば、法的なナンバープレートからランダムに選択されるのではなく、「未使用の法的なナンバープレートからランダムに均一に選択される」ことを意味すると思いますAAA-
Peter Taylor 14

1
すべてのプレートに何桁あるべきか、どの文字が有効かを教えてください-国によって異なります
誇りに思ってhaskeller 14

13
リストにないわいせつまたは不適切な文字列を含むランダムナンバープレートを生成するプログラムを作成するようになりました。
イルマリカロネン14

回答:


12

bash(95文字)

m実行ビットを設定して、PATH内のフォルダーにスクリプトを保存します。

として実行しbash mます。プレートはファイルpに保存されます

l(){ tr -dc $1</dev/urandom|head -c3;};egrep -ve"ASS|666|69|KKK|SHT" -fp>>p<<<`l 0-9`-`l A-Z`;m

これは、次を実行するのと同じです。

# Print three random numbers and three random letters
echo $(tr -dc 0-9 < /dev/urandom | head -c3)-$(tr -dc A-Z < /dev/urandom | head -c3) |

# Print only plates not matching the blacklist or any line of p
# Append the plates ton p
egrep -v -e "ASS|666|69|KKK|SHT" -f p >> p

# Execute itself again
m 

警告:プロセスが完了するのを待つのを避けるために、m実際にはファイナルはexec m(+5文字)である必要があります(ただし、何千もの問題はありません)

クレジットはhttp://www.cyberciti.biz/faq/linux-random-password-generator/に行き ます。tr -dc


それは私ですか、一意性の要件が欠落していますか?
クリスティアン・Ciupitu 14

1
@ Cristian-Ciupitu: grep -vは、ブラックリストと既に生成したプレートのリストの両方を除外しています(greppには1行に1つのパターンが含まれることを期待していますが、プレートには正規表現のメタキャラクターが含まれていないため、それらだけが一致します)。反復ごとに1つまたはゼロのプレートのみを生成するため、各反復の後、除外するプレートの完全な(更新された)リストがgrepによって読み取られます。:D
アンヘル14

6

PYG -92

Pe(Se(Re.sub(".*(666|69|ASS|KKK|SHT).*","",J(RSm(STuc*3,3)+[j]+RSm(STd*3,3)))for j in'-'*K))

未使用のすべてのプレートから均一に選択できるようになり、OPの仕様を維持しながら、さらに1文字分短くなりました。

理論的には、999個のプレートのリストに十分な繰り返しが含まれているため、トリミングされたセットが200未満になる可能性があります。しかし、そのオッズは無限に小さくなります。10回の試行で、私が得た最小の長さは994でした。

編集:999をK(1000のpyg)に変更し、bitpwnerのアドバイスで2つの文字を保存しました。


1
許可されていない値を除外しましたか?KKKまたは666はどこにも表示されません。
ベクトル化

5
@bitpwner:0〜5の数字とA〜Jの文字のみを使用しているため、許可されない値は発生しません。
エミリオM Bumachar 14

非常に賢い!他の人を使う必要があると言う人はいませんでした。いいね
ドゥイツシュミット

1
OPは、ランダム性が「未使用の法的ナンバープレートからランダムに均一に選択される」ことに同意しました。問題のコメントを参照してください。ユニフォームの定義があらゆる範囲からのユニフォームを意味しない限り。また、999をKに変更して、u 2文字節約できます。
2014

3
生成することは不可能であり、有効なプレートがあるかどうわからない私は...ランダムで出力をカウントしたい
Alconja

5

Mathematica、182バイト

うーん、これは長い

l={};While[Length[l=Union@Pick[l,StringFreeQ[l,"ASS"|"666"|"69"|"KKK"|"SHT"]]]<200,AppendTo[l,RandomSample[FromCharacterCode/@{48+9~(r=RandomInteger)~3,65+25~r~3}]~Riffle~"-"<>""]];l

非ゴルフ

l = {};
While[
  Length[
    l = Union@
      Pick[l, StringFreeQ[l, "ASS" | "666" | "69" | "KKK" | "SHT"]]
  ] < 200,
  AppendTo[l, 
   RandomSample[
      FromCharacterCode /@ {48 + 9~(r = RandomInteger)~3, 
        65 + 25~r~3}]~Riffle~"-" <> ""]
  ];
l

とても簡単です。ランダムなプレートを生成し、200が見つかるまで重複および禁止されたプレートを除外します。


5

GolfScript(98文字)

260{3?}:^~,{.10^+`-3>'-'+\10^/26^+26base(;{65+}%+.-1%}%{'ASSKKKSHT66669'3/{1$\?)!},*},{,^^rand}$n*

これは、いくつかのいベース変換とそれに続くフィルタリングを使用して、可能なすべてのナンバープレートをランダムな順序で生成します。たくさんあるので、すぐに実行されるとは思わないが、実行時間に制限はない。


4

JavaScript(ES6)-213

おそらく改善できるでしょう。Firefoxコンソールでテスト済み。

console.log()テストする場合は、そのアラートをに変更します

r=x=>~~(Math.random()*x)+'';l=x=>[...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'][r(26)];a=[];while(a.length<200)p=r(10)+r(10)+r(10)+'-'+l()+l()+l(),!/ASS|666|69|KKK|SHT/.test(p)&&a.indexOf(p)<0&&a.push(p);a.forEach(x=>alert(x))

うわー、それは私が今まで見た中で最長のコード行でなければなりません。
DatEpicCoderGuyWhoPrograms

2
@DatEpicCoderGuyWhoProgramsあなたは明らかに私の400+文字の単一行JS正規表現を見ていません;)
エリックラガーグレン14

それのような音が書き込みに苦痛だっただろうと@eric_lagergren ...
DatEpicCoderGuyWhoPrograms

3
@DatEpicCoderGuyWhoPrograms複数行にわたって記述し、不要な空白を削除できます。jsファイルサイズを削減し、帯域幅を節約するために、その他の短縮(関数/ varなどの名前の置き換え)を提供するオンラインサービスが複数あります。
SBoss 14

1
@DatEpicCoderGuyWhoProgramsはその後最適化します。ずっと簡単P:私は正しく、私がしようとすると、ショートカットを見つけ、その後、私はようやく私のコードを最適化し、問題を解決する方法を見つけ出す
エリックLagergren

4

ルビー- 136の 133 129文字

恐ろしいです。ただし、改善の余地があると考えてください。irbまたはにコードをドロップしてpryEnterキーを押すだけで実行できます。

f=->*t{[0,1,2].map{t.sample}*''}
g=->l{(a=f[*?A..?Z]+?-+f[*?0..?9];l|=[a]if/69|666|ASS|SHT|KKK/!~a)until l.size>199;l}
puts g[[]]

4

ルビー、127文字

「読み取り可能な」Rubyバージョンでの私の試み:

a=[]
until a.size==200 do
  p="#{rand(899)+100}-#{('A'..'Z').to_a.sample(3).join}"
  a<<p unless p=~/69|666|ASS|SHT|KKK/
end
puts a

これにより、準拠したナンバープレートが生成されますが、可能なプレートのセット全体は生成されません(これらの回答のほとんどと同様)。それは要件ではないようです。
マークトーマス14

4

Python 2.7-258文字

私はプロのプログラマーでも何でもないので、結果に満足していると思います。

import random as o
r=o.randint
t,j,k=[],0,""
b=["SHT","KKK","ASS","69","666"]
for i in range(200):
 l,j=b[0],b[4]
 while any(w in l for w in b):
  l,j="",""
  for i in range(3):
   l+=chr(r(65,90))
   j+=str(r(0,9))
 t.append(l+'-'+j)
print "\n".join(set(t))

ファイルサイズは4.0 Kで、python file.py


それpassではないcontinueですか?また、4の代わりに1スペースでインデントすることにより、一部の文字を保存することもできます。
Cristian Ciupitu 14

また、for i in range(0,200):に置き換えることもできますfor i in range(200):
クリスチャン・シウピトゥ14

@CristianCiupitu continue.. を使用したときに200をすべて実行することはできませんでしたpassが、トリックを実行しました。さらに、短いです。そして、私が試みたときfor i in range(200)、それは199 ^^だけでした。duplicates変数を作成し、リスト/文字列内のオカレンスをduplicates += 1前に入れpassてカウントすることで-、後でカウントしました。
アダム14

@CristianCiupitu range(200)は結局動作しました-コードブロック内の4つのスペースは実際に\tあり、それらを1つのスペースに置き換えても文字数は変わりませんでした...提案をありがとう!
アダム14

1
ユーザーは提案された編集で、if k in t: pass何もしないため、単に削除することを提案しました。
ドアノブ

3

パイソン-208

こんにちは、ナンバープレートの生成で私の刺し傷です。このソリューションは@bitpwnerのソリューションと似ていますが、文字列モジュールを使用せず、ナンバープレートのリストの代わりにセットを使用することを選択しました。

import random as r,re
f=r.randint
l=lambda x:chr(f(65, 90))if x else`f(0,9)`
d=set()
while len(d)<200:
 k=f(0,1);j=1-k;c=l(k)+l(k)+l(k)+'-'+l(j)+l(j)+l(j)
 if not(re.search("666|69|ASS|KKK|SHT",c)):d.add(c)

サンプル出力:

set(['DQJ-641', '086-QRY', '981-GAZ', 'UHN-718', '114-VMI', 'GLO-887',  ...

3

Python、252バイト

これが私の貢献です。私はそれに感銘を受けましたが、私は他の人がpythonでより良くやったことを知っています。

from random import randint as r
f=()
while len(f)<200:
 t=str(r(0,999))
 if not("666" in t or "69" in t):
  u=''.join(chr(r(65,90)) for _ in [1,2,3])
  if not("KKK" in u or "SHT" in u or "ASS" in u):f+=("%s-%s"%(t.zfill(3),u),)
 f=tuple(set(f))
print f

2

パイソン-165

それらのインポート...

import random as r,re
j="666|69|ASS|KKK|SHT"
t=r.randint
while len(j)<2e3:
 exec"x="+"chr(t(0,25)+65)+"*3+"'-'"+"+`t(0,9)`"*3
 if not re.search(j,x):print x;j+='|'+x

数字またはアルファベットのいずれかでランダムに開始する必要がある場合、これは本当に必要ではないと思いますが、190。

import random as r,re
j="666|69|ASS|KKK|SHT"
t=r.randint
while len(j)<2e3:
 exec"x="+"chr(t(0,25)+65)+"*3+"'-'"+"+`t(0,9)`"*3
 x=x[::r.choice((-1,1))]
 if not re.search(j,x):print x;j+='|'+x

文字またはバイト?
DatEpicCoderGuyWhoPrograms 14


私は208文字を数えますが、あなたのソリューションは最初に数字を許可しますか?
ウィレム14

@willemインデントの4つのスペースは、実際にはタブであり、アルファベットのみが最初です。
ベクトル化された14

2

PHP 341 324 320

私ができる最高だった。

<?$a="p";$b=fopen($a,'a+');while($c<200){$d=rand(100,999);$e='';for($f=0;$f<3;++$f)$e.=chr(rand(65,90));$g=(rand(1,2)==1)?"$d-$e":"$e-$d";$h=array('ASS','666','69','kkk','SHT');$i=1;foreach($h as $j)!preg_match("/$j/",$g)?:++$i;if($i==1){$k=fread($b,filesize($a));if(!strpos($k,$g)){fwrite($b,$g);echo"$g<br />";++$c;}}}

コードを実行するには、.phpファイルとして保存し、任意のWebサーバーでそれを参照します。ブラックリストファイルp.txtがまだ存在しない場合、作成しようとします。ただし、ルートアクセスがない場合は、完全なサーバーパスで定義する必要があります。

コード自体はここでゴルフ化前です:

<?
// create random plate
// check it does not break rules
// check is not on all time blacklist file
// Add to blacklist file
// Output to screen

// open file handle
$file = "p"; // filename and path if not root access
$fh = fopen($file, 'a+');

// do 200
while($x<200) {

    // get random number
    $rand_number = rand(100,999);

    // get random letters
    $letters = '';
    for($y=0; $y<3; ++$y) $letters .= chr(rand(65,90));


    // mix up combination
    $string = (rand(1,2)==1) ? "$rand_number-$letters" : "$letters-$rand_number";

    // assume is ok
    $ok = 1;

    // Set checks to be excluded on new plates.
    $checks = array('ASS','666','69','kkk','SHT');

    // do the exclusions
    foreach ($checks as $check) !preg_match("/$check/", $string) ? : ++$ok;


    // if all ok, check is not on the blacklist
    if($ok == 1) {

        // read blacklist
        $blacklist = fread($fh, filesize($file));

        // if not on blacklist, add it to file, echo it to output, increment counter
        if (!strpos($blacklist, $string)) {
            fwrite($fh, $string);
            echo "$string<br />";
            ++$x;
        }
    }
}

私はそれを得ることができる限り短かった:-(

サンプル出力

XWU-888
PUD-534
355-QXG
WDE-402
113-QID
362-YBW
TBK-594
939-XDT
148-ARZ
838-ICY
723-ZDA
.... does exactly 200 new plates.

編集:短い形式を使用するifステートメントをいくつか整理しました。


プレートは混合アップする必要がない場合-つまりは数字のみの文字することができ、私はこのライン失う可能性があります $string = (rand(1,2)==1) ? "$rand_number-$letters" : "$letters-$rand_number";
ポールDrewett

1
1文字のファイル名(たとえば、p.txtの代わりにp)を使用して、4文字も保存できます。
マーク14

@Markそれができるとは知らなかった。それをテストし、問題なく動作しました。ファイル拡張子を読んでみて、私が思っていたほどうまく機能しない。ありがとう、それはとても面白かった。
ポールドリューエット14

1

Delphi、161バイト

これについての私の見解を以下に示します。ナンバープレートをラインフィードせずにstdoutに出力します。LFが必要な場合(ルールで指定されていない場合)、それよりも4バイト余分に追加されます。

ゴルフバージョン:

var S,L:string;begin repeat Str(100+Random(69),S);S:=S+'-';while Length(S)<7do S:=S+Chr(65+Random(10));if Pos(S,L)=0then L:=L+S;until Length(L)>1393;Write(L)end.

ゴルフをしていない:

var
  S, L: string;
begin
  repeat
    Str(100 + Random(69), S); // generate and add first three numbers
    S := S + '-'; // add dash
    while Length(S) < 7 do // generate and add last three letters
      S := S + Chr(65 + Random(10));
    if Pos(S, L) = 0 then // check if its not in the L string and add it
      L := L + S;
  until Length(L) > 1393; // exit loop once L string has more than 1393 chars (199 * 7 = 1393)
  Write(L); // output L to stdout
end.

実行方法:

app.exe > plates.txt

1

PHP、267

これは私が手に入れることができるほど短いものです。

<?php $g=file("p",2)?:[];$b=["ASS","666","KKK","SHT"];for($i=0;$i<200;){$m="A";$n=rand(702,18277);for($j=0;$j<$n;$j++){$m++;}$m.=-rand(100,999);if(!(strpos($m,"69")|in_array($m,$b)|in_array($m,$g))){$g[]=$m;echo"$m\n";$i++;}}file_put_contents("p",implode("\n",$g));?>

プレートはファイル「p」に保存されます。

<?php
$g=file("p",2)?:[]; // Read existing plates
$b=["ASS","666","KKK","SHT"]; // Don't generate these
for($i=0;$i<200;){ // 200 plates
    $m="A"; // Base letter
    $n=rand(702,18277); // 3 random letters
    for($j=0;$j<$n;$j++){$m++;} // Increment until letters are reached (SLOW, but short)
    $m.=-rand(100,999); // Add a dash and three numbers
    if(!(strpos($m,"69")|in_array($m,$b)|in_array($m,$g))){ // Check that it's valid and unused
        $g[]=$m;echo"$m\n";$i++; // Echo it, add it to used array and increment counter
    }
}
file_put_contents("p",implode("\n",$g)); // Save the plates
?>

1

R、229文字

これは改善されると確信しています:

l=function(x)paste0(sample(x,3,r=T),collapse="")
a=function()c(l(LETTERS),l(0:9))
A=list()
for(i in 1:200)while(any(sapply(c("ASS","666","69","KKK","SHT"),grepl,A[[i]]<-a()))|A[i]%in%A[-i])A[[i]]=a()
lapply(A,paste,collapse="-")

コンソールで実行し、ナン​​バープレートのリストを印刷します。


1

コブラ-198

class P
    def main
        l,r=[],Random()
        while l.count<200
            a,b=r.next(1000),''
            for i in 3,b+='[r.next(65,91)to char]'
            if not ('69'in'[a]'or 666==a or b in'ASS KKK SHT'),l+=['[a]-'+b]
        print l

1

ECMAScript 6- 155 168 158

警告:200のアラートダイアログ(変化alertへのconsole.logテストへ)

for(i=0,s={},r=Math.random,l=x=>String.fromCharCode(65+r()*26);i<200;)/ASS|666|69|KKK|SHT/.test(p=(r()+'-'+l()+l()+l()).slice(-7))?0:s[p]=s[p]||(alert(p),i++)

編集:おっと。オリジナル版の印刷複製...

編集2:元のスコアにより近い-セットから連想配列に切り替え、いくつかのひどい重複チェックを行い、そのまま印刷できるようにしました

Firefoxコンソールでテスト済み。


ソリューションの改善おめでとうございます
ウィリアムバルボサ14

で「構文エラー」が発生しますl=x=>String.fromCharCode(65+r()*26);。私は何が起こっているのか分からないと思うl=x=>...
ケビンフェガン14

@KevinFegan-あなたはFirefoxを使用していないと思います... f=a=>bは基本的に略記でfunction f(a) { b }あり、現時点ではFirefoxでのみサポートされているES6の機能です。
アルコニャ14

はい、IE 9を使用していますが、ここでは間違いなく動作しません。Firefoxで試してみます。ありがとう。
ケビンフェガン14

1

JavaScript(ES6)184

いつものように、FireFoxコンソールでテストし、200回押すように変更alertするconsole.logか、押す準備をしescapeます。

R=x=>Math.random()*++x|0
for(l='ABCDEFGHIKJLMNOPQRSTUVWXYZ',i=0,u={};i<200;)
!(/69|666|ASS|SHT|KKK/.test(k=l[R(25)]+l[R(25)]+l[R(25)]+'-'+R(9)+R(9)+R(9))&u[k])&&alert(k,u[k]=++i);

:私はコンソールについては知らないが、Firefoxはそれらを無効にするには、提供を開始する前に、Webページは、わずか5つの無料アラートを許可されていmxr.mozilla.org/mozilla-central/...
ニール・

@Neilはもちろんですが、無効化の申し出は無効化ではありません。200(またはそれ以上のcodegolf.stackexchange.com/a/32278/21348)のポップアップを楽しんではいけませんか?
edc65 14

1

Python3、257文字

import string as X,re,random as R
I=[0,1,2]
s={}
while len(s)<200:
 L=R.sample([[R.choice(X.digits) for i in I],[R.choice(X.ascii_uppercase) for i in I]],2);L=''.join(L[0]+['-']+L[1])
 if re.search('ASS|KKK|SHT|69|666',L) or L in s:continue
 print(L);s[L]=0

サンプル出力:

# python3 shortened.py
EUN-215
546-SIL
464-ZTR
XIX-794

1
;代わりに5行目と6行目を区切ることにより、バイトを節約できます\n
地下

@undergroundmonorail、あなたは正しい、ありがとう!
クリスチャン・シウピトゥ14

1

PHP、167

while(count($a)<200){$c="";for(;++$y&3;)$c.=chr(rand(65,90));$d=rand(100,999);$c=rand()&1?"$d-$c":"$c-$d";preg_match("/ASS|666|69|KKK|SHT/",$c)||$a[$c]=1;}print_r($a);

それは現在のPHPの最高よりも100文字少ないです:)

while(count($a)<200)
{
    $c="";
    for(;++$y&3;) $c.=chr(rand(65,90));
    $d=rand(100,999);
    $c=rand()&1?"$d-$c":"$c-$d";
    preg_match("/ASS|666|69|KKK|SHT/",$c)||$a[$c]=1;
}
print_r($a);

あなたがそれを好き願っています。許可されている場合:

while(count($a)<200){$c="";for(;++$y&3;)$c.=chr(rand(65,90));$c.=-rand(100,999);preg_match("/ASS|666|69|KKK|SHT/",$c)||$a[$c]=1;}print_r($a);

141文字のみですが、文字と数字をシャッフルしません。どんな提案も歓迎します:)


1

F#、264文字

実際にはゴルフ用に設計された言語ではありませんが、これは改善されると確信しています。Seq.existsをラムダで使用すると、多くのかっこや暗黙的な変換の欠如と同様に、かなり面倒です。

再帰を使用して、永久に継続します。

let g=System.Random()
let c()=char(g.Next(65,90))
let k(i:string)l=Seq.exists(fun e->i.Contains(e))l
let rec p d:unit=
 let l=sprintf"%i-%c%c%c"(g.Next(100,999))(c())(c())(c())
 if k l d||k l ["ASS";"666";"69";"KKK";"SHT"]then p d else
  printfn"%s"l
  p(l::d)
p[]

FSIで実行できます。


1

Python 203

これが技術的に重要かどうかはわかりませんが、気に入ったので、とにかく投稿しています。他のほとんどの人がそうであったように、私は答えを擬似ランダムに生成しますが、無効な答えが出力に収まらないように、ランダムなシードを戦略的に選びました。そのため、実際には、無効な回答も生成せずに、有効な回答のセット全体を生成することはできません。

from random import*;seed(1);L='ABCDEFGHIJKLMNOPQRSTUVWXYZ';D='0123456789';C=choice
for i in 'x'*200:s=randint(0,1);a=''.join(C(L)for _ in'000');b=''.join(C(D)for _ in'000');i=[a,b];print i[s-1]+'-'+i[s]

1

Perl-123文字

while(@p<200){$l=(AAA..ZZZ)[int rand 999]."-".(100+int rand 899);@p=grep!/ASS|666|69|KKK|SHT|$l/,@p;push@p,$l}$,=$/;print@p

ゴルフをしていない:

while(@p < 200){ # Repeat until we get 200 plates
    $l = (AAA..ZZZ)[int rand 999]."-".(100+int rand 899); # generate the license plate
    @p = grep !/ASS|666|69|KKK|SHT|$l/, @p; # remove disallowed license ones and duplicates
    push @p, $l # add a license plate
}
$,=$/; # so they print with newlines
print @p # print the plates

誰かがそれをさらにゴルフするアイデアを持っているなら、私に知らせてください、私は興味があります。コードの一部についてさらに説明が必要な場合は、コメントを残してください。さらに説明させていただきます。


1

Javascript-283 327文字

編集:

Alconjaからの提案を実装した後、ここに私の新しいバージョンがあります。

m=Math.random;function y(v){return "ASS|KKK|SHT|666".indexOf(v)<0&&v.indexOf("69")<0?0:!0}function c(){return String.fromCharCode(m()*26+65)}for(i=0;i<200;i++){do {do {n=(m()+"").slice(2,5)}while(y(n));do {l=c()+c()+c()}while(y(l));r=l+"-"+n}while(o.indexOf(r)>=0);o+=r+"\n"}alert(o)
/* 1 line - 283 Characters */

1)変数:sを削除し、リテラルを使用: "\ n" [-4] [323]
2) "var o =" "、i、r、n、l、" [-17] [306]
3)削除Variable:tおよびuse literal: "ASS | KKK | SHT | 666" [-4] [302]
4)m = Math.randomを設定し、代わりに "m"を使用[-7] [296]
5)(m( m()。toString()ではなく)+ "")[-6] [290]
6)不要な「;」を削除 [-7] [283]



旧バージョン:Javascript-327文字

改善の余地があると確信しています...コードゴルフはかなり経験が浅いです:

var o="",s="\n",i,r,n,l,t="ASS|KKK|SHT|666";function y(v){return t.indexOf(v)<0&&v.indexOf("69")<0?0:!0;}function c(){return String.fromCharCode(Math.random()*26+65);}for(i=0;i<200;i++){do {do {n=Math.random().toString().slice(2,5);}while(y(n));do {l=c()+c()+c();}while(y(l));r=l+"-"+n;}while(o.indexOf(r)>=0);o+=r+s;}alert(o);    
/* 1 line - 327 Characters */


「未縮小」変数/関数名を使用したフォーマット済みの「Ungolfed」バージョンを次に示します。

var outp="",lsep="\n",ndx,res,nbr,ltr,tbl="ASS|KKK|SHT|666";
function fnvfy(vinp){
  return tbl.indexOf(vinp)<0&&vinp.indexOf("69")<0?0:!0;
}
function fnchr(){
  return String.fromCharCode(Math.random()*26+65);
}
for(ndx=0;ndx<200;ndx++){
  do {
    do {
      nbr=Math.random().toString().slice(2,5);
    }
    while(fnvfy(nbr));
    do {
      ltr=fnchr()+fnchr()+fnchr();
    }
    while(fnvfy(ltr));
    res=ltr+"-"+nbr;
  }
  while(outp.indexOf(res)>=0);
  outp+=res+lsep;
}
alert(outp);



これは、ブラウザのお気に入り/ブックマークのURLに貼り付けることができる「デバッグ」バージョンです。出力は、「alert()」ではなく、新しい「ウィンドウ」上の「TEXTAREA」に配置されます。

javascript:(function(){var outp="",lsep="\n",ndx,res,nbr,ltr,tbl="ASS|KKK|SHT|666";function fnvfy(vinp){return tbl.indexOf(vinp)<0&&vinp.indexOf("69")<0?0:!0;}function fnchr(){return String.fromCharCode(Math.random()*26+65);}for(ndx=0;ndx<200;ndx++){do {do {nbr=Math.random().toString().slice(2,5);}while(fnvfy(nbr));do {ltr=fnchr()+fnchr()+fnchr();}while(fnvfy(ltr));res=ltr+"-"+nbr;}while(outp.indexOf(res)>=0);outp+=res+lsep;}var x=window.open();x.document.write('<head>\n</head>\n<body>\n<form name=sa><textarea name=t rows=25 cols=80 wrap>'+outp+'</textarea><br />\n</body>\n');x.document.close();})()
/* */

フォーマットされた「デバッグ」バージョンは次のとおりです。

javascript:
(function(){
  var outp="",lsep="\n",ndx,res,nbr,ltr,tbl="ASS|KKK|SHT|666";
  function fnvfy(vinp){
    return tbl.indexOf(vinp)<0&&vinp.indexOf("69")<0?0:!0;
  }
  function fnchr(){
    return String.fromCharCode(Math.random()*26+65);
  }
  for(ndx=0;ndx<200;ndx++){
    do {
      do {
        nbr=Math.random().toString().slice(2,5);
      }
      while(fnvfy(nbr));
      do {
        ltr=fnchr()+fnchr()+fnchr();
      }
      while(fnvfy(ltr));
      res=ltr+"-"+nbr;
    }
    while(outp.indexOf(res)>=0);
    outp+=res+lsep;
  }
  var x=window.open();
  x.document.write('<head>\n</head>\n<body>\n<form name=sa><textarea name=t rows=25 cols=80 wrap>'+outp+'</textarea><br />\n</body>\n');
  x.document.close();
}
)()

2
あなたの実際のアルゴリズムに触れることなく、ここにいくつかの一般的なjavascriptゴルフのヒントがあります:Javascriptは本質的に悪い構文で寛容なので、使用する必要はありませんvar(ただ割り当てるだけでいい、323)、;次のステートメントがない限りs は必要ありません(たとえば、行の最後の文字、または}316の前)、単なるインライン(たとえば、s変数、312)よりも宣言/使用により多くのスペースを必要とするものに注意してください。。(例えば一度Math.random(...)r=Math.random ... r(...)307(x+"")より短い場合x.toString()300
Alconja

@Alconja-助けてくれてありがとう。サイズを44文字減らすことができました。
ケビンフェガン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.