Bana uygun plakalar üret!


15

Senaryo: Otomobiller ve diğer araçlar için plakalar tasarlayan bir şirkette çalışan bir yazılım tasarımcısısınız. Sizden plaka üreten bir yazılım geliştirmeniz istendi. Çalışmaya başlamadan önce patronlarınız bu temel kuralları ortaya koydu.


Bir plaka şunları içeremez:

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

Kurallar ve gereksinimler:

  • Plaka gerekir rasgele oluşturulur.
  • Rastgele bir plaka üretildikten sonra, aynı plaka tekrar üretilemez.
  • En az 200 benzersiz plaka çıkarmalısınız. Daha üretebilir eğer istersen .
  • Oluşturulan plakaları "hatırlamak" için bir dosyada saklayabilirsiniz.
  • Plaka, biri yalnızca üç harf içeren ve biri sadece bir rakamla ayrılmış, yalnızca üç sayı içeren 2 bölüm içerir: 233-ADFveya ADF-233.
  • Yalnızca rakam ve büyük harf kullanabilirsiniz.
  • Plakalar stdout'a veya bir dosyaya yazılabilir.
  • Bir plakanın her bir "tarafı" üç rakam veya harf içerecektir.
  • Bu bir , çok kısa, en popüler, cevap kazanır. Kazanan yedi gün sonra seçilecektir.

Genel kurallar

  • Cevap aşağıdakileri içermeli , ancak bunlarla sınırlı olmamalıdır .
  • Dil adı.
  • Karakter sayımı.
  • Dosya boyutu.
  • Kod nasıl çalıştırılır.
  • Kodun kendisi.
  • Örnek: Python 234 karakterleri veya Python 23mb .

Ek ayrıntıları açıklığa kavuşturmam gerekirse, lütfen yorumlarda belirtin ve gönderime ekleyeceğim. Her neyse, iyi şanslar ve bana uygun plakalar üret!


Güncelleme 1: Kazanan biraz daha erken seçilecek.

Yakında bir yolculuğa çıkmak zorunda olduğum ortaya çıkıyor, bu yüzden 25 Temmuz 00:00 UTC civarında bir kazanan seçeceğim. Kazanan seçildikten sonra, yine de bir kazanan seçildiğini bilmek için girişler gönderebilirsiniz. Bai.


Güncelleme 2: Kazananlar!

Kazananlar var! Yaşasın! Katılan herkese peynir ve şarap! İşte kim kazandı.

  • 1. sıra: --ngel - Bash (95 karakter)
  • İkincilik: Martin Büttner - Mathematica (182 bayt)
  • İkincilik: Emilio M Bumachar - Pyg (92?)
  • İkincilik: Peter Taylor - Golfscript (98 karakter)
  • 3.lük: Mark Thomas - Ruby (127 karakter)

Vay be, üçüncüsü ikinci sırada. Vay. Yarışma sona erdi, ancak isterseniz giriş yapmaktan çekinmeyin. Bai!



2
" Rastgele bir plaka üretildikten sonra, aynı plaka tekrar oluşturulamaz. " Peki rastgele olmayan plakalar ne olacak?
Peter Taylor

4
Bunu yapmanın bariz yolu (ve muhtemelen gerçek hayatta çalışma şekli) sayıları sırayla oluşturmaktır.
Peter Taylor

5
"Rastgele oluşturulmuş" kesin değil. Diyelim ki, yasal plakalardan başlayan rastgele rastgele seçmektense, "kullanılmayan yasal plakalardan rastgele rastgele seçilmiş" demek istediğinizi düşünüyorumAAA-
Peter Taylor

1
lütfen her plakada kaç basamak olması gerektiğini ve hangi karakterlerin geçerli olduğunu
söyleyin

13
Şimdi biraz biraz müstehcen veya uygunsuz dizeyi içeren rastgele plakalarını üretmek için bir program yazmak için çeliyor değil listenizde bulduk.
Ilmari Karonen

Yanıtlar:


12

bash (95 karakter)

Komut dosyasını myürütme biti ayarıyla PATH'nizdeki bir klasöre kaydedin.

Farklı çalıştır bash m. Plakalar p dosyasında saklanır

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

Bu, aşağıdakileri çalıştırmaya eşdeğerdir:

# 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 

Uyarı: İşlemlerin tamamlanmasını bekleyen işlemlerden kaçınmak için final maslında exec m(+5 karakter) olmalıdır (ancak binlerce sorun olmadan)

Kredi kullanma fikri için http://www.cyberciti.biz/faq/linux-random-password-generator/ adresine gitmektedir. tr -dc


Bana mı yoksa benzersizlik gereksinimi mi eksik?
Cristian Ciupitu

