Wygeneruj mi odpowiednie tablice rejestracyjne!

15

Scenariusz: jesteś projektantem oprogramowania pracującym dla rządowej firmy, która projektuje tablice rejestracyjne samochodów i innych pojazdów. Zostałeś poproszony o opracowanie oprogramowania, które generuje tablice rejestracyjne. Zanim zaczniesz pracować, twoi szefowie ustanowili te podstawowe zasady.


Tablica rejestracyjna nie może zawierać:

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

Zasady i wymagania:

  • Tablica rejestracyjna musi być generowana losowo.
  • Po wygenerowaniu losowej tablicy rejestracyjnej nie można ponownie wygenerować tej samej tablicy rejestracyjnej.
  • Musisz wydać co najmniej 200 unikalnych tablic rejestracyjnych. Możesz wygenerować więcej, jeśli chcesz .
  • Możesz przechowywać wygenerowane płytki w pliku, aby je „zapamiętać”.
  • Tablica rejestracyjna zawiera 2 sekcje, jedna zawiera tylko trzy litery, a druga zawiera tylko trzy cyfry, oddzielone myślnikiem, jak poniżej: 233-ADFlub ADF-233.
  • Możesz używać tylko cyfr i wielkich liter.
  • Tablice rejestracyjne można zapisać na stdout lub w pliku.
  • Każda „strona” tablicy rejestracyjnej będzie zawierać trzy cyfry lub litery.
  • To jest gra w , więc najkrótsza, najpopularniejsza odpowiedź wygrywa. Zwycięzca zostanie wybrany po siedmiu dniach.

Główne zasady

  • Odpowiedź powinna zawierać, ale nie wyłącznie, następujące.
  • Nazwa języka.
  • Liczba znaków.
  • Rozmiar pliku.
  • Jak działa kod.
  • Sam kod.
  • Przykład: znaki Python 234 lub Python 23mb .

Jeśli muszę wyjaśnić wszelkie dodatkowe szczegóły, proszę wspomnieć o tym w komentarzach i dodam je do mojego postu. W każdym razie, powodzenia i wygeneruj mi odpowiednie tablice rejestracyjne!


Aktualizacja 1: Zwycięzca zostanie wybrany nieco wcześniej.

Okazuje się, że muszę wkrótce wybrać się na wycieczkę, więc wybiorę zwycięzcę około 00:00 UTC, 25 lipca. Po wybraniu zwycięzcy możesz nadal przesyłać zgłoszenia, wiedz tylko, że zwycięzca został wybrany. Bai


Aktualizacja 2: Zwycięzcy!

Mamy zwycięzców! Tak! Ser i wino dla wszystkich, którzy wzięli udział! Oto kto wygrał.

  • 1. miejsce: Àngel - Bash (95 znaków)
  • 2 miejsce: Martin Büttner - Mathematica (182 bajty)
  • 2 miejsce: Emilio M Bumachar - Pyg (92?)
  • 2 miejsce: Peter Taylor - Golfscript (98 znaków)
  • 3 miejsce: Mark Thomas - Ruby (127 znaków)

Wow, trzy remisy na drugim miejscu. Łał. Konkurs się zakończył, ale jeśli chcesz, możesz przesłać zgłoszenia. Bai!


DatEpicCoderGuyWhoPrograms
źródło
2
Po wygenerowaniu losowej tablicy rejestracyjnej nie można ponownie wygenerować tej samej tablicy rejestracyjnej. ” Co z losowymi tablicami rejestracyjnymi?
Peter Taylor
4
Oczywistym sposobem na zrobienie tego (i prawdopodobnie sposób, w jaki działa w prawdziwym życiu) jest generowanie liczb w kolejności.
Peter Taylor
5
„Losowo generowane” jest nieprecyzyjne. Zakładam, że masz na myśli „jednolicie wybrany losowo z nieużywanych legalnych tablic rejestracyjnych”, a nie, powiedzmy, jednolicie wybrany losowo z początkowych legalnych tablic rejestracyjnychAAA-
Peter Taylor,
1
proszę powiedzieć, ile cyfr powinno znajdować się na każdej tabliczce i jakie znaki są prawidłowe - różni się w zależności od kraju
dumny haskeller
13
Kusi mnie teraz, aby napisać program do generowania losowych tablic rejestracyjnych zawierających nieprzyzwoite lub w inny sposób nieodpowiednie ciągi, których nie ma na liście.
Ilmari Karonen,

