สร้างแผ่นป้ายทะเบียนที่เหมาะสมให้ฉัน!


15

สถานการณ์: คุณเป็นนักออกแบบซอฟต์แวร์ที่ทำงานให้กับ บริษัท ที่ไม่ได้ทำงานในรัฐบาลที่ออกแบบป้ายทะเบียนรถยนต์และยานพาหนะอื่น ๆ คุณถูกขอให้พัฒนาซอฟต์แวร์ที่สร้างแผ่นป้ายทะเบียน ก่อนที่คุณจะทำงานเจ้านายของคุณได้วางกฎพื้นฐานเหล่านี้


ป้ายทะเบียนรถต้องไม่มี:

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

กฎและข้อกำหนด:

  • ต้องสร้างป้ายทะเบียนแบบสุ่ม
  • เมื่อสร้างป้ายทะเบียนแบบสุ่มจะไม่สามารถสร้างป้ายทะเบียนเดียวกันได้อีก
  • คุณจะต้องส่งออกอย่างน้อย 200 ไม่ซ้ำแผ่นป้ายทะเบียน คุณสามารถสร้างมากขึ้นถ้าคุณต้องการ
  • คุณสามารถจัดเก็บเพลตที่สร้างขึ้นในไฟล์เพื่อ "จำ" ได้
  • แผ่นป้ายทะเบียนที่มี 2 ส่วนหนึ่งที่มีเพียงสามตัวอักษรและหนึ่งที่มีเพียงสามตัวเลขคั่นด้วยเส้นประเช่นนี้หรือ233-ADFADF-233
  • คุณสามารถใช้ตัวเลขและตัวพิมพ์ใหญ่เท่านั้น
  • แผ่นป้ายทะเบียนสามารถเขียนไปยัง stdout หรือไฟล์
  • "ด้าน" ของป้ายทะเบียนแต่ละใบจะมีตัวเลขหรือตัวอักษรสามตัว
  • นี่คือคำตอบที่สั้นที่สุดและได้รับความนิยมมากที่สุด ผู้ชนะจะถูกเลือกหลังจากเจ็ดวัน

กฎทั่วไป

  • คำตอบควรรวมถึง แต่ไม่ จำกัด เฉพาะดังต่อไปนี้
  • ชื่อภาษา
  • นับตัวอักษร.
  • ขนาดไฟล์
  • วิธีการเรียกใช้รหัส
  • รหัสตัวเอง
  • ตัวอย่าง: งูหลาม 234 ตัวอักษรหรืองูหลาม 23MB

หากฉันต้องการชี้แจงรายละเอียดเพิ่มเติมใด ๆ โปรดพูดถึงมันในความคิดเห็นและฉันจะเพิ่มไปยังโพสต์ของฉัน อย่างไรก็ตามโชคดีและสร้างแผ่นป้ายทะเบียนให้ฉันด้วย!


อัปเดต 1: ผู้ชนะจะถูกเลือกก่อนหน้านี้เล็กน้อย

ปรากฎว่าฉันต้องไปเที่ยวเร็ว ๆ นี้ดังนั้นฉันจะเลือกผู้ชนะรอบ 00:00 UTC, 25 กรกฎาคมหลังจากเลือกผู้ชนะแล้วคุณยังสามารถส่งรายการได้เพียงแค่รู้ว่าผู้ชนะได้รับการคัดเลือกแล้ว ตากใบ


อัปเดต 2: ผู้ชนะ!

เรามีผู้ชนะ! เย้! ชีสและไวน์สำหรับทุกคนที่เข้าร่วม! นี่คือผู้ชนะ

  • อันดับที่ 1: Àngel - Bash (95 ตัวอักษร)
  • อันดับที่ 2: Martin Büttner - Mathematica (182 bytes)
  • อันดับที่ 2: Emilio M Bumachar - Pyg (92?)
  • อันดับที่ 2: Peter Taylor - Golfscript (98 ตัวอักษร)
  • อันดับที่ 3: Mark Thomas - Ruby (127 ตัวอักษร)