1
@ Cristian-Ciupitu: grep -vHem kara listeyi hem de zaten oluşturduğumuz plaka listesini hariç tutuyor ( grepp'nin satır başına bir desen içermesini bekliyor , ancak plakalar düzenli ifade meta karakterleri içermediğinden, yalnızca kendileriyle eşleşiyorlar). Yineleme başına yalnızca bir veya sıfır plaka üretiyoruz, bu nedenle her yinelemeden sonra hariç tutulacak tam (güncellenmiş) plaka listesi grep tarafından okunacaktır. : 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))

Artık 1 karakter daha kısalırken OP'nin teknik özelliklerini koruyarak kullanılmayan tüm plakalardan eşit olarak seçim yapabiliyor.

Teorik olarak, 999 plaka listesinin, kesilen setin 200'den az olması için yeterli sayıda tekrar içermesi mümkündür. Ancak bunun olasılıkları sonsuz derecede küçüktür. On denemede elde ettiğim en düşük uzunluk 994 idi.

EDIT: bitpwner tavsiyesi ile iki karakter kaydetmek için 999 K (1000 için pyg) değiştirildi.


1
İzin verilmeyen değerleri filtrelediniz mi? Hiçbir yerde KKK veya 666 görmüyorum.
Vectörize

5
@ bitpwner: Yalnızca 0-5 arasındaki rakamları ve A'dan J'ye kadar olan harfleri kullanırım, böylece izin verilmeyen değerler oluşamaz.
Emilio M Bumachar

Çok zeki! Hiç kimse, başkalarının kullanılması gerektiğini söylemedi. Güzel.
Kjeld Schmidt

1
OP, rastgeleliğin "kullanılmayan yasal plakalardan rastgele rastgele seçilmesini" kabul etti. Söz konusu yorumlara bakın. Eğer üniforma tanımınız herhangi bir aralıktan üniforma anlamına gelmedikçe. Ve 999'u K olarak değiştirerek 2 karakter kaydedebilirsin.
Vectorized


5

Mathematica, 182 bayt

Ugh, bu uzun

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

Oldukça basit. Rastgele plakalar oluşturur ve 200 kopya bulunana kadar kopyaları ve yasak olanları filtreler.


5

GolfScript (98 karakter)

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

Bu, olası tüm plakaları, çirkin bir temel dönüşüm ve ardından filtreleme kullanarak rastgele bir sırayla oluşturur. Birçoğu var, bu yüzden hızlı bir şekilde yürütülmesini beklemeyin, ancak soru yürütme süresine herhangi bir kısıtlama getirmedi.


4

JavaScript (ES6) - 213

Muhtemelen geliştirilebilir. Firefox Konsolu'nda test edildi.

console.log()Test etmek istiyorsanız bu uyarıyı bir olarak değiştirin

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

Vay be, şimdiye kadar gördüğüm en uzun tek kod satırı olmalı.
DatEpicCoderGuyWhoPrograms

2
400+ karakterlik tek satırlı JS regex'imi görmediğin belli ki @DatEpicCoderGuyWhoPrograms;)
Eric Lagergren

@eric_lagergren Kulağa yazmak acı
vericiydi

3
@DatEpicCoderGuyWhoPrograms Birden çok satıra yazıp gereksiz boşlukları kaldırabilirsiniz. Js dosya boyutlarını azaltmak ve daha sonra bant genişliğinden tasarruf etmek için + diğer kısaltma (işlev / var vb adlarının değiştirilmesi) sunan birden fazla çevrimiçi hizmet vardır.
SBoss

1
@DatEpicCoderGuyWhoPrograms daha sonra optimize eder. Sorunu doğru bir şekilde nasıl çözeceğimizi anlıyorum, sonra kısayolları bulmaya çalışıyorum ve sonunda kodumu optimize ediyorum: P çok daha basit
Eric Lagergren

4

Yakut - 136 133 129 karakter

İğrenç. Yine de iyileştirilmesi gereken bir yer olduğunu düşünün. Sadece kod damla irbveya prykaçmaya Giriş tuşuna:

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

"Okunabilir" Ruby sürümündeki girişimim:

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

Bunun uyumlu olduğunu unutmayın plakalar , ancak olası plakaların tamamını oluşturmayacağını unutmayın (bu yanıtların çoğunda olduğu gibi). Bu bir gereklilik gibi görünmüyor.
Mark Thomas

4

Python 2.7-258 karakter

Ben profesyonel bir programcı falan değilim, bu yüzden sonuçtan memnun olduğumu söyleyebilirim.

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

Dosya boyutu 4.0 K, ile çalıştırın python file.py!


O gerekmiyor passbir olmak continue? Ayrıca 4 yerine 1 boşluk
bırakarak

Ayrıca for i in range(0,200):ile değiştirilebilir for i in range(200):.
Cristian Ciupitu

@CristianCiupitu Kullanırken tam 200 yapmak için alamadım continue.. Ama passhile yaptı. Artı, daha kısa. Ve denediğimde for i in range(200), sadece 199 ^^ yaptı. Daha sonra bir duplicatesdeğişken yaparak ve daha duplicates += 1önce koyarak passve -liste / dizgideki oluşumları sayarak onları saydım .
Adam

@CristianCiupitu aralığı (200) sonuçta çalıştı - kod bloğundaki 4 boşluk aslında \tve 1 boşlukla değiştirmek karakter sayısını değiştirmedi ... Öneriler için teşekkürler!
Adam

1
Bir kullanıcı, önerilen bir düzenlemede if k in t: passhiçbir şey yapmadığı için yalnızca kaldırmasını önerdi .
Kapı Tokmağı

3

Python - 208

Merhaba ben plaka üretimi benim bıçak heres. Bu çözüm @ bitpwner'in çözümüne benzer, ancak dize modülü olmadan ve plaka listesi yerine bir set kullanmayı seçtim ve ayrıca numaralara da izin verir.

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)

