Buatkan saya beberapa plat yang sesuai!


15

Skenario: Anda adalah perancang perangkat lunak yang bekerja untuk perusahaan yang dikelola pemerintah yang mendesain plat nomor untuk mobil dan kendaraan lain. Anda telah diminta untuk mengembangkan perangkat lunak yang menghasilkan plat nomor. Sebelum Anda mulai bekerja, atasan Anda menetapkan aturan dasar ini.


Pelat nomor tidak boleh mengandung:

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

Aturan dan persyaratan:

  • Plat nomor harus dibuat secara acak.
  • Setelah plat nomor acak dibuat, plat nomor yang sama tidak dapat dibuat lagi.
  • Anda harus mengeluarkan setidaknya 200 plat nomor unik . Anda dapat menghasilkan lebih banyak jika Anda mau .
  • Anda dapat menyimpan piring yang dihasilkan dalam file untuk "mengingat" mereka.
  • Plat nomor berisi 2 bagian, satu berisi hanya tiga huruf, dan satu berisi hanya tiga angka, dipisahkan oleh tanda hubung, seperti ini: 233-ADFatau ADF-233.
  • Anda hanya dapat menggunakan angka dan huruf kapital.
  • Plat nomor bisa ditulis ke stdout, atau file.
  • Setiap "sisi" plat akan berisi tiga angka atau huruf.
  • Ini adalah , sehingga jawaban tersingkat, paling populer, menang. Pemenang akan dipilih setelah tujuh hari.

Aturan umum

  • Jawaban harus mencakup, tetapi tidak terbatas pada, yang berikut ini.
  • Nama bahasa.
  • Jumlah karakter.
  • Ukuran file.
  • Bagaimana kode dijalankan.
  • Kode itu sendiri.
  • Contoh: Python 234 chars atau Python 23mb .

Jika saya perlu mengklarifikasi detail tambahan, harap sebutkan di komentar dan saya akan menambahkannya ke posting saya. Bagaimanapun, semoga berhasil, dan buatkan saya beberapa plat nomor yang sesuai!


Pembaruan 1: Pemenang akan dipilih sedikit lebih awal.

Ternyata saya harus melakukan perjalanan segera, jadi saya akan memilih pemenang sekitar 00:00 UTC, 25 Juli. Setelah pemenang dipilih, Anda masih dapat mengirimkan barang, hanya tahu bahwa pemenang telah dipilih. Bai.


Perbarui 2: Pemenang!

Kami memiliki pemenang! Yay! Keju dan anggur untuk semua orang yang berpartisipasi! Inilah yang menang.

  • Posisi Pertama: Àngel - Bash (95 karakter)
  • Posisi Kedua: Martin Büttner - Mathematica (182 bytes)
  • Posisi Kedua: Emilio M Bumachar - Pyg (92?)
  • Posisi Kedua: Peter Taylor - Golfscript (98 karakter)
  • Posisi Ketiga: Mark Thomas - Ruby (127 karakter)

Wow, tiga ikatan tempat kedua. Wow. Kompetisi telah berakhir, tetapi silakan kirimkan entri jika Anda mau. Bai!



2
" Setelah plat nomor acak dibuat, plat nomor yang sama tidak dapat dibuat lagi. " Bagaimana dengan pelat nomor non-acak?
Peter Taylor

4
Cara yang jelas untuk melakukan ini (dan mungkin cara kerjanya dalam kehidupan nyata) adalah menghasilkan angka-angka secara berurutan.
Peter Taylor

5
"Dibuat secara acak" tidak tepat. Saya kira maksud Anda adalah "dipilih secara acak secara acak dari pelat lisensi hukum yang tidak digunakan" daripada, katakanlah, yang dipilih secara acak dari pelat lisensi resmi yang dimulaiAAA-
Peter Taylor

1
tolong beri tahu berapa digit yang harus ada di setiap piring, dan karakter apa yang valid - bervariasi dari satu negara ke negara lain
bangga haskeller

13
Saya sekarang agak tergoda untuk menulis sebuah program untuk menghasilkan plat nomor acak yang berisi beberapa string cabul atau tidak pantas tidak ditemukan dalam daftar Anda.
Ilmari Karonen

Jawaban:


12

bash (95 karakter)

Simpan skrip seperti mdalam folder di PATH Anda dengan set bit eksekusi.

Jalankan sebagai bash m. Pelat disimpan dalam file hal

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

Ini sama dengan menjalankan yang berikut ini:

# 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 