ว้าวความสัมพันธ์สามวินาที ว้าว. การแข่งขันสิ้นสุดลงแล้ว แต่คุณสามารถส่งผลงานได้หากคุณต้องการ ใบ!



2
" เมื่อสร้างป้ายทะเบียนแบบสุ่มแล้วจะไม่สามารถสร้างแผ่นป้ายทะเบียนใบเดิมได้อีก " แผ่นป้ายทะเบียนที่ไม่ได้สุ่มจะเป็นอย่างไร
Peter Taylor

4
วิธีที่ชัดเจนในการทำสิ่งนี้ (และอาจเป็นวิธีการทำงานในชีวิตจริง) คือการสร้างตัวเลขตามลำดับ
Peter Taylor

5
"สร้างแบบสุ่ม" นั้นไม่แน่ชัด ฉันคิดว่าคุณหมายถึง "เลือกแบบสุ่มจากแผ่นป้ายทะเบียนทางกฎหมายที่ไม่ได้ใช้" แทนที่จะเลือกพูดโดยเลือกแบบสุ่มจากแผ่นป้ายทะเบียนตามกฎหมายเริ่มต้นAAA-
Peter Taylor

1
โปรดบอกว่าควรมีตัวเลขกี่ตัวในทุกจานและตัวละครที่ถูกต้อง - มันแตกต่างกันไปในแต่ละประเทศ
ภาคภูมิใจ haskeller

13
ตอนนี้ฉันค่อนข้างอยากจะเขียนโปรแกรมเพื่อสร้างป้ายทะเบียนแบบสุ่มที่มีข้อความลามกอนาจารหรือไม่เหมาะสมไม่พบในรายการของคุณ
Ilmari Karonen

คำตอบ:


12

ทุบตี (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 

Caveat: สุดท้ายmควรเป็นจริงexec m(+5 ตัวอักษร) เพื่อหลีกเลี่ยงการออกจากกระบวนการรอให้เสร็จสมบูรณ์ (แต่คุณสามารถมีหลายพันไม่มีปัญหามาก)

เครดิตไปที่ http://www.cyberciti.biz/faq/linux-random-password-generator/สำหรับแนวคิดในการใช้tr -dc


สำหรับฉันหรือความต้องการเฉพาะที่ขาดหายไป?
Cristian Ciupitu

1
@ Cristian-Ciupitu: การgrep -vยกเว้นทั้งบัญชีดำและรายการแผ่นที่เราได้สร้างขึ้นแล้ว ( grepคาดว่า p จะมีหนึ่งรูปแบบต่อบรรทัด แต่เนื่องจากแผ่นไม่ได้มีตัวบ่งชี้การแสดงออกปกติพวกเขาตรงกับตัวเองเท่านั้น) เราสร้างเพลตเพียงหนึ่งหรือศูนย์ต่อการวนซ้ำดังนั้นหลังจากการทำซ้ำแต่ละครั้งจะมีการ 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))

ตอนนี้สามารถเลือกได้อย่างสม่ำเสมอจากเพลตที่ไม่ได้ใช้ทั้งหมดซึ่งเป็นไปตามข้อกำหนดของ OP ในขณะที่ตัวอักษรสั้นลง 1 ตัว

เป็นไปได้ในทางทฤษฎีว่ารายการแผ่น 999 จะมีการทำซ้ำมากพอเพื่อให้ชุดที่ถูกตัดจะน้อยกว่า 200 แต่อัตราต่อรองของแผ่นนั้นมีขนาดเล็กมาก ในการทดลองสิบครั้งความยาวต่ำสุดที่ฉันได้คือ 994

แก้ไข: เปลี่ยน 999 เป็น K (ซึ่งเป็น pyg สำหรับ 1,000) เพื่อบันทึกสองตัวอักษรตามคำแนะนำของ bitpwner


