Generiere mir ein paar passende Nummernschilder!


15

Das Szenario: Sie sind ein Software-Designer, der für ein von der Regierung geführtes Unternehmen arbeitet, das Kennzeichen für Autos und andere Fahrzeuge entwirft. Sie wurden gebeten, Software zur Generierung von Kennzeichen zu entwickeln. Bevor Sie zur Arbeit gingen, legten Ihre Vorgesetzten diese Grundregeln fest.


Ein Kennzeichen darf nicht enthalten:

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

Regeln und Anforderungen:

  • Das Kennzeichen muss zufällig generiert werden.
  • Sobald ein zufälliges Kennzeichen generiert wurde, kann dasselbe Kennzeichen nicht erneut generiert werden.
  • Sie müssen mindestens 200 eindeutige Kennzeichen ausgeben . Sie können mehr generieren, wenn Sie möchten .
  • Sie können erzeugte Platten in einer Datei speichern, um sie zu "merken".
  • Das Nummernschild enthält zwei Abschnitte, von denen einer nur drei Buchstaben und einer nur drei durch einen Bindestrich getrennte Ziffern enthält: 233-ADFoder ADF-233.
  • Sie können nur Ziffern und Großbuchstaben verwenden.
  • Kennzeichen können auf stdout oder in eine Datei geschrieben werden.
  • Jede "Seite" eines Kennzeichens enthält entweder drei Zahlen oder Buchstaben.
  • Dies ist ein , also gewinnt die kürzeste und beliebteste Antwort. Der Gewinner wird nach sieben Tagen ermittelt.

Allgemeine Regeln

  • Die Antwort sollte Folgendes umfassen, ist jedoch nicht darauf beschränkt.
  • Sprache Name.
  • Zeichenanzahl.
  • Dateigröße.
  • Wie der Code ausgeführt wird.
  • Der Code selbst.
  • Beispiel: Python 234 Zeichen oder Python 23mb .

Wenn ich zusätzliche Details klären muss, erwähne dies bitte in den Kommentaren und ich werde es meinem Beitrag hinzufügen. Wie auch immer, viel Glück und generiere mir ein paar passende Nummernschilder!


Update 1: Der Gewinner wird etwas früher ausgewählt.

Es stellt sich heraus, dass ich bald auf eine Reise gehen muss, sodass ich gegen 00:00 UTC, den 25. Juli, einen Gewinner auswähle. Nachdem der Gewinner ausgewählt wurde, können Sie noch weitere Beiträge einreichen. Sie müssen nur wissen, dass ein Gewinner ausgewählt wurde. Bai.


Update 2: Gewinner!

Wir haben Gewinner! Yay! Käse und Wein an alle, die teilgenommen haben! Wer hat gewonnen?

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

Wow, drei zweite Plätze. Beeindruckend. Der Wettbewerb ist vorbei, aber Sie können jederzeit Beiträge einreichen, wenn Sie möchten. Bai!



2
" Sobald ein willkürliches Kennzeichen generiert wurde, kann dasselbe Kennzeichen nicht erneut generiert werden. " Was ist mit nicht willkürlichen Kennzeichen?
Peter Taylor

4
Der naheliegende Weg, dies zu tun (und wahrscheinlich die Art und Weise, wie es im wirklichen Leben funktioniert), besteht darin, die Zahlen in der richtigen Reihenfolge zu generieren.
Peter Taylor

5
"Zufällig generiert" ist ungenau. Ich nehme an, Sie „einheitlich ausgewählt zufällig aus den ungenutzten Rechtskennzeichen“ bedeuten , eher als, sagen wir, gleichmäßig zufällig aus den gesetzlichen Kennzeichen ausgewählt beginnenAAA-
Peter Taylor

1
bitte geben sie an, wie viele
ziffern auf jedem teller

13
Ich bin jetzt etwas versucht, ein Programm zu schreiben, um zufällige Nummernschilder zu generieren, die obszöne oder auf andere Weise unpassende Zeichenfolgen enthalten, die nicht in Ihrer Liste enthalten sind.
Ilmari Karonen