Odpowiedzi:

12

bash (95 znaków)

Zapisz skrypt jak mw folderze ŚCIEŻKI z ustawionym bitem wykonania.

Uruchom jako bash m. Płytki są przechowywane w pliku 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

Jest to równoważne z uruchomieniem następujących czynności:

# 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 

Uwaga: Ostatecznie mpowinno być exec m(+5 znaków), aby uniknąć pozostawienia procesów oczekujących na zakończenie (ale możesz mieć tysiące bez większego problemu)

Kredyt trafia do http://www.cyberciti.biz/faq/linux-random-password-generator/ za pomysł użyciatr -dc

Anioł
źródło
Czy to dla mnie, czy brakuje wymogu wyjątkowości?
Cristian Ciupitu,
1
@ Cristian-Ciupitu: grep -vWyklucza zarówno czarną listę, jak i listę płytek, które już wygenerowaliśmy ( grepoczekuje, że p będzie zawierać jeden wzór na linię, ale ponieważ płytki nie zawierają metaznaków wyrażeń regularnych, pasują tylko do siebie). Generujemy tylko jedną lub zero płyt na iterację, więc po każdej iteracji pełna (zaktualizowana) lista płytek do wykluczenia zostanie odczytana przez 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))

Teraz jest w stanie wybierać równomiernie ze wszystkich nieużywanych płyt, zachowując specyfikację OP, jednocześnie będąc krótszym o 1 dodatkową postać.

Teoretycznie możliwe jest, że lista 999 płyt będzie zawierać wystarczającą liczbę powtórzeń, tak że przycięty zestaw będzie mniejszy niż 200. Ale szanse na to są nieskończenie małe. W dziesięciu próbach najniższa długość, jaką otrzymałem, wyniosła 994.

EDYCJA: zmieniono 999 na K (czyli pyg dla 1000), aby zapisać dwa znaki za radą bitpwner.

Emilio M. Bumachar
źródło
1
Czy odfiltrowałeś niedozwolone wartości? Nigdzie nie widać KKK ani 666.
Vectorized
5
@bitpwner: Używam tylko cyfr od 0 do 5 i liter od A do J, więc niedozwolone wartości nie mogą wystąpić.
Emilio M Bumachar,
Bardzo mądry! Nikt nigdy nie powiedział, że tych innych trzeba użyć. Ładny.
Kjeld Schmidt
1
OP zgodziła się, aby losowość była „losowo wybierana losowo z niewykorzystanych legalnych tablic rejestracyjnych”. Zobacz komentarze w pytaniu. Chyba że twoja definicja munduru oznacza mundur z dowolnego zakresu. I możesz zmienić 999 na K, oszczędzając 2 znaki.
Vectorized
3
Nie jestem pewien, czy liczę dane wyjściowe jako losowe, jeśli istnieją prawidłowe tablice, których nie można wygenerować ...
Alconja
5

Mathematica, 182 bajty

Ugh, to długo

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

Nie golfił

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

Całkiem proste. Generuje losowe tabliczki i odfiltrowuje duplikaty i zabronione, aż do znalezienia 200.

Martin Ender
źródło
5

GolfScript (98 znaków)

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

To generuje wszystkie możliwe tablice rejestracyjne w losowej kolejności przy użyciu jakiejś brzydkiej konwersji bazy, a następnie filtrowania. Jest ich wiele, więc nie oczekuj, że wykona się szybko, ale pytanie nie nałożyło żadnych ograniczeń na czas wykonania.

Peter Taylor
źródło
4

JavaScript (ES6) - 213

Prawdopodobnie można to poprawić. Testowany na konsoli Firefox.