1
คุณกรองค่าที่ไม่ได้รับอนุญาตหรือไม่? ไม่เห็น KKK หรือ 666 ที่ใดก็ได้
Vectorized

5
@bitpwner: ฉันใช้เฉพาะตัวเลขตั้งแต่ 0 ถึง 5 และตัวอักษรจาก A ถึง J ดังนั้นค่าที่ไม่อนุญาตจะไม่เกิดขึ้น
Emilio M Bumachar

ฉลาดมาก! ไม่มีใครเคยพูดว่าคนอื่นต้องใช้ ดี
Kjeld Schmidt

1
OP เห็นด้วยกับการสุ่ม "เลือกอย่างสุ่มจากแผ่นป้ายทะเบียนทางกฎหมายที่ไม่ได้ใช้" ดูความคิดเห็นในคำถาม หากคุณไม่ได้นิยามคำว่ายูนิฟอร์มหมายความว่าเหมือนกันทุกช่วง และคุณสามารถเปลี่ยน 999 เป็น K ได้โดยประหยัด 2 ตัวอักษร
Vectorized

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

Ungolfed

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

เปลี่ยนการแจ้งเตือนนั้นเป็น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 คุณเห็นได้ชัดว่าฉันไม่ได้เห็น JS regex บรรทัดเดียวของฉันมากกว่า 400 รายการ)
Eric Lagergren

@eric_lagergren ฟังดูเหมือนว่าจะเจ็บปวดที่จะเขียน ...
DatEpicCoderGuyWhoPrograms

3
@DatEpicCoderGuyWhoPrograms คุณสามารถเขียนทับหลายบรรทัดแล้วลบช่องว่างที่ไม่จำเป็นออกได้ มีบริการออนไลน์หลายบริการที่เสนอ + การย่ออื่น ๆ (แทนที่ชื่อฟังก์ชัน / var ฯลฯ ) เพื่อลดขนาดไฟล์ js และบันทึกแบนด์วิดท์ในภายหลัง
SBoss

1
@DatEpicCoderGuyWhoPrograms เพิ่มประสิทธิภาพในภายหลัง ฉันหาวิธีแก้ปัญหาได้อย่างถูกต้องจากนั้นฉันลองค้นหาทางลัดและในที่สุดก็เพิ่มรหัสของฉัน: P ง่ายกว่ามาก
Eric Lagergren

4

Ruby - 136 133 129 ตัวอักษร

น่าเกลียด คิดว่ามีห้องพักสำหรับการปรับปรุงแม้ว่า เพียงแค่วางรหัสในirbหรือpryและกด Enter เพื่อใช้งาน:

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 ตัวอักษร

ความพยายามของฉันในรุ่น 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

โปรดทราบว่านี้สร้างตามมาตรฐานจานใบอนุญาต แต่จะไม่สร้างทั้งชุดของแผ่นเปลือกโลกที่เป็นไปได้ (เช่นเดียวกับส่วนใหญ่ของคำตอบเหล่านี้) ดูเหมือนจะไม่เป็นข้อกำหนด
มาร์คโธมัส

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? นอกจากนี้คุณยังสามารถบันทึกตัวอักษรบางส่วนโดยเยื้องกับ 1 ช่องว่างแทน 4
Cristian Ciupitu

นอกจากนี้ยังอาจถูกแทนที่ด้วยfor i in range(0,200): for i in range(200):
Cristian Ciupitu

@CristianCiupitu ฉันไม่สามารถทำให้เต็ม 200 เมื่อใช้continue.. แต่passทำเคล็ดลับ นอกจากนี้มันสั้นกว่า และเมื่อฉันลองfor i in range(200)มันก็แค่ 199 ^^ ฉันนับพวกมันหลังจากนั้นโดยการสร้างduplicatesตัวแปรและวางduplicates += 1ก่อนpassและนับเหตุการณ์ที่เกิดขึ้น-ในรายการ / สตริง
อดัม