Antworten:


12

Bash (95 Zeichen)

Speichern Sie das Skript min einem Ordner in Ihrem PATH mit gesetztem Ausführungsbit.

Führen Sie so bash m. Die Platten werden in der Datei p gespeichert

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

Dies entspricht der Ausführung von:

# 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 

Vorsichtsmaßnahme: Das Finale msollte eigentlich exec m(+5 Zeichen) sein, um zu vermeiden, dass Prozesse auf den Abschluss warten (aber Sie können Tausende ohne große Probleme haben).

Die Idee der Verwendung ist http://www.cyberciti.biz/faq/linux-random-password-generator/ zu verdankentr -dc


Ist es für mich oder fehlt das Erfordernis der Einzigartigkeit?
Cristian Ciupitu

1
@ Cristian-Ciupitu: Das grep -vschließt sowohl die Blacklist als auch die Liste der bereits generierten Platten aus ( greperwartet, dass p ein Muster pro Zeile enthält, aber da die Platten keine Metazeichen mit regulären Ausdrücken enthalten, stimmen sie nur mit sich selbst überein). Wir generieren nur eine oder null Platten pro Iteration, daher wird nach jeder Iteration die vollständige (aktualisierte) Liste der auszuschließenden Platten von grep gelesen. : 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))

Es ist jetzt möglich, aus allen unbenutzten Platten einheitlich zu wählen, wobei die OP-Spezifikationen eingehalten werden. Gleichzeitig ist die Platte um 1 Zeichen kürzer.

Theoretisch ist es möglich, dass die Liste der 999 Tafeln genügend Wiederholungen enthält, sodass der zugeschnittene Satz weniger als 200 beträgt. Die Wahrscheinlichkeit dafür ist jedoch unendlich gering. In zehn Versuchen war die niedrigste Länge 994.

BEARBEITEN: 999 in K geändert (was pyg für 1000 ist), um zwei Zeichen auf Anraten von bitpwner zu speichern.


1
Haben Sie die unzulässigen Werte herausgefiltert? Sehen Sie nirgendwo KKK oder 666.
Vectorized

5
@bitpwner: Ich verwende nur die Ziffern von 0 bis 5 und die Buchstaben von A bis J, daher können die nicht zulässigen Werte nicht vorkommen.
Emilio M Bumachar

Sehr schlau! Niemand hat jemals gesagt, dass diese anderen benutzt werden müssen. Nett.
Kjeld Schmidt

1
OP erklärte sich damit einverstanden, dass die Zufälligkeit "einheitlich nach dem Zufallsprinzip aus den nicht verwendeten gesetzlichen Kennzeichen ausgewählt" wird. Siehe Kommentare in Frage. Es sei denn, Ihre Definition von Uniform bedeutet Uniform aus jedem Bereich. Und Sie können 999 in K ändern und 2 Zeichen sparen.
Vectorized

3
Ich bin nicht sicher, ob ich die Ausgabe als zufällig zählen würde, wenn es gültige Kennzeichen gibt, die nicht generiert werden können ...
Alconja,

5

Mathematica, 182 Bytes

Ugh, das ist lang

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

Ziemlich einfach. Erzeugt zufällige Platten und filtert Duplikate und verbotene heraus, bis 200 gefunden werden.


5

GolfScript (98 Zeichen)

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

Dies erzeugt alle möglichen Nummernschilder in zufälliger Reihenfolge unter Verwendung einer unschönen Basisumwandlung, gefolgt von einer Filterung. Es gibt viele davon. Erwarten Sie also nicht, dass es schnell ausgeführt wird, aber die Frage hat die Ausführungszeit nicht eingeschränkt.


4

JavaScript (ES6) - 213

Es kann wahrscheinlich verbessert werden. Getestet auf der Firefox-Konsole.

Ändern Sie diese Warnung in a, console.log()wenn Sie testen möchten

