¡Generame algunas placas apropiadas!


15

El escenario: usted es un diseñador de software que trabaja para una empresa administrada por el gobierno que diseña placas para automóviles y otros vehículos. Se le ha pedido que desarrolle software que genere placas de matrícula. Antes de ir a trabajar, tus jefes establecieron estas reglas básicas.


Una placa no puede contener:

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

Reglas y requisitos:

  • La matrícula debe ser generada al azar.
  • Una vez que se genera una matrícula aleatoria, la misma matrícula no puede generarse nuevamente.
  • Debe generar al menos 200 placas únicas . Puedes generar más si quieres .
  • Puede almacenar placas generadas en un archivo para "recordarlas".
  • La placa de matrícula contiene 2 secciones, una que contiene solo tres letras y otra que contiene solo tres números, separados por un guión, como este: 233-ADFo ADF-233.
  • Solo puede usar números y letras mayúsculas.
  • Las placas de matrícula se pueden escribir en stdout o en un archivo.
  • Cada "lado" de una placa contendrá tres números o letras.
  • Este es un , por lo que la respuesta más corta y más popular gana. El ganador será elegido después de siete días.

Reglas generales

  • La respuesta debe incluir, entre otros, lo siguiente.
  • Nombre del lenguaje.
  • Número de letras.
  • Tamaño del archivo.
  • Cómo se ejecuta el código.
  • El código en sí.
  • Ejemplo: caracteres Python 234 o Python 23mb .

Si necesito aclarar algún detalle adicional, menciónelo en los comentarios y lo agregaré a mi publicación. De todos modos, buena suerte, ¡y que me generen algunas placas apropiadas!


Actualización 1: el ganador será elegido un poco antes.

Resulta que tengo que hacer un viaje pronto, por lo que elegiré un ganador alrededor de las 00:00 UTC del 25 de julio. Después de que se elija el ganador, aún puede enviar entradas, solo sepa que se ha elegido un ganador. Bai


Actualización 2: ¡Ganadores!

¡Tenemos ganadores! ¡Hurra! ¡Queso y vino a todos los que participaron! Aquí está quién ganó.

  • 1er lugar: Àngel - Bash (95 caracteres)
  • 2do lugar: Martin Büttner - Mathematica (182 bytes)
  • 2do lugar: Emilio M Bumachar - Pyg (92?)
  • 2do lugar: Peter Taylor - Golfscript (98 caracteres)
  • 3er lugar: Mark Thomas - Ruby (127 caracteres)

Wow, tres empates en el segundo lugar. Guau. La competencia ha terminado, pero siéntase libre de enviar entradas si lo desea. Bai!



2
" Una vez que se genera una matrícula aleatoria, la misma matrícula no se puede generar de nuevo " . ¿Qué pasa con las matrículas no aleatorias?
Peter Taylor

44
La forma obvia de hacer esto (y probablemente la forma en que funciona en la vida real) es generar los números en orden.
Peter Taylor

55
"Generado aleatoriamente" es impreciso. Supongo que quiere decir "uniformemente seleccionado al azar de las matrículas legales no utilizadas" en lugar de, digamos, uniformemente seleccionado al azar de las matrículas legales que comienzanAAA-
Peter Taylor

1
indique cuántos dígitos debe haber en cada placa y qué caracteres son válidos; varía de un país a otro
Haskeller orgulloso

13
Ahora estoy un poco tentado a escribir un programa para generar placas aleatorias que contengan alguna cadena obscena o inapropiada que no se encuentre en su lista.
Ilmari Karonen

Respuestas:


12

bash (95 caracteres)

Guarde el script como men una carpeta en su RUTA con el conjunto de bits de ejecución.

Corre como bash m. Las placas se almacenan en el archivo 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

Esto es equivalente a ejecutar lo siguiente:

# 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 

Advertencia: la final mdebería ser exec m(+5 caracteres) para evitar dejar los procesos en espera de completarse (pero puede tener miles sin muchos problemas)

El crédito va a http://www.cyberciti.biz/faq/linux-random-password-generator/ por la idea de usartr -dc


¿Es para mí o falta el requisito de singularidad?
Cristian Ciupitu