@CristianCiupitu ช่วง (200) ทำงานหลังจากทั้งหมด - ช่องว่าง 4 อันในบล็อคโค้ดนั้นจริง\tและแทนที่ด้วยช่องว่าง 1 ช่องไม่ได้เปลี่ยนจำนวนตัวอักษร ... ขอบคุณสำหรับคำแนะนำ!
อดัม

1
ผู้ใช้ที่แนะนำในการแก้ไขที่แนะนำให้ทำการลบออกif k in t: passโดยไม่ทำอะไรเลย
Doorknob

3

Python - 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 ไบต์

นี่คือผลงานของฉัน ฉันประทับใจกับมัน แต่ฉันรู้ว่าคนอื่นทำได้ดีกว่ากับงูหลาม

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

นำเข้าเหล่านั้น ...

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

ฉันขอแนะนำ PYG ได้ไหม gist.github.com/Synthetica9/9796173
Emilio M Bumachar

ฉันนับตัวอักษรได้ 208 ครั้งและโซลูชันของคุณอนุญาตให้ใช้หมายเลขก่อนหรือไม่
วิลเล็ม

@willem สี่ช่องว่างสำหรับการเยื้องเป็นแท็บจริง ๆ และตัวอักษรแรกเท่านั้น
Vectorized

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 และเรียกดูบนเว็บเซิร์ฟเวอร์ใดก็ได้ มันจะพยายามสร้างไฟล์ blacklist p.txt หากยังไม่มีอยู่ อย่างไรก็ตามคุณอาจจำเป็นต้องกำหนดด้วยพา ธ เซิร์ฟเวอร์แบบเต็มหากคุณไม่สามารถเข้าถึงรูทได้

รหัสตัวเองอยู่ที่นี่ก่อน 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;
        }
    }
}

สั้นที่สุดเท่าที่ฉันจะได้รับ :-(

ตัวอย่างผลลัพธ์

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";
Paul Drewett

1
คุณสามารถใช้ชื่อไฟล์อักขระเดียว (เช่น p แทน p.txt) และช่วยตัวคุณเองได้ 4 ตัว
Mark

@ มาร์คฉันไม่รู้ว่าคุณทำได้ ทดสอบแล้วและใช้งานได้ดี อ่านข้อมูลเกี่ยวกับนามสกุลไฟล์และพวกมันใช้งานไม่ได้ตามที่ฉันคิด ขอบคุณที่น่าสนใจมาก
พอล Drewett

1

Delphi, 161 ไบต์

นี่คือสิ่งที่ฉันทำ มันส่งออกแผ่นป้ายทะเบียนให้ stdout โดยไม่ต้องป้อนบรรทัดระหว่างพวกเขา หากจำเป็นต้องใช้ LF (ไม่ได้ระบุไว้ในกฎ) มากกว่านั้นจะเพิ่ม 4 ไบต์พิเศษ

รุ่น Golfed:

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.

วิธีการใช้งาน:

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


ขอแสดงความยินดีที่ได้ปรับปรุงวิธีแก้ปัญหาของฉัน
William Barbosa

ฉันได้รับข้อผิดพลาด "ไวยากรณ์" l=x=>String.fromCharCode(65+r()*26);เมื่อ: ฉันเดาว่าฉันไม่รู้ว่าเกิดอะไรขึ้นกับl=x=>...
เควินเฟegan

@KevinFegan - ฉันคาดเดาว่าคุณไม่ได้ใช้ Firefox ... f=a=>bเป็นคุณสมบัติ ES6 ที่เป็นพื้นฐานสำหรับการใช้งานfunction f(a) { b }และเป็นเพียง (?) รองรับ Firefox ในขณะนี้
Alconja

ใช่ฉันใช้ IE 9 และแน่นอนไม่ทำงานที่นี่ ฉันจะลองบน Firefox ขอบคุณ
Kevin Fegan

1

JavaScript (ES6) 184

ตามปกติทดสอบในคอนโซล FireFox และเปลี่ยนalertเป็นconsole.logหรือเตรียมพร้อมที่จะกดescape200 ครั้ง

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

ฉันไม่ทราบเกี่ยวกับคอนโซล แต่หน้าเว็บอนุญาตให้แจ้งเตือนได้ฟรี 5 ครั้งเท่านั้นก่อนที่ Firefox จะเริ่มปิดการใช้งาน: mxr.mozilla.org/mozilla-central/ ......
Neil

@ แน่นอน แต่การเสนอให้ปิดไม่ได้ปิดใช้งาน คุณไม่ควรเพลิดเพลินไปกับป๊อปอัป200 (หรือมากกว่าcodegolf.stackexchange.com/a/32278/21348 )?
edc65

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

@undergroundmonorail คุณพูดถูกขอบคุณ!
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);