Zmień ten alert na console.log()jeśli chcesz przetestować

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))
William Barbosa
źródło
Wow, to musi być najdłuższy pojedynczy wiersz kodu, jaki kiedykolwiek widziałem.
DatEpicCoderGuyWhoPrograms
2
@DatEpicCoderGuyWhoPrograms najwyraźniej nie widziałeś mojego ponad 400
znaków
@eric_lagergren Wygląda na to, że pisanie byłoby bolesne ...
DatEpicCoderGuyWhoPrograms
3
@DatEpicCoderGuyWhoPrograms Możesz zapisać go w wielu wierszach, a następnie usunąć niepotrzebne białe znaki. Istnieje wiele usług online, które oferują to + inne skróty (zastępując nazwy funkcji / var itp.), Aby zmniejszyć rozmiary plików js, a następnie zaoszczędzić przepustowość.
SBoss,
1
@DatEpicCoderGuyWhoPrograms optymalizuje później. Wymyślam, jak poprawnie rozwiązać problem, a potem próbuję znaleźć skróty, a potem w końcu zoptymalizować kod: P o wiele prościej
Eric Lagergren
4

Rubin - 136 133 129 znaków

Ohydny. Myślę jednak, że jest miejsce na ulepszenia. Po prostu upuść kod w irblub prywciśnij Enter, aby uruchomić:

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[[]]
OI
źródło
4

Ruby, 127 znaków

Moja próba „czytelnej” wersji Rubiego:

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
Mark Thomas
źródło
Pamiętaj, że generuje to zgodne tablice rejestracyjne, ale nie generuje całego zestawu możliwych tablic (jak w przypadku większości tych odpowiedzi). To nie wydaje się być wymogiem.
Mark Thomas
4

Python 2.7 - 258 znaków

Nie jestem profesjonalnym programistą ani nic, więc powiedziałbym, że jestem zadowolony z wyniku.

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

Rozmiar pliku to 4.0 K, uruchom z python file.py!

Adam
źródło
Czy to nie powinno passbyć continue? Możesz także zapisać niektóre znaki, wcinając je 1 spacją zamiast 4.
Cristian Ciupitu
Również for i in range(0,200):może być zastąpiony for i in range(200):.
Cristian Ciupitu,
@CristianCiupitu Nie mogłem zmusić go do zrobienia pełnych 200 podczas używania continue.. Ale załatwiłem sprawę pass. Plus jest krótszy. A kiedy próbowałem for i in range(200), zrobiłem tylko 199 ^^, policzyłem je później, tworząc duplicateszmienną, umieszczając duplicates += 1przed passi licząc wystąpienia dla- w liście / ciągu.
Adam
Zakres @CristianCiupitu (200) działał przecież - 4 spacje w bloku kodu są w rzeczywistości, \ta zastąpienie ich 1 spacją nie zmieniło liczby znaków ... Dzięki za sugestie!
Adam
1
Użytkownik zasugerował w sugerowanej edycji, aby po prostu usunąć if k in t: pass, ponieważ nic nie robi.
Klamka
3

Python - 208

Cześć, oto mój problem w generowaniu tablic rejestracyjnych. To rozwiązanie jest podobne do rozwiązania @ bitpwner, ale bez modułu ciągów i zamiast listy na tablicę rejestracyjną zdecydowałem się użyć zestawu, który również pozwala na liczby.

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)

Przykładowe dane wyjściowe:

