Tạo cho tôi một số biển số xe thích hợp!


15

Kịch bản: Bạn là một nhà thiết kế phần mềm làm việc cho một công ty của chính phủ, chuyên thiết kế biển số cho xe hơi và các phương tiện khác. Bạn đã được yêu cầu phát triển phần mềm tạo biển số xe. Trước khi bạn đi làm, các sếp của bạn đã đặt ra những quy tắc nền tảng này.


Một tấm giấy phép không thể chứa:

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

Quy tắc và yêu cầu:

  • Biển số xe phải được tạo ngẫu nhiên.
  • Khi một tấm giấy phép ngẫu nhiên được tạo ra, cùng một tấm giấy phép có thể được tạo lại.
  • Bạn phải xuất ít nhất 200 biển số xe duy nhất . Bạn có thể tạo thêm nếu bạn muốn .
  • Bạn có thể lưu trữ các tấm được tạo trong một tệp để "ghi nhớ" chúng.
  • Biển số xe có 2 phần, một phần chỉ chứa ba chữ cái và một phần chỉ chứa ba số, cách nhau bằng dấu gạch ngang, như thế này: 233-ADFhoặcADF-233 .
  • Bạn chỉ có thể sử dụng số và chữ in hoa.
  • Biển số xe có thể được ghi vào thiết bị xuất chuẩn, hoặc một tập tin.
  • Mỗi "mặt" của biển số xe sẽ chứa ba số hoặc chữ cái.
  • Đây là một , vì vậy câu trả lời ngắn nhất, phổ biến nhất sẽ thắng. Người chiến thắng sẽ được chọn sau bảy ngày.

Quy tắc chung

  • Trả lời nên bao gồm, nhưng không giới hạn, những điều sau đây.
  • Tên ngôn ngữ.
  • Số lượng nhân vật.
  • Kích thước tập tin.
  • Làm thế nào mã được chạy.
  • Các mã chính nó.
  • Ví dụ: Python 234 ký tự hoặc Python 23mb .

Nếu tôi cần làm rõ bất kỳ chi tiết bổ sung nào, xin vui lòng đề cập đến nó trong các bình luận và tôi sẽ thêm nó vào bài viết của mình. Dù sao, chúc may mắn, và tạo cho tôi một số biển số xe thích hợp!


Cập nhật 1: Người chiến thắng sẽ được chọn sớm hơn một chút.

Hóa ra tôi phải đi sớm, vì vậy tôi sẽ chọn người chiến thắng vào khoảng 00:00 UTC, ngày 25 tháng 7. Sau khi người chiến thắng được chọn, bạn vẫn có thể gửi bài dự thi, chỉ cần biết rằng người chiến thắng đã được chọn. Bài.


Cập nhật 2: Người chiến thắng!

Chúng tôi có người chiến thắng! Yay! Phô mai và rượu vang cho tất cả những người tham gia! Đây là người chiến thắng.

  • Vị trí số 1: Àngel - Bash (95 ký tự)
  • Vị trí thứ 2: Martin Büttner - Mathematica (182 byte)
  • Vị trí thứ 2: Emilio M Bumachar - Pyg (92?)
  • Vị trí thứ 2: Peter Taylor - Golfscript (98 ký tự)
  • Vị trí thứ 3: Mark Thomas - Ruby (127 ký tự)

Wow, ba mối quan hệ vị trí thứ hai. Ồ Cuộc thi đã kết thúc, nhưng vui lòng gửi bài dự thi nếu bạn muốn. Bài!



2
" Một khi biển số ngẫu nhiên được tạo ra, cùng một biển số xe có thể được tạo lại. " Còn biển số không ngẫu nhiên thì sao?
Peter Taylor

4
Cách rõ ràng để làm điều này (và có lẽ là cách nó hoạt động trong cuộc sống thực) là tạo ra các số theo thứ tự.
Peter Taylor

5
"Tạo ngẫu nhiên" là không chính xác. Tôi cho rằng bạn có nghĩa là "được chọn ngẫu nhiên một cách ngẫu nhiên từ các biển số xe hợp pháp chưa sử dụng" chứ không phải là, được chọn ngẫu nhiên từ các biển số xe hợp pháp bắt đầuAAA-
Peter Taylor

1
vui lòng cho biết có bao nhiêu chữ số trong mỗi tấm và ký tự nào là hợp lệ - nó thay đổi theo từng quốc gia
tự hào