Örnek çıktı:

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

3

Python, 252 bayt

İşte katkım. Bundan çok etkilendim, ama başkalarının python ile daha iyisini yaptığını biliyorum.

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

Bu ithalatlar ...

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

Eğer gerçekten gerekli olduğunu düşünmediğim rakamlarla ya da alfabelerle rastgele başlamaya ihtiyaç varsa, o zaman 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

Karakterler mi yoksa baytlar mı?
Ocak


208 karakter sayıyorum ve çözümünüz önce sayılara izin veriyor mu?
Willem

@willem Girinti için kullanılan dört boşluk aslında sekmelerdir ve yalnızca ilk alfabedir.
Vectörize

2

PHP 341 324 320

Yapabileceğim en iyisiydi.

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

Kodu çalıştırmak için bir .php dosyası olarak kaydedin ve herhangi bir web sunucusunda ona göz atın. Zaten mevcut değilse, p.txt kara liste dosyasını oluşturmaya çalışacaktır. Ancak, kök erişiminiz yoksa, bunu tam sunucu yolu ile tanımlamanız gerekebilir.

Kodun kendisi burada golf öncesi öncesi:

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

Ben alabildiğim kadar kısa oldu :-(

Örnek Çıktı

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: kısa form kullanmak için birkaç if ifadeleri topladı.


Plakaların karıştırılması gerekmiyorsa - yani sadece rakamlar sonra harfler olabilir, bu satırı kaybedebilirim $string = (rand(1,2)==1) ? "$rand_number-$letters" : "$letters-$rand_number";
Paul Drewett

1
Tek karakterli bir dosya adı (ör. P.txt yerine p) kullanabilir ve kendinize de 4 karakter kaydedebilirsiniz.
Mark

@ Mark bunu yapabileceğini bilmiyordum. Test edildi ve iyi çalıştı. Dosya uzantılarını okuyun ve yaptığım gibi oldukça çalışmıyorlar. Teşekkür ederim, bu çok ilginçti.
Paul Drewett

1

Delphi, 161 bayt

İşte bunu benim almam. Aralarında hat beslemesi olmadan plakaları stdout'a çıkarır. LF gerekiyorsa (kurallarda belirtilmez), bundan daha fazla 4 bayt ekler.

Golf versiyonu:

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.

Nasıl çalıştırılır:

app.exe > plates.txt

1

PHP, 267

Bu, alabildiğim kadar kısa.

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

Plakalar "p" dosyasında saklanır.

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

Eminim bu geliştirilebilir:

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

Konsolda çalıştırın, plakaların bir listesini yazdırır.


1

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

Uyarı : 200 uyarı diyaloglar (değişim alertiçin console.logtestine)

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

Düzenleme : Hata! Orijinal sürüm baskılı kopyalar ...

Düzenleme 2 : Şimdi orijinal skora daha yakın - bir kümeden ilişkisel bir diziye geçerek bazı çirkin yinelemeli kontrollerle geçiyor

Firefox konsolunda test edildi.


Çözümümü iyileştirdiğim için tebrikler
William Barbosa

Ben bir "sözdizimi hatası" alıyorum: l=x=>String.fromCharCode(65+r()*26);. Ne olduğunu bilmiyoruml=x=>...
Kevin Fegan

@KevinFegan - Sanırım Firefox kullanmıyorsunuz ... f=a=>btemelde kısaca kullanılan bir ES6 özelliğidir function f(a) { b }ve şu anda yalnızca Firefox tarafından desteklenmektedir (?).
Alconja

Evet, IE 9 kullanıyorum ve kesinlikle burada çalışmıyor. Firefox'ta deneyeceğim. Teşekkürler.
Kevin Fegan

1

JavaScript (ES6) 184

Her zamanki FireFox konsolunda testi ve değişim gibi alertetmek console.logveya basına hazırlanacak escape200 kez.

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

Konsolu bilmiyorum, ancak web sayfalarına Firefox bunları devre dışı bırakmaya başlamadan önce sadece 5 ücretsiz uyarı veriliyor: mxr.mozilla.org/mozilla-central/…
Neil

@ Elbette, ancak devre dışı bırakmayı teklif etmek devre dışı bırakmıyor. 200 (veya daha fazla codegolf.stackexchange.com/a/32278/21348 ) pop- up'ın tadını çıkarmamalı mısınız?
edc65

1

Python3, 257 karakter

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

Örnek çıktı:

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

1
Bir bayt ;yerine 5 ve 6 satırlarını ayırarak kaydedebilirsiniz \n .
undergroundmonorail

@ undergroundmonorail, haklısın, teşekkürler!
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);