Peringatan: Final mseharusnya benar-benarexec m (+5 karakter) untuk menghindari meninggalkan proses menunggu penyelesaian (tetapi Anda dapat memiliki ribuan tanpa banyak masalah)

Kredit diberikan kepada http://www.cyberciti.biz/faq/linux-random-password-generator/ untuk gagasan menggunakantr -dc


Apakah itu untuk saya atau persyaratan keunikan tidak ada?
Cristian Ciupitu

1
@ Cristian-Ciupitu: Ini grep -vmengecualikan daftar hitam dan daftar pelat yang telah kami hasilkan ( grepdiharapkan p mengandung satu pola per baris, tetapi karena pelat tidak mengandung metakarakter ekspresi reguler, mereka hanya cocok dengan diri mereka sendiri). Kami hanya menghasilkan satu atau nol pelat per iterasi, jadi setelah setiap iterasi daftar lengkap (yang diperbarui) untuk dikecualikan akan dibaca oleh grep. : D
Ángel

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

Sekarang dapat memilih secara seragam dari semua pelat yang tidak digunakan, mempertahankan spesifikasi OP, sementara lebih pendek dengan 1 karakter lebih.

Secara teori dimungkinkan bahwa daftar 999 piring akan berisi pengulangan yang cukup sehingga himpunan dipangkas akan kurang dari 200. Tetapi kemungkinan itu sangat kecil. Dalam sepuluh percobaan, panjang terendah yang saya dapatkan adalah 994.

EDIT: berubah 999 menjadi K (yang merupakan pyg untuk 1000), untuk menghemat dua karakter atas saran dari bitpwner.


1
Apakah Anda memfilter nilai yang tidak diizinkan? Tidak melihat KKK atau 666 di mana pun.
Vektor

5
@bitpwner: Saya hanya menggunakan angka dari 0 hingga 5 dan huruf dari A ke J, sehingga nilai yang dilarang tidak dapat terjadi.
Emilio M Bumachar

Sangat pintar! Tidak ada yang pernah mengatakan bahwa yang lainnya harus digunakan. Bagus.
Kjeld Schmidt

1
OP setuju untuk keacakan "dipilih secara seragam secara acak dari pelat lisensi hukum yang tidak digunakan". Lihat komentar yang dipertanyakan. Kecuali jika definisi Anda tentang seragam berarti seragam dari rentang apa pun. Dan Anda dapat mengubah 999 menjadi K, menghemat u 2 karakter.
Vektor

3
Tidak yakin saya akan menghitung output secara acak jika ada pelat yang valid yang tidak mungkin dihasilkan ...
Alconja

5

Mathematica, 182 byte

Ugh, ini panjang

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

Tidak disatukan

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

Cukup mudah. Menghasilkan piring acak, dan menyaring duplikat dan yang terlarang sampai 200 ditemukan.


5

GolfScript (98 karakter)

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

Ini menghasilkan semua pelat lisensi yang mungkin dalam urutan acak menggunakan beberapa konversi basis jelek diikuti dengan penyaringan. Ada banyak dari mereka, jadi jangan berharap untuk mengeksekusi dengan cepat, tetapi pertanyaannya tidak menempatkan kendala pada waktu eksekusi.


4

JavaScript (ES6) - 213

Mungkin bisa diperbaiki. Diuji pada Konsol Firefox.

Ubah lansiran itu ke console.log()jika Anda ingin menguji

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

Wow, itu harus menjadi baris kode terpanjang yang pernah saya lihat.
DatEpicCoderGuyWhoPrograms

2
@DatEpicCoderGuyWhoPrograms Anda jelas belum melihat 400 + char saya satu-line JS regex;)
Eric Lagergren

@ eric_lagergren Kedengarannya seperti itu akan sulit untuk menulis ...
DatEpicCoderGuyWhoPrograms

3
@DatEpicCoderGuyWhoPrograms Anda dapat menuliskannya di beberapa baris lalu menghapus spasi putih yang tidak perlu. Ada beberapa layanan online yang menawarkan + pemendekan lainnya (menggantikan fungsi / var dll. Nama) untuk mengurangi ukuran file js dan selanjutnya menghemat bandwidth.
SBoss

1
@DatEpicCoderGuyWhoPrograms mengoptimalkan setelah itu. Saya mencari cara untuk menyelesaikan masalah dengan benar, kemudian saya mencoba dan menemukan cara pintas, dan akhirnya saya mengoptimalkan kode saya: P jauh lebih sederhana
Eric Lagergren

4

Ruby - 136 133 129 karakter