r=x=>~~(Math.random()*x)+'';l=x=>[...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'][r(26)];a=[];while(a.length<200)p=r(10)+r(10)+r(10)+'-'+l()+l()+l(),!/ASS|666|69|KKK|SHT/.test(p)&&a.indexOf(p)<0&&a.push(p);a.forEach(x=>alert(x))

Wow, das muss die längste einzelne Codezeile sein, die ich je gesehen habe.
DatEpicCoderGuyWhoPrograms

2
@DatEpicCoderGuyWhoPrograms Sie haben offensichtlich nicht meine 400+ Zeichen einzeilige JS Regex gesehen;)
Eric Lagergren

@eric_lagergren Das klingt wie es wäre ein Schmerz gewesen zu schreiben ...
DatEpicCoderGuyWhoPrograms

3
@DatEpicCoderGuyWhoPrograms Sie können es über mehrere Zeilen schreiben und dann die unnötigen Leerzeichen entfernen. Es gibt mehrere Onlinedienste, die diese + andere Kürzung (Ersetzen von Funktions- / Variablennamen usw.) anbieten, um die Dateigröße von js zu verringern und anschließend Bandbreite zu sparen.
SBoss

1
@DatEpicCoderGuyWhoPrograms optimieren anschließend. Ich finde heraus, wie ich das Problem richtig lösen kann, versuche dann, Verknüpfungen zu finden, und optimiere schließlich meinen Code: P viel einfacher
Eric Lagergren

4

Ruby - 136 133 129 Zeichen

Abscheulich. Denke, es gibt Raum für Verbesserungen. Gib den Code einfach in irboder ein pryund drücke die Eingabetaste:

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

Rubin, 127 Zeichen

Mein Versuch einer "lesbaren" 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

Beachten Sie, dass hierdurch zwar kompatible Kennzeichen generiert werden , jedoch nicht der gesamte Satz möglicher Kennzeichen (wie bei den meisten dieser Antworten). Das scheint keine Voraussetzung zu sein.
Mark Thomas

4

Python 2.7 - 258 Zeichen

Ich bin kein professioneller Programmierer oder so, also würde ich sagen, dass ich mit dem Ergebnis zufrieden bin.

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

Dateigröße ist 4.0 K, laufe mit python file.py!


Sollte das nicht passein sein continue? Sie können auch Zeichen sparen, indem Sie anstelle von 4 eine 1
einrücken.

Auch for i in range(0,200):könnte mit ersetzt werden for i in range(200):.
Cristian Ciupitu

@CristianCiupitu Ich konnte es nicht schaffen, die vollen 200 zu erreichen, wenn ich es benutze continue. Aber passhabe den Trick gemacht. Außerdem ist es kürzer. Und wenn ich versuchte for i in range(200), es habe nur 199 ^^ ich sie danach gezählt durch eine Herstellung duplicatesvariabel und setzen duplicates += 1vor passund die Vorkommen für das Zählen -in der Liste / string.
Adam

@CristianCiupitu range (200) funktionierte immerhin - die 4 Leerzeichen im Codeblock sind tatsächlich \tund das Ersetzen durch 1 Leerzeichen hat die Zeichenanzahl nicht verändert ... Danke für die Vorschläge!
Adam

1
Ein Benutzer schlug in einem Bearbeitungsvorschlag vor, einfach zu entfernen if k in t: pass, da er nichts tut.
Türklinke

3

Python - 208

Hallo hier ist mein Stab an der Kfz-Kennzeichen-Generation. Diese Lösung ähnelt der Lösung von @ bitpwner, jedoch ohne das String-Modul. Statt einer Liste für das Nummernschild habe ich mich für die Verwendung eines Sets entschieden und erlaubt zuerst auch Nummern.

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)

Beispielausgabe:

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

3

Python, 252 Bytes

Hier ist mein Beitrag. Ich bin beeindruckt, aber ich weiß, dass andere mit Python besser abschneiden.

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

Diese Einfuhren ...

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

Wenn es notwendig ist, willkürlich mit Zahlen oder Buchstaben zu beginnen, was ich nicht wirklich für nötig halte, dann 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

Zeichen oder Bytes?
DatEpicCoderGuyWhoPrograms