set(['DQJ-641', '086-QRY', '981-GAZ', 'UHN-718', '114-VMI', 'GLO-887',  ...
Willem
źródło
3

Python, 252 bajty

Oto mój wkład. Jestem pod wrażeniem tego, ale wiem, że inni radzili sobie lepiej z Pythonem.

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
luna
źródło
2

Python - 165

Ten import ...

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

Jeśli istnieje potrzeba losowego rozpoczęcia od cyfr lub alfabetów, co nie wydaje mi się, że jest to naprawdę potrzebne, to 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
Vectorized
źródło
Znaki czy bajty?
DatEpicCoderGuyWhoPrograms
Czy mogę zasugerować PYG? gist.github.com/Synthetica9/9796173
Emilio M Bumachar
Zliczam 208 znaków, a czy twoje rozwiązanie pozwala na pierwsze liczby?
Willem,
@willem Cztery spacje dla wcięć to tak naprawdę tabulacje, a alfabety tylko pierwsze.
Vectorized
2

PHP 341 324 320

To było najlepsze, co mogłem zrobić.

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

Aby uruchomić kod, po prostu zapisz jako plik .php i przejdź do niego na dowolnym serwerze WWW. Spróbuje utworzyć plik czarnej listy p.txt, jeśli jeszcze nie istnieje. Jednak może być konieczne zdefiniowanie go za pomocą pełnej ścieżki serwera, jeśli nie masz dostępu do konta root.

Sam kod jest tutaj przed golfifikacją:

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

Był tak krótki, jak tylko mogłem go zdobyć :-(

Przykładowe dane wyjściowe

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.

EDYCJA: uporządkowałem kilka instrukcji if, aby użyć krótkiej formy.

Paul Drewett
źródło
Jeśli tabliczki nie będą musiały być pomieszane - tzn. Mogą być tylko cyframi, a tylko literami, mógłbym stracić tę linię $string = (rand(1,2)==1) ? "$rand_number-$letters" : "$letters-$rand_number";
Paul Drewett
1
Możesz użyć jednoznakowej nazwy pliku (np. P zamiast p.txt) i zaoszczędzić również 4 znaki.
Mark
@ Mark Nie wiedziałem, że możesz to zrobić. Przetestowałem to i działało dobrze. Przeczytaj o rozszerzeniach plików i nie działają one tak, jak myślałem. Dziękuję, to było bardzo interesujące.
Paul Drewett
1

Delfy, 161 bajtów

Oto moje zdanie na ten temat. Wysyła tablice rejestracyjne do standardowego wyjścia bez linii między nimi. Jeśli LF jest potrzebny (nie jest określony w regułach), to dodaje dodatkowe 4 bajty.

Wersja golfowa:

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.

Nie golfowany:

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.

Jak uruchomić:

app.exe > plates.txt
Marko Paunovic
źródło
1

PHP, 267

To jest tak krótkie, jak tylko mogę.

<?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łytki są przechowywane w pliku „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
?>
bilde2910
źródło
1

R, 229 znaków

Jestem pewien, że można to poprawić:

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

Uruchom w konsoli, drukuje listę tablic rejestracyjnych.

Shadowtalker
źródło
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
Obrzydliwe
źródło
1

ECMAScript 6 - 155 168 158

Ostrzeżenie : 200 dialogi alert (zmiana alertdo console.logdo testu)

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

Edycja : Ups. Oryginalne wersje drukowane duplikaty ...

Edycja 2 : Bliżej oryginalnej partytury teraz - zmieniono z zestawu na tablicę asocjacyjną z kilkoma niezmiernie powielonymi testami, które pozwalają drukować w miarę upływu czasu

Testowany w konsoli Firefox.

Alconja
źródło
Gratuluję ulepszenia mojego rozwiązania
William Barbosa
Dostaję „Błąd składni” na: l=x=>String.fromCharCode(65+r()*26);. Chyba nie wiem, co się dziejel=x=>...
Kevin Fegan
@KevinFegan - Zgaduję, że nie używasz Firefoksa ... f=a=>bjest to funkcja ES6, która jest w zasadzie skrócona function f(a) { b }i jest obecnie obsługiwana tylko przez (?) Firefox.
Alconja,
Tak, używam IE 9 i to zdecydowanie nie działa tutaj. Spróbuję w przeglądarce Firefox. Dzięki.
Kevin Fegan
1

JavaScript (ES6) 184

Jak zwykle, w teście FireFox konsoli i zmiany alertdo console.loglub być przygotowany do druku escape200 razy.

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);
edc65
źródło
Nie wiem o konsoli, ale strony internetowe są dozwolone tylko 5 bezpłatnych alertów, zanim Firefox zacznie oferować ich wyłączenie: mxr.mozilla.org/mozilla-central/…
Neil
@Neil oczywiście, ale oferowanie wyłączenia nie wyłącza. Nie powinieneś cieszyć się 200 (lub więcej codegolf.stackexchange.com/a/32278/21348 ) oknami wyskakującymi?
edc65
1

Python3, 257 znaków

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

Przykładowe dane wyjściowe:

# python3 shortened.py
EUN-215
546-SIL
464-ZTR
XIX-794
Cristian Ciupitu
źródło
1
Możesz zapisać bajt, oddzielając linie 5 i 6 ;zamiast \n .
undergroundmonorail
@undergroundmonorail, masz rację, dziękuję!
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);

to 100 znaków mniej niż obecne 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);