Mengerikan. Tapi berpikir ada ruang untuk perbaikan. Cukup masukkan kode irbatau prydan tekan enter untuk menjalankan:

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

Ruby, 127 karakter

Upaya saya pada versi Ruby yang "dapat dibaca":

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

Perhatikan bahwa ini menghasilkan pelat lisensi yang sesuai , tetapi tidak akan menghasilkan seluruh rangkaian pelat yang mungkin (seperti pada sebagian besar jawaban ini). Itu tampaknya tidak menjadi persyaratan.
Mark Thomas

4

Python 2.7 - 258 karakter

Saya bukan programmer profesional atau apa pun, jadi saya katakan saya puas dengan hasilnya.

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

Filesize adalah 4.0 K, jalankan dengan python file.py!


Bukankah itu passseharusnya continue? Anda juga dapat menghemat beberapa karakter dengan membuat indentasi dengan spasi 1 bukannya 4.
Cristian Ciupitu

Juga for i in range(0,200):bisa diganti dengan for i in range(200):.
Cristian Ciupitu

@CristianCiupitu Saya tidak bisa membuatnya melakukan 200 penuh saat menggunakan continue.. Tapi passlakukan triknya. Plus, lebih pendek. Dan ketika saya mencoba for i in range(200), itu hanya 199 ^^ Saya menghitungnya setelah itu dengan membuat duplicatesvariabel dan meletakkan duplicates += 1sebelum passdan menghitung kejadian -dalam daftar / string.
Adam

@CristianCiupitu range (200) bekerja setelah semua - 4 spasi di blok kode sebenarnya \tdan menggantinya dengan 1 spasi tidak mengubah jumlah karakter ... Terima kasih atas sarannya!
Adam

1
Seorang pengguna menyarankan dalam sunting yang disarankan untuk hanya menghapus if k in t: pass, karena tidak melakukan apa-apa.
Gagang Pintu

3

Python - 208

Hai, inilah tikaman saya pada pembuatan plat nomor. Solusi ini mirip dengan solusi @ bitpwner tetapi tanpa modul string dan alih-alih daftar untuk plat nomor saya memilih untuk menggunakan set dan juga memungkinkan angka terlebih dahulu.

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)

Output sampel:

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

3

Python, 252 byte

Inilah kontribusi saya. Saya terkesan dengan itu, tetapi saya tahu orang lain telah melakukan lebih baik dengan 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

Python - 165

Impor itu ...

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

Jika ada kebutuhan untuk memulai secara acak dengan angka atau huruf, yang menurut saya tidak benar-benar diperlukan, maka 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

Karakter atau byte?
DatEpicCoderGuyWhoPrograms

Bolehkah saya menyarankan PYG? gist.github.com/Synthetica9/9796173
Emilio M Bumachar

Saya menghitung 208 karakter, dan apakah solusi Anda mengizinkan angka terlebih dahulu?
Willem

@willem Empat spasi untuk indentasi sebenarnya adalah tab, dan huruf lebih dulu.
Vektor

2

PHP 341 324 320

Adalah yang terbaik yang bisa saya lakukan.

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

Untuk menjalankan kode, cukup simpan sebagai file .php dan jelajahi di server web mana pun. Ia akan mencoba membuat file blacklist p.txt jika belum ada. Namun Anda mungkin perlu mendefinisikannya dengan jalur server penuh jika Anda tidak memiliki akses root.

Kode itu sendiri ada di sini sebelum golfifikasi:

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

Sesingkat aku bisa mendapatkannya :-(

Output Sampel

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.

EDIT: merapikan beberapa jika pernyataan menggunakan formulir pendek.


Jika lempeng-lempeng itu tidak harus digabungkan - yaitu bisa berupa angka dan huruf saja, saya bisa kehilangan garis ini $string = (rand(1,2)==1) ? "$rand_number-$letters" : "$letters-$rand_number";
Paul Drewett

1
Anda dapat menggunakan nama file karakter tunggal (mis., P, bukan p.txt) dan simpan sendiri 4 karakter.
Markus

@Mark, aku tidak tahu kamu bisa melakukan itu. Mengujinya dan bekerja dengan baik. Baca ekstensi file dan tidak berfungsi seperti yang saya kira. Terima kasih, itu sangat menarik.
Paul Drewett

1

Delphi, 161 byte

Inilah pendapat saya tentang ini. Ini mengeluarkan plat nomor ke stdout tanpa line feed di antara mereka. Jika LF diperlukan (tidak ditentukan dalam aturan), maka itu menambah 4 byte tambahan.

Versi golf:

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.

Tidak Disatukan:

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.

Cara menjalankan:

app.exe > plates.txt

1

PHP, 267

Ini tentang sesingkat yang saya bisa dapatkan.

<?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));?>