13
Bây giờ tôi hơi muốn viết một chương trình để tạo các biển số ngẫu nhiên có chứa một số chuỗi tục tĩu hoặc không phù hợp không có trong danh sách của bạn.
Ilmari Karonen

Câu trả lời:


12

bash (95 ký tự)

Lưu tập lệnh như mtrong một thư mục trong PATH của bạn với tập bit thực thi.

Chạy như bash m. Các tấm được lưu trữ trong tập tin 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

Điều này tương đương với việc chạy như sau:

# 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 

Hãy mcẩn thận : Trận chung kết thực sự phải là exec m(+5 ký tự) để tránh để lại các quá trình chờ hoàn thành (nhưng bạn có thể có hàng ngàn mà không gặp nhiều vấn đề)

Tín dụng vào http://www.cyberciti.biz/faq/linux-random-password-generator/ cho ý tưởng sử dụngtr -dc


Là nó cho tôi hoặc yêu cầu duy nhất là thiếu?
Cristian Ciupitu

1
@ Cristian-Ciupitu: Không grep -vbao gồm cả danh sách đen và danh sách các tấm mà chúng tôi đã tạo ( grepdự kiến ​​p sẽ chứa một mẫu trên mỗi dòng, nhưng vì các tấm không chứa siêu ký tự biểu thức chính quy, chúng chỉ khớp với nhau). Chúng tôi chỉ tạo một hoặc không một tấm cho mỗi lần lặp, vì vậy sau mỗi lần lặp, danh sách đầy đủ (cập nhật) của các tấm cần loại trừ sẽ được đọc bởi 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))

Bây giờ có thể chọn thống nhất từ ​​tất cả các tấm không sử dụng, theo thông số kỹ thuật của OP, trong khi ngắn hơn 1 ký tự.

Về mặt lý thuyết, có thể danh sách 999 tấm sẽ chứa đủ số lần lặp lại để bộ được cắt sẽ nhỏ hơn 200. Nhưng tỷ lệ của nó là cực kỳ nhỏ. Trong mười thử nghiệm, độ dài thấp nhất tôi nhận được là 994.

EDIT: đã thay đổi 999 thành K (là pyg cho 1000), để lưu hai ký tự theo lời khuyên của bitpwner.


1
Bạn đã lọc ra các giá trị không được phép? Không thấy bất kỳ KKK hoặc 666 ở bất cứ đâu.
Vectorized

5
@bitpwner: Tôi chỉ sử dụng các chữ số từ 0 đến 5 và các chữ cái từ A đến J, vì vậy các giá trị không được phép có thể xảy ra.
Emilio M Bumachar

Rất thông minh! Không ai từng nói những người khác phải được sử dụng. Đẹp.
Kjeld Schmidt

1
OP đồng ý với tính ngẫu nhiên là "được lựa chọn thống nhất ngẫu nhiên từ các biển số xe hợp pháp chưa sử dụng". Xem ý kiến ​​trong câu hỏi. Trừ khi định nghĩa của bạn về đồng phục có nghĩa là đồng phục từ bất kỳ phạm vi. Và bạn có thể thay đổi 999 thành K, tiết kiệm 2 ký tự.
Vectorized

3
Không chắc chắn tôi sẽ tính đầu ra là ngẫu nhiên nếu có các tấm hợp lệ không thể tạo ...
Alconja

5

Toán học, 182 byte

Ừ, cái này dài quá

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

Ung dung

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

Khá đơn giản. Tạo các tấm ngẫu nhiên và lọc ra các bản sao và các tấm bị cấm cho đến khi tìm thấy 200.


5

GolfScript (98 ký tự)

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

Điều này tạo ra tất cả các biển số xe có thể theo thứ tự ngẫu nhiên bằng cách sử dụng một số chuyển đổi cơ sở xấu xí sau đó là lọc. Có rất nhiều trong số chúng, vì vậy đừng hy vọng nó sẽ được thực thi nhanh chóng, nhưng câu hỏi không đặt ra bất kỳ ràng buộc nào về thời gian thực hiện.


4

JavaScript (ES6) - 213

Nó có thể được cải thiện. Đã thử nghiệm trên Firefox Console.

Thay đổi cảnh báo đó thành console.log()nếu bạn muốn kiểm tra

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

Ồ, đó phải là dòng mã dài nhất tôi từng thấy.
DatEpicCoderGuyWhoPrograms

2
@DatEpicCoderGuyWhoPrograms rõ ràng là bạn chưa thấy hơn 400 regex dòng đơn char của tôi;)
Eric Lagergren