นั่นคือ 100 chars น้อยกว่า PHP ที่ดีที่สุดในปัจจุบัน :)

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 ตัวอักษร แต่ไม่สามารถสลับแบบอักษรและตัวเลขได้ ข้อเสนอแนะใด ๆ wellcome :)


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

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

หากใครมีไอเดียในการตีกอล์ฟเพิ่มเติมให้ฉันรู้ฉันสนใจ หากคุณต้องการคำอธิบายเพิ่มเติมของส่วนหนึ่งของรหัสฝากความคิดเห็นและฉันยินดีที่จะอธิบายเพิ่มเติมด้วย


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) ลบ ตัวแปร: t และใช้ตัวอักษร: "ASS | KKK | SHT | 666" [-4] [302]
4) ตั้งค่า m = Math.random และใช้ "m" แทน [-7] [296]
5) ใช้ (m ( ) + "") มากกว่า m (). toString () [-6] [290]
6) ลบที่ไม่จำเป็นออก ";" [-7] [283]



รุ่นเก่า: Javascript - 327 ตัวอักษร

ฉันแน่ใจว่ามีห้องพักสำหรับการปรับปรุง ... ฉันค่อนข้างขาดประสบการณ์ในการเล่นกอล์ฟ Code:

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" ที่จัดรูปแบบพร้อมชื่อตัวแปร / ฟังก์ชั่น "un-minified":

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 ของรายการโปรด / บุ๊คมาร์คของเบราว์เซอร์ เอาต์พุตถูกวางใน "TEXTAREA" บน "หน้าต่าง" ใหม่แทน "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();})()
/* */

นี่คือเวอร์ชัน "debug" ที่จัดรูปแบบ:

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
โดยไม่ต้องสัมผัสอัลกอริทึมที่แท้จริงของคุณที่นี่เป็นจาวาสคริปต์ทั่วไปเคล็ดลับการเล่นกอล์ฟ: จาวาสคริปต์ที่โดยเนื้อแท้ให้อภัยมีไวยากรณ์ที่ไม่ดีดังนั้นคุณจึงไม่จำเป็นต้องใช้งานvar(เพียงกำหนดจะทำ323 ), คุณไม่จำเป็นต้อง;s เว้นแต่มีคำสั่งอีกต่อไป (เช่น. ตัวอักษรตัวสุดท้ายในสายหรือก่อน}, 316 ), นาฬิกาสำหรับสิ่งที่ต้องใช้พื้นที่มากขึ้นเพื่อประกาศ / การใช้งานมากกว่าเพียงแค่อินไลน์ (เช่น. ของsตัวแปร312 ) เหมือนกันสำหรับการกลับถ้าเป็นสิ่งที่ใช้มากกว่า . ครั้งเดียว (เช่นMath.random(...)การr=Math.random ... r(...), 307 , (x+"")สั้นกว่าx.toString(), 300
Alconja

@Alconja - ขอบคุณสำหรับความช่วยเหลือ ฉันสามารถลดขนาดได้ 44 ตัวอักษร
Kevin Fegan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.