Pelat disimpan dalam file "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 karakter

Saya yakin ini bisa diperbaiki:

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="-")

Jalankan di konsol, cetak daftar plat nomor.


1

Cobra - 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

Peringatan : 200 dialog peringatan (ubah alertmenjadi console.loguntuk menguji)

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

Edit : Ups. Versi asli duplikat yang dicetak ...

Sunting 2 : Lebih dekat dengan skor asli sekarang - beralih dari satu set ke array asosiatif dengan beberapa pemeriksaan duplikat yang tipis memungkinkan untuk mencetak saat berjalan

Diuji di konsol Firefox.


Congratulations improving my solution
William Barbosa

I'm getting a "Syntax error" on: l=x=>String.fromCharCode(65+r()*26);. I guess I don't know what's happening with l=x=>...
Kevin Fegan

@KevinFegan - I'm guessing you're not using Firefox... f=a=>b is an ES6 feature that's basically shorthand for function f(a) { b } and it's only(?) supported by Firefox at the moment.
Alconja

Yes, I'm using IE 9, and it definately doesn't work here. I'll try it on Firefox. Thanks.
Kevin Fegan

1

JavaScript (ES6) 184

As usual, test in FireFox console and change alert to console.log or be prepared to press escape 200 times.

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

I don't know about the console, but web pages are only allowed 5 free alerts before Firefox starts offering to disable them: mxr.mozilla.org/mozilla-central/…
Neil

@Neil of course, but offering to disable is not disabling. Shouldn't you enjoy 200 (or more codegolf.stackexchange.com/a/32278/21348) popups?
edc65

1

Python3, 257 chars

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

Sample output:

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

1
You can save a byte by separating line 5 and 6 by ; instead of \n .
undergroundmonorail

@undergroundmonorail, you're right, thank you!
Cristian Ciupitu

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

that's 100 chars less than current PHP's best :)

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

hope you like it. In case it is allowed:

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

is only 141 chars but doesn't shuffle chars and numbers. Any suggestions wellcome :)


1

F#, 264 chars

Not really a language designed for golfing, but I'm sure this could be improved. Using Seq.exists with a lambda is pretty annoying, as are the many parens and lack of implicit conversion.

Uses recursion, keeps going forever.

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[]

Can be run in FSI.


1

Python 203

I'm not sure if this technically counts, but I liked it so I'm posting it anyway. While I do generate the answers pseudo-randomly, as pretty much everyone else did, I strategically picked the random seed such that invalid answers wouldn't end up in the output. So, my answer isn't actually capable of generating the entire set of valid answers, without also generating the invalid ones.

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 Characters

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

Ungolfed:

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

If anyone has ideas to golf it further, let me know, I am interested. If you want further explanation of part of the code, leave a comment and I'd be happy to explain more too.


1

Javascript - 283 327 Characters

Edit:

After implementing the suggestions from Alconja, here's my new version:

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) Remove Variable:s and use literal:"\n" [-4][323]
2) Remove "var o="",i,r,n,l," [-17][306]
3) Remove Variable:t and use literal:"ASS|KKK|SHT|666" [-4][302]
4) Set m=Math.random and use "m" instead [-7][296]
5) Use (m()+"") rather than m().toString() [-6][290]
6) Remove unneeded ";" [-7][283]



Old-version: Javascript - 327 Characters

I'm sure there's some room for improving... I'm pretty inexperienced at Code-golfing:

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 */


Here is a formatted, "Ungolfed" version with "un-minified" variable/function names:

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



Here is a "debug" version that can be pasted into URL of browser favorite/bookmark. Output is placed in a "TEXTAREA" on a new "window" instead of "alert()":

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();})()
/* */

Here is the "debug" version, formatted:

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
Without touching your actual algorithm, here's a few generic javascript golfing tips: Javascript is inherently forgiving with bad syntax, so you don't need to use var (just assigning will do, 323), you don't need ;s unless there's another statement following (eg. the last character in the line, or before a }, 316), watch for anything that takes more space to declare/use than just inline (eg. your s variable, 312), ditto for the reverse if something is used more than once (eg. Math.random(...) to r=Math.random ... r(...), 307, (x+"") is shorter than x.toString(), 300
Alconja

@Alconja - Thanks for the help. I was able to reduce the size by 44 characters.
Kevin Fegan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.