1
@ Cristian-Ciupitu: grep -vexcluye tanto la lista negra como la lista de placas que ya generamos ( grepespera que p contenga un patrón por línea, pero como las placas no contienen metacaracteres de expresión regular, solo coinciden). Solo generamos una o cero placas por iteración, por lo que después de cada iteración, grep leerá la lista completa (actualizada) de placas para excluir. : 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))

Ahora puede seleccionar uniformemente de todas las placas no utilizadas, manteniendo las especificaciones de OP, mientras que es más corto en 1 carácter más.

Es teóricamente posible que la lista de 999 placas contenga suficientes repeticiones para que el conjunto recortado sea inferior a 200. Pero las probabilidades de que eso sea infinitesimal son pequeñas. En diez ensayos, la longitud más baja que obtuve fue 994.

EDITAR: cambió 999 a K (que es pyg por 1000), para guardar dos caracteres por recomendación de bitpwner.


1
¿Filtró los valores no permitidos? No veo ningún KKK o 666 en ningún lado.
Vectorizado el

55
@bitpwner: utilizo solo los dígitos del 0 al 5 y las letras de la A a la J, por lo que los valores no permitidos no pueden aparecer.
Emilio M Bumachar

¡Muy inteligente! Nadie dijo nunca que esos otros tenían que ser utilizados. Agradable.
Kjeld Schmidt

1
OP aceptó que la aleatoriedad se "seleccionara al azar de manera uniforme entre las placas legales no utilizadas". Ver comentarios en cuestión. A menos que su definición de uniforme signifique uniforme de cualquier rango. Y puede cambiar 999 a K, ahorrando u 2 caracteres.
Vectorizado

3
No estoy seguro de contar la salida como aleatoria si hay placas válidas que son imposibles de generar ...
Alconja

5

Mathematica, 182 bytes

Ugh, esto es largo

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

Sin golf

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

Muy claro. Genera placas aleatorias y filtra los duplicados y los prohibidos hasta encontrar 200.


5

GolfScript (98 caracteres)

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

Esto genera todas las placas posibles en un orden aleatorio usando una conversión de base fea seguida de filtrado. Hay muchos de ellos, así que no esperes que se ejecute rápidamente, pero la pregunta no impuso ninguna restricción en el tiempo de ejecución.


4

JavaScript (ES6) - 213

Probablemente se pueda mejorar. Probado en Firefox Console.

Cambie esa alerta a a console.log()si desea probar

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, esa tiene que ser la línea de código más larga que he visto.
DatEpicCoderGuyWhoPrograms

2
@DatEpicCoderGuyWhoPrograms obviamente no has visto mi regex JS de una sola línea de más de 400 caracteres;)
Eric Lagergren

@eric_lagergren Eso suena como si hubiera sido un dolor escribir ...
DatEpicCoderGuyWhoPrograms

3
@DatEpicCoderGuyWhoPrograms Puede escribirlo en varias líneas y luego eliminar los espacios en blanco innecesarios. Hay varios servicios en línea que ofrecen ese + otro acortamiento (reemplazando nombres de funciones / var, etc.) para reducir el tamaño de los archivos js y, posteriormente, ahorrar ancho de banda.
SBoss

1
@DatEpicCoderGuyWhoPrograms optimiza después. Descubro cómo resolver correctamente el problema, luego trato de encontrar accesos directos y finalmente optimizo mi código: P mucho más simple
Eric Lagergren

4

Ruby - 136 133 129 caracteres

Horrible. Sin embargo, creo que hay margen de mejora. Simplemente suelte el código irbo prypresione Enter para ejecutar:

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 caracteres

Mi intento de una versión "legible" de 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

Tenga en cuenta que esto genera placas conformes , pero no generará el conjunto completo de placas posibles (como con la mayoría de estas respuestas). Eso no parece ser un requisito.
Mark Thomas

4

Python 2.7 - 258 caracteres

No soy un programador profesional ni nada, entonces diría que estoy satisfecho con el resultado.

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

¡El tamaño del archivo es de 4.0 K, corre con python file.py!


¿No debería ser eso passun continue? También puede guardar algunos caracteres sangría con 1 espacio en lugar de 4.
Cristian Ciupitu

También for i in range(0,200):podría ser reemplazado por for i in range(200):.
Cristian Ciupitu