Ich zähle 208 Zeichen. Erlaubt Ihre Lösung zuerst Zahlen?
Willem

@willem Die vier Leerzeichen für den Einzug sind eigentlich Tabulatoren und nur Alphabete.
Vectorized

2

PHP 341 324 320

War das Beste, was ich tun konnte.

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

Um den Code auszuführen, speichern Sie ihn einfach als .php-Datei und suchen Sie ihn auf einem beliebigen Webserver. Es wird versucht, die Blacklist-Datei p.txt zu erstellen, falls diese noch nicht existiert. Möglicherweise müssen Sie jedoch einen vollständigen Serverpfad angeben, wenn Sie keinen Root-Zugriff haben.

Der Code selbst ist hier vor dem Golfspielen:

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

War so kurz wie ich es kriegen konnte :-(

Beispielausgabe

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.

BEARBEITEN: Einige if-Anweisungen wurden aufgeräumt, um die Kurzform zu verwenden.


Wenn die Platten nicht $string = (rand(1,2)==1) ? "$rand_number-$letters" : "$letters-$rand_number";
Paul Drewett

1
Sie können einen Dateinamen mit einem Zeichen verwenden (z. B. p anstelle von p.txt) und sich auch 4 Zeichen sparen.
Mark

@ Mark Ich wusste nicht, dass Sie das tun können. Getestet und es hat gut funktioniert. Informieren Sie sich über Dateierweiterungen und sie funktionieren nicht so, wie ich es mir vorgestellt habe. Danke, das war sehr interessant.
Paul Drewett

1

Delphi, 161 Bytes

Hier ist meine Meinung dazu. Es gibt Nummernschilder ohne Zeilenvorschub zwischen ihnen auf stdout aus. Wenn LF benötigt wird (in den Regeln nicht angegeben), werden dadurch zusätzliche 4 Bytes hinzugefügt.

Golf 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.

Wie läuft man:

app.exe > plates.txt

1

PHP, 267

Dies ist ungefähr so ​​kurz wie ich es bekommen kann.

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

Die Platten werden in der Datei "p" gespeichert.

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

Ich bin sicher, dass dies verbessert werden könnte:

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

In der Konsole ausführen, druckt eine Liste der Nummernschilder.


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

Warnung : 200 Alarm - Dialoge (Änderung alertan console.logzu 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 : Ups. Originalversion gedruckt Duplikate ...

Edit 2 : Näher an der ursprünglichen Partitur - von einem Satz zu einem assoziativen Array gewechselt, mit einigen fehlerhaften doppelten Überprüfungen, die es ermöglichen, dass es während des Druckvorgangs gedruckt wird

Getestet in der Firefox-Konsole.


Herzlichen Glückwunsch zur Verbesserung meiner Lösung
William Barbosa

Ich erhalte einen „Syntaxfehler“ auf: l=x=>String.fromCharCode(65+r()*26);. Ich glaube, ich weiß nicht, was passiert mitl=x=>...
Kevin Fegan

@KevinFegan - Ich vermute, Sie verwenden Firefox nicht. Dies f=a=>bist eine ES6-Funktion, die im Grunde genommen eine Abkürzung ist function f(a) { b }und derzeit nur von Firefox (?) Unterstützt wird.
Alconja

Ja, ich verwende IE 9 und es funktioniert hier definitiv nicht. Ich werde es auf Firefox versuchen. Vielen Dank.
Kevin Fegan

1

JavaScript (ES6) 184

Testen Sie wie gewohnt in der FireFox-Konsole und wechseln Sie alertzu console.logoder sind Sie bereit, escape200-mal zu drücken .

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

Ich kenne die Konsole nicht, aber auf Webseiten sind nur 5 kostenlose Benachrichtigungen zulässig, bevor Firefox anbietet, sie zu deaktivieren: mxr.mozilla.org/mozilla-central/…
Neil

@Neil natürlich, aber das Angebot zu deaktivieren ist nicht deaktivieren. Sollten Sie nicht 200 (oder mehr codegolf.stackexchange.com/a/32278/21348 ) Popups genießen ?
EDC65

1

Python3, 257 Zeichen

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

Beispielausgabe:

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

1
Sie können ein Byte speichern, indem Sie die Zeilen 5 und 6 durch ;anstelle von trennen \n .
Undergroundmonorail

@undergroundmonorail, du hast recht, danke!
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);

das sind 100 Zeichen weniger als die derzeit besten von 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);