mam nadzieję że ci się spodoba. W przypadku, gdy jest to dozwolone:

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

ma tylko 141 znaków, ale nie przetasowuje znaków i liczb. Wszelkie sugestie mile widziane :)

Christoph
źródło
1

F #, 264 znaków

Nie jest to język przeznaczony do gry w golfa, ale jestem pewien, że można to poprawić. Używanie Seq.exists z lambda jest dość denerwujące, podobnie jak wiele parenów i brak niejawnej konwersji.

Korzysta z rekurencji, działa wiecznie.

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

Może być uruchamiany w FSI.

Grant Crofton
źródło
1

Python 203

Nie jestem pewien, czy to się liczy technicznie, ale mi się podobało, więc i tak to publikuję. Podczas gdy generuję odpowiedzi pseudolosowo, podobnie jak wszyscy inni, strategicznie wybrałem losowe ziarno, aby nieprawidłowe odpowiedzi nie trafiły do ​​wyniku. Tak więc moja odpowiedź nie jest w stanie wygenerować całego zestawu prawidłowych odpowiedzi, bez wygenerowania nieprawidłowych.

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]
Matt
źródło
1

Perl - 123 znaków

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

Nie golfowany:

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

Jeśli ktoś ma pomysły na grę w golfa, daj mi znać, jestem zainteresowany. Jeśli chcesz uzyskać dodatkowe wyjaśnienie części kodu, zostaw komentarz, a ja chętnie wyjaśnię więcej.

hmatt1
źródło
1

JavaScript - 283 327 znaków

Edytować:

Po wdrożeniu sugestii Alconja , oto moja nowa wersja:

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) Usuń zmienną: si użyj literału: "\ n" [-4] [323]
2) Usuń "var o =" ", i, r, n, l," [-17] [306]
3) Usuń Zmienna: ti użyj literału: „ASS | KKK | SHT | 666” [-4] [302]
4) Ustaw m = Math.random i użyj zamiast tego „m” [-7] [296]
5) Użyj (m ( ) + „”) zamiast m (). toString () [-6] [290]
6) Usuń niepotrzebne „;” [-7] [283]



Stara wersja: JavaScript - 327 znaków

Jestem pewien, że jest miejsce na ulepszenia ... Jestem dość niedoświadczony w 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 */


Oto sformatowana wersja „Ungolfed” z nazwami „niezminimalizowanych” zmiennych / funkcji:

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



Oto wersja „debugowania”, którą można wkleić do adresu URL ulubionych / zakładek przeglądarki. Dane wyjściowe są umieszczane w „TEXTAREA” w nowym „oknie” zamiast „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();})()
/* */

Oto sformatowana wersja „debugowania”:

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();
}
)()
Kevin Fegan
źródło
2
Bez dotykania faktycznego algorytmu, oto kilka ogólnych wskazówek dotyczących gry w javascript: JavaScript nieodłącznie wybacza złą składnią, więc nie musisz go używać var(wystarczy przypisanie, 323 ), nie potrzebujesz ;s, chyba że pojawi się następna instrukcja (np. ostatni znak w wierszu lub przed a }, 316 ), uważaj na wszystko, co wymaga więcej miejsca do zadeklarowania / użycia niż tylko wstawianie (np. twoja szmienna, 312 ), podobnie jak na odwrót, jeśli coś jest używane więcej niż raz (np. Math.random(...)do r=Math.random ... r(...), 307 , (x+"")jest krótszy niż x.toString(), 300
Alconja
@Alconja - Dzięki za pomoc. Byłem w stanie zmniejszyć rozmiar o 44 znaki.
Kevin Fegan