Mevcut PHP'nin en iyisinden 100 karakter daha az :)

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

umarım beğenirsin. İzin verilmesi durumunda:

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

yalnızca 141 karakterdir, ancak karakter ve sayıları karıştırmaz. Herhangi bir öneri hoş geldiniz :)


1

F #, 264 karakter

Gerçekten golf için tasarlanmış bir dil değil, ama bunun geliştirilebileceğinden eminim. Seq.exists'i bir lambda ile kullanmak, birçok ebeveyn ve örtük dönüşüm eksikliği gibi oldukça can sıkıcıdır.

Özyineleme kullanır, sonsuza kadar devam eder.

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 ile çalıştırılabilir.


1

Python 203

Bunun teknik olarak önemli olup olmadığından emin değilim, ama beğendim, bu yüzden yine de gönderiyorum. Diğer herkesin yaptığı gibi cevapları yalancı rastgele oluştururken, stratejik cevapları geçersiz tohumların çıktıda sonuçlanmayacağı şekilde seçtim. Yani, cevabım aslında geçersiz cevapları üretmeden geçerli tüm cevapları üretme yeteneğine sahip değil.

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 Karakterler

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

Daha fazla golf oynamak için fikirleri varsa, bana bildirin, ilgileniyorum. Kodun bir kısmının daha fazla açıklamasını istiyorsanız, bir yorum bırakın ve ben de daha fazla açıklamaktan mutluluk duyarım.


1

Javascript - 283327 Karakterler

Düzenle:

Alconja'nın önerilerini uyguladıktan sonra , benim yeni versiyonum:

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) Değişkeni Kaldır: s ve değişmez değeri kullanın: "\ n" [-4] [323]
2) "var o =" ", i, r, n, l," [-17] [306]
3) Kaldır Değişken: t ve kullanım değişmezi: "ASS | KKK | SHT | 666" [-4] [302]
4) m = Math.random'u ayarlayın ve onun yerine "m" kullanın [-7] [296]
5) Kullanım (m ( ) + "") m () yerine toString () [-6] [290]
6) Gereksiz olanları kaldırın ";" [-7] [283]



Eski versiyon: Javascript - 327 Karakter

Eminim geliştirmek için biraz yer var ... Code-golfing'de oldukça tecrübesizim:

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


İşte "küçültülmemiş" değişken / işlev adlarıyla biçimlendirilmiş, "Ungolfed" sürümü:

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



Tarayıcı favori / yer iminin URL'sine yapıştırılabilen bir "hata ayıklama" sürümü. Çıktı, "alert ()" yerine yeni bir "pencere" üzerindeki "TEXTAREA" içine yerleştirilir:

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

Biçimlendirilmiş "hata ayıklama" sürümü:

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
Gerçek algoritmanıza dokunmadan, bazı genel javascript golf ipuçları: Javascript doğal olarak kötü sözdizimi ile affediyor, bu yüzden kullanmanıza gerek yok var(sadece atama yapacak, 323 ), ;aşağıdaki başka bir ifade yoksa s'ye ihtiyacınız yok (örneğin, satırdaki son karakter veya a }, 316'dan önce ), yalnızca satır içi satırdan (ör. sdeğişkeniniz 312 ) değil, beyan etmek / kullanmak için daha fazla alan gerektiren herhangi bir şeye dikkat edin. . (örneğin bir kez Math.random(...)için r=Math.random ... r(...), 307 , (x+"")kısadır x.toString(), 300
Alconja

@Alconja - Yardımınız için teşekkürler. Boyutu 44 karakter azaltabildim.
Kevin Fegan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.