hoffe du magst es. Falls es erlaubt ist:

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

beträgt nur 141 Zeichen, mischt jedoch keine Zeichen und Zahlen. Anregungen willkommen :)


1

F #, 264 Zeichen

Eigentlich keine Golfsprache, aber ich bin mir sicher, dass dies verbessert werden könnte. Die Verwendung von Seq.exists mit einem Lambda ist ziemlich ärgerlich, ebenso wie die vielen Parens und das Fehlen einer impliziten Konvertierung.

Verwendet Rekursion und bleibt für immer bestehen.

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

Kann in FSI ausgeführt werden.


1

Python 203

Ich bin mir nicht sicher, ob dies technisch zählt, aber ich mochte es und poste es trotzdem. Während ich die Antworten pseudozufällig generiere, habe ich, wie so ziemlich alle anderen, strategisch den Zufallssamen ausgewählt, damit ungültige Antworten nicht in der Ausgabe landen. Meine Antwort kann also nicht alle gültigen Antworten generieren, ohne auch die ungültigen zu generieren.

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 Zeichen

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

Wenn jemand Ideen hat, um weiter Golf zu spielen, lass es mich wissen, ich bin interessiert. Wenn Sie weitere Erklärungen zu einem Teil des Codes wünschen, hinterlassen Sie einen Kommentar, und ich würde gerne weitere Erklärungen abgeben.


1

Javascript - 283 327 Zeichen

Bearbeiten:

Nach der Umsetzung der Vorschläge von Alconja ist hier meine neue 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) Entfernen Sie Variable: s und verwenden Sie Literal: "\ n" [-4] [323]
2) Entfernen Sie "var o =", i, r, n, l, "[-17] [306]
3) Entfernen Sie Variable: t und verwende Literal: "ASS | KKK | SHT | 666" [-4] [302]
4) Setze m = Math.random und verwende stattdessen "m" [-7] [296]
5) Verwende (m ( ) + "") anstelle von m (). toString () [-6] [290]
6) Entfernen Sie nicht benötigtes ";" [-7] [283]



Alte Version: Javascript - 327 Zeichen

Ich bin mir sicher, dass es noch Verbesserungspotential gibt ... Ich bin ziemlich unerfahren im Code-Golfen:

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


Hier ist eine formatierte "Ungolfed" -Version mit "nicht minimierten" Variablen- / Funktionsnamen:

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



Hier ist eine "Debug" -Version, die in die URL des Browser-Favoriten / Lesezeichens eingefügt werden kann. Die Ausgabe erfolgt in einer "TEXTAREA" in einem neuen "Fenster" anstelle von "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();})()
/* */

Hier ist die "Debug" -Version, formatiert:

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
Hier sind ein paar generische JavaScript-Golftipps, ohne Ihren eigentlichen Algorithmus zu berühren: Javascript verzeiht von Natur aus mit falscher Syntax . Sie müssen also nicht s verwenden var(nur das Zuweisen reicht aus, 323 ), es ;sei denn, es folgt eine andere Anweisung (zB das letzte Zeichen in der Zeile oder vor a }, 316 ), achten Sie auf alles, was mehr Platz zum Deklarieren / Verwenden benötigt als nur Inline (zB Ihre sVariable, 312 ), ebenso auf das Umgekehrte, wenn etwas mehr als verwendet wird . einmal ( zum Beispiel Math.random(...)zu r=Math.random ... r(...), 307 , (x+"")kürzer als x.toString(), 300
Alconja

@Alconja - Danke für die Hilfe. Ich konnte die Größe um 44 Zeichen reduzieren.
Kevin Fegan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.