@eric_lagergren Nghe có vẻ khó viết ...
DatEpicCoderGuyWhoPrograms

3
@DatEpicCoderGuyWhoPrograms Bạn có thể viết nó qua nhiều dòng sau đó xóa các khoảng trắng không cần thiết. Có nhiều dịch vụ trực tuyến cung cấp + rút ngắn khác (thay thế tên hàm / var, v.v.) để giảm kích thước tệp js và sau đó tiết kiệm băng thông.
SBoss

1
@DatEpicCoderGuyWhoPrograms tối ưu hóa sau đó. Tôi tìm ra cách giải quyết vấn đề một cách chính xác, sau đó tôi thử và tìm các phím tắt, và cuối cùng tôi đã tối ưu hóa mã của mình: P đơn giản hơn rất nhiều
Eric Lagergren

4

Hồng ngọc - 136 133 129 ký tự

Thật gớm ghiếc. Hãy nghĩ rằng có chỗ để cải thiện, mặc dù. Chỉ cần thả mã vào irbhoặc prynhấn enter để chạy:

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 chars

My attempt at a "readable" Ruby version:

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

Note that this generates compliant license plates, but won't generate the entire set of possible plates (as with most of these answers). That doesn't seem to be a requirement.
Mark Thomas

4

Python 2.7 - 258 chars

I'm not a professional programmer or anything, so I'd say I'm satisfied with the result.

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 is 4.0 K, run with python file.py !


Shouldn't that pass be a continue? You can also save some chars by indenting with a 1 space instead of 4.
Cristian Ciupitu

Also for i in range(0,200): could be replaced with for i in range(200):.
Cristian Ciupitu

@CristianCiupitu I couldn't get it to do the full 200 when using continue.. But pass did the trick. Plus, it's shorter. And when I tried for i in range(200), it only did 199 ^^ I counted them afterwards by making a duplicates variable and putting duplicates += 1 before pass and counting the occurrences for - in the list/string.
Adam

@CristianCiupitu range(200) worked after all - the 4 spaces in the code block are actually \t and replacing them by 1 space didn't change the character count... Thanks for the suggestions!
Adam

1
A user suggested in a suggested edit to simply remove if k in t: pass, as it does nothing.
Doorknob

3

Python - 208

Hi heres my stab at license plate generation. This solution is similar to @bitpwner's solution but without the string module and instead of a list for the license plate I chose to use a set and its also allows numbers first.

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)

Sample output:

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

3

Python, 252 bytes

Here's my contribution. I'm impressed with it, but I know others have done better with 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

Those imports...

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

If there is a need to begin randomly with either numbers or alphabets, which I don't think is really needed, then 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

Chars or bytes?
DatEpicCoderGuyWhoPrograms


I count 208 chars, and does your solution allow numbers first?
Willem

@willem The four spaces for indentation are actually tabs, and alphabets first only.
Vectorized

2

PHP 341 324 320

Was the best I could do.

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

To run the code just save as a .php file and browse to it on any web server. It will attempt to create the blacklist file p.txt if it does not exist already. However you may need to define it with a full server path if you do not have root access.

The code itself is here pre golfification:

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

Was as short as I could get it :-(

Sample Output

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: tidied up a couple of if statements to use short form.


If the plates do not have to be mixed up - ie can be numbers then letters only, I could lose this line $string = (rand(1,2)==1) ? "$rand_number-$letters" : "$letters-$rand_number";
Paul Drewett

1
You could use a single-character filename (e.g., p instead of p.txt) and save yourself 4 characters, too.
Mark

@Mark I didn't know you could do that. Tested it and it worked fine. Read up on file extensions and they do not work quite the way I thought they did. Thank you, that was very interesting.
Paul Drewett

1

Delphi, 161 bytes

Here is my take on this. It outputs license plates to stdout without line feed between them. If LF is needed (not specified in the rules), than that adds extra 4 bytes.

Golfed version:

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.

Ungolfed:

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.

How to run:

app.exe > plates.txt

1

PHP, 267

This is about as short as I can get it.

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

Plates are stored in 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 characters

I'm sure this could be improved:

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

Run in the console, prints a list of license plates.


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

Warning: 200 alert dialogs (change alert to console.log to test)

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: Oops. Original version printed duplicates...

Edit 2: Closer to the original score now - switched from a set to an associative array with some fugly duplicate checks allowing it to print as it goes

Tested in Firefox console.


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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.