@CristianCiupitu No pude lograr que hiciera el 200 completo cuando lo usaba continue... Pero passfuncionó. Además, es más corto. Y cuando lo intenté for i in range(200), solo hizo 199 ^^ Los conté después haciendo una duplicatesvariable y poniendo duplicates += 1antes passy contando las ocurrencias -en la lista / cadena.
Adam

El rango @CristianCiupitu (200) funcionó después de todo: los 4 espacios en el bloque de código son en realidad \ty reemplazarlos por 1 espacio no cambió el recuento de caracteres ... ¡Gracias por las sugerencias!
Adam

1
Un usuario sugirió en una edición sugerida simplemente eliminar if k in t: pass, ya que no hace nada.
Pomo de la puerta

3

Python - 208

Hola, he aquí mi puñalada en la generación de matrículas. Esta solución es similar a la solución de @ bitpwner pero sin el módulo de cadena y en lugar de una lista para la placa elegí usar un conjunto y también permite números primero.

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)

Salida de muestra:

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

3

Python, 252 bytes

Aquí está mi contribución. Estoy impresionado con eso, pero sé que otros lo han hecho mejor con Python.

from random import randint as r
f=()
while len(f)<200:
 t=str(r(0,999))
 if not("666" in t or "69" in t):
  u=''.join(chr(r(65,90)) for _ in [1,2,3])
  if not("KKK" in u or "SHT" in u or "ASS" in u):f+=("%s-%s"%(t.zfill(3),u),)
 f=tuple(set(f))
print f

2

Python - 165

Esas importaciones ...

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

Si es necesario comenzar al azar con números o alfabetos, lo cual no creo que sea realmente necesario, entonces 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

¿Caracteres o bytes?
DatEpicCoderGuyWhoPrograms


Cuento 208 caracteres, y ¿su solución permite números primero?
Willem

@willem Los cuatro espacios para la sangría son en realidad pestañas, y los alfabetos solo primero.
Vectorizado

2

PHP 341 324 320

Fue lo mejor que pude hacer.

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

Para ejecutar el código, simplemente guárdelo como un archivo .php y busque en cualquier servidor web. Intentará crear el archivo de lista negra p.txt si aún no existe. Sin embargo, es posible que deba definirlo con una ruta completa del servidor si no tiene acceso de root.

El código en sí está aquí antes de la golfificación:

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

Fue lo más corto que pude conseguir :-(

Salida de muestra

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.

EDITAR: ordenó un par de declaraciones if para usar la forma corta.


Si las placas no tienen que estar mezcladas, es decir, pueden ser números y solo letras, podría perder esta línea $string = (rand(1,2)==1) ? "$rand_number-$letters" : "$letters-$rand_number";
Paul Drewett

1
Puede usar un nombre de archivo de un solo carácter (p. Ej., P en lugar de p.txt) y guardar 4 caracteres también.
Mark

@ Mark No sabía que pudieras hacer eso. Lo probé y funcionó bien. Lea sobre las extensiones de archivo y no funcionan exactamente como yo pensaba. Gracias, eso fue muy interesante.
Paul Drewett

1

Delphi, 161 bytes

Aquí está mi opinión sobre esto. Produce placas de matrícula en stdout sin avance de línea entre ellas. Si se necesita LF (no especificado en las reglas), eso agrega 4 bytes adicionales.

Versión de golf:

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.

Sin golf:

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.

Como correr:

app.exe > plates.txt

1

PHP, 267

Esto es lo más corto que puedo obtener.

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

Las placas se almacenan en el archivo "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 caracteres

Estoy seguro de que esto podría mejorarse:

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

Ejecutar en la consola, imprime una lista de placas.


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

Advertencia : 200 cuadros de diálogo de alerta (el cambio alertde console.loga prueba)

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

Editar : ¡Vaya! Versión original impresa duplicados ...

Edición 2 : ahora más cerca de la partitura original: cambió de un conjunto a una matriz asociativa con algunos cheques duplicados que le permiten imprimir a medida que avanza

Probado en la consola de Firefox.


Felicidades por mejorar mi solución
William Barbosa

Me estoy poniendo un "error de sintaxis" en: l=x=>String.fromCharCode(65+r()*26);. Supongo que no sé qué está pasandol=x=>...
Kevin Fegan

@KevinFegan - Supongo que no estás usando Firefox ... f=a=>bes una función ES6 que es básicamente abreviada function f(a) { b }y solo es (?) Compatible con Firefox en este momento.
Alconja

Sí, estoy usando IE 9, y definitivamente no funciona aquí. Lo intentaré en Firefox. Gracias.
Kevin Fegan

1

JavaScript (ES6) 184

Como de costumbre, prueba en FireFox consola y el cambio alerta console.logo estar preparado para prensa escape200 veces.

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

No sé acerca de la consola, pero las páginas web solo tienen 5 alertas gratuitas antes de que Firefox comience a ofrecer deshabilitarlas: mxr.mozilla.org/mozilla-central/…
Neil

@Neil, por supuesto, pero ofrecer deshabilitar no es deshabilitar. ¿No deberías disfrutar de 200 (o más codegolf.stackexchange.com/a/32278/21348 ) popups?
edc65

1

Python3, 257 caracteres

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

Salida de muestra:

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

1
Puede guardar un byte separando las líneas 5 y 6 en ;lugar de \n .
undergroundmonorail

@undergroundmonorail, tienes razón, ¡gracias!
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);

eso es 100 caracteres menos que el mejor PHP actual :)

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

Espero que te guste. En caso de que esté permitido:

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

son solo 141 caracteres pero no mezcla caracteres y números. Cualquier sugerencia bienvenida :)


1

F #, 264 caracteres

No es realmente un lenguaje diseñado para jugar al golf, pero estoy seguro de que esto podría mejorarse. Usar Seq.exists con una lambda es bastante molesto, como lo son los muchos parens y la falta de conversión implícita.

Utiliza la recursividad, continúa para siempre.

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

Se puede ejecutar en FSI.


1

Python 203

No estoy seguro de si esto técnicamente cuenta, pero me gustó, así que lo publico de todos modos. Si bien genero las respuestas pseudoaleatoriamente, como lo hicieron casi todos los demás, elegí estratégicamente la semilla aleatoria de modo que las respuestas no válidas no terminaran en la salida. Entonces, mi respuesta no es capaz de generar el conjunto completo de respuestas válidas, sin generar también las inválidas.

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 caracteres

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

Sin golf:

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

Si alguien tiene ideas para jugar más golf, hágamelo saber, estoy interesado. Si desea una explicación más detallada de parte del código, deje un comentario y me complacería explicarle más.


1

Javascript - 283 327 caracteres

Editar:

Después de implementar las sugerencias de Alconja , aquí está mi nueva versión:

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) Eliminar Variable: sy usar literal: "\ n" [-4] [323]
2) Eliminar "var o =" ", i, r, n, l," [-17] [306]
3) Eliminar Variable: ty usar literal: "ASS | KKK | SHT | 666" [-4] [302]
4) Establezca m = Math.random y use "m" en su lugar [-7] [296]
5) Use (m ( ) + "") en lugar de m (). toString () [-6] [290]
6) Eliminar innecesariamente ";" [-7] [283]



Versión antigua: Javascript - 327 caracteres

Estoy seguro de que hay espacio para mejorar ... Soy bastante inexperto en Code-golf:

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


Aquí hay una versión formateada, "Ungolfed" con nombres de variables / funciones "no minificados":

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



Aquí hay una versión de "depuración" que se puede pegar en la URL del favorito / marcador del navegador. La salida se coloca en una "TEXTAREA" en una nueva "ventana" en lugar de "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();})()
/* */

Aquí está la versión "depuración", formateada:

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
Sin tocar su algoritmo real, aquí hay algunos consejos genéricos de golf javascript: Javascript es inherentemente indulgente con una sintaxis incorrecta, por lo que no necesita usar var(solo asignar, 323 ), no necesita ;s a menos que haya otra declaración siguiente (p. ej., el último carácter de la línea, o antes de un }, 316 ), busque cualquier cosa que requiera más espacio para declarar / usar que solo en línea (p. ej., su svariable, 312 ), lo mismo ocurre con el reverso si se usa algo más que . una vez (por ejemplo, Math.random(...)a r=Math.random ... r(...), 307 , (x+"")es más corta que x.toString(), 300
Alconja

@Alconja - Gracias por la ayuda. Pude reducir el tamaño en 44 caracteres.
Kevin Fegan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.