Создайте мне несколько соответствующих номерных знаков!


15

Сценарий: вы - разработчик программного обеспечения, работающий в правительственной компании, которая разрабатывает номерные знаки для автомобилей и других транспортных средств. Вас попросили разработать программное обеспечение, которое генерирует номерные знаки. Прежде чем вы приступили к работе, ваши начальники установили эти основные правила.


Номерной знак не может содержать:

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

Правила и требования:

  • Номерной знак должен быть сгенерирован случайным образом.
  • Как только случайный номерной знак сгенерирован, тот же номерной знак не может быть сгенерирован снова.
  • Вы должны вывести не менее 200 уникальных номерных знаков. Вы можете генерировать больше, если хотите .
  • Вы можете хранить сгенерированные пластины в файле, чтобы «запомнить» их.
  • Номерной знак содержит 2 раздела, один из которых содержит только три буквы, а другой содержит только три числа, разделенных тире, например: 233-ADFили ADF-233.
  • Вы можете использовать только цифры и заглавные буквы.
  • Номерные знаки могут быть записаны на стандартный вывод или файл.
  • Каждая «сторона» номерного знака будет содержать либо три цифры, либо буквы.
  • Это , поэтому самый короткий, самый популярный, выигрывает ответ. Победитель будет выбран через семь дней.

Основные правила

  • Ответ должен включать, но не ограничиваться следующим.
  • Название языка.
  • Количество символов
  • Размер файла.
  • Как выполняется код
  • Сам код.
  • Пример: Python 234 символа или Python 23mb .

Если мне нужно уточнить какие-либо дополнительные детали, пожалуйста, укажите это в комментариях, и я добавлю это в свой пост. В любом случае, удачи, и создайте мне несколько соответствующих номерных знаков!


Обновление 1: Победитель будет выбран чуть раньше.

Оказывается, я должен скоро отправиться в поездку, поэтому я буду выбирать победителя около 00:00 UTC, 25 июля. После того, как победитель выбран, вы все равно можете подавать заявки, просто знайте, что победитель выбран. Бай.


Обновление 2: Победители!

У нас есть победители! Ура! Сыр и вино всем, кто участвовал! Вот кто победил.

  • 1 место: Анхель - Баш (95 знаков)
  • 2 место: Мартин Бюттнер - Mathematica (182 байта)
  • 2 место: Эмилио М Бумачар - Пиг (92?)
  • 2 место: Питер Тейлор - Golfscript (98 знаков)
  • 3 место: Марк Томас - Руби (127 знаков)

Ух, три вторых места связи. Вау. Конкурс окончен, но вы можете подать заявку, если хотите. Бай!



2
« Как только случайный номерной знак сгенерирован, тот же номерной знак не может быть сгенерирован снова. » Как насчет неслучайных номерных знаков?
Питер Тейлор

4
Очевидный способ сделать это (и, вероятно, способ, которым это работает в реальной жизни), состоит в том, чтобы генерировать числа в порядке.
Питер Тейлор

5
«Произвольно сгенерированный» является неточным. Я предполагаю, что вы имеете в виду «равномерно выбранный случайным образом из неиспользованных законных номерных знаков», а не, скажем, равномерно выбранный случайным образом из начала законных номерных знаковAAA-
Питер Тейлор

1
скажите, пожалуйста, сколько цифр должно быть на каждой табличке, и какие символы действительны - это варьируется от страны к стране
гордый haskeller

13
Теперь у меня возникает соблазн написать программу для генерации случайных номерных знаков, которые содержат нецензурную или неприемлемую строку, которой нет в вашем списке.
Илмари Каронен

Ответы:


12

Баш (95 символов)

Сохранить скрипт как m в папке в вашем PATH с установленным битом выполнения.

Запустить как bash m. Пластины хранятся в файле р

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

Это эквивалентно выполнению следующего:

# Print three random numbers and three random letters
echo $(tr -dc 0-9 < /dev/urandom | head -c3)-$(tr -dc A-Z < /dev/urandom | head -c3) |

# Print only plates not matching the blacklist or any line of p
# Append the plates ton p
egrep -v -e "ASS|666|69|KKK|SHT" -f p >> p

# Execute itself again
m 

Предостережение: Финал mдолжен быть exec m(+5 символов), чтобы не оставлять процессы в ожидании завершения (но вы можете иметь тысячи без особых проблем)

Кредит идет на http://www.cyberciti.biz/faq/linux-random-password-generator/ за идею использованияtr -dc


Это для меня или требование уникальности отсутствует?
Кристиан Чиупиту

1
@ Кристиан-Чиупиту: grep -v исключает как черный список, так и список уже сгенерированных табличек ( grepожидается, что p будет содержать по одному шаблону на строку, но, поскольку таблички не содержат метасимволов регулярных выражений, они соответствуют друг другу). Мы генерируем только одну или ноль пластин за одну итерацию, поэтому после каждой итерации полный (обновленный) список исключаемых пластин будет считываться grep. : D
Анхель

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

Теперь можно выбирать равномерно из всех неиспользованных планшетов, сохраняя спецификации ОП, при этом будучи короче еще на 1 символ.

Теоретически возможно, что список из 999 пластин будет содержать достаточно повторений, так что обрезанный набор будет меньше 200. Но шансы на это бесконечно малы. В десяти испытаниях самая низкая длина, которую я получил, была 994.

РЕДАКТИРОВАТЬ: изменил 999 на K (что pyg для 1000), чтобы сохранить два символа по совету bitpwner.


1
Вы отфильтровали запрещенные значения? Не вижу ни ККК, ни 666 нигде.
Векторизовано

5
@bitpwner: я использую только цифры от 0 до 5 и буквы от A до J, поэтому запрещенные значения не могут появиться.
Эмилио М Бумачар

Очень умно! Никто никогда не говорил, что эти другие должны быть использованы. Ницца.
Кьельд Шмидт

1
ОП согласился с тем, что случайность «равномерно выбирается случайным образом из неиспользованных легальных номерных знаков». Смотрите комментарии в вопросе. Если только ваше определение униформы не означает униформу из любого диапазона. И вы можете изменить 999 на K, сэкономив 2 символа.
векторизация

3
Не уверен, что я
посчитал

5

Mathematica, 182 байта

Тьфу, это долго

l={};While[Length[l=Union@Pick[l,StringFreeQ[l,"ASS"|"666"|"69"|"KKK"|"SHT"]]]<200,AppendTo[l,RandomSample[FromCharacterCode/@{48+9~(r=RandomInteger)~3,65+25~r~3}]~Riffle~"-"<>""]];l

Ungolfed

l = {};
While[
  Length[
    l = Union@
      Pick[l, StringFreeQ[l, "ASS" | "666" | "69" | "KKK" | "SHT"]]
  ] < 200,
  AppendTo[l, 
   RandomSample[
      FromCharacterCode /@ {48 + 9~(r = RandomInteger)~3, 
        65 + 25~r~3}]~Riffle~"-" <> ""]
  ];
l

Довольно просто. Создает случайные таблички и отфильтровывает дубликаты и запрещенные до тех пор, пока не будут найдены 200.


5

GolfScript (98 символов)

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

Это генерирует все возможные номерные знаки в случайном порядке, используя некрасивое базовое преобразование с последующей фильтрацией. Их много, поэтому не ожидайте, что они будут выполняться быстро, но вопрос не накладывал никаких ограничений на время выполнения.


4

JavaScript (ES6) - 213

Это, вероятно, может быть улучшено. Протестировано на консоли Firefox.

Измените это предупреждение на, console.log()если вы хотите проверить

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

Вау, это должна быть самая длинная строка кода, которую я когда-либо видел.
DatEpicCoderGuyWhoPrograms

2
@DatEpicCoderGuyWhoPrograms Вы, очевидно, не видели моего регулярного выражения JS на 400+ символов;)
Эрик Лагергрен

@eric_lagergren Звучит так, будто писать было бы больно ...
DatEpicCoderGuyWhoPrograms

3
@DatEpicCoderGuyWhoPrograms Вы можете написать его в несколько строк, а затем удалить ненужные пробелы. Существует несколько онлайн-сервисов, которые предлагают + другое сокращение (замена имен функций / переменных и т. Д.), Чтобы уменьшить размеры файлов js и впоследствии сохранить пропускную способность.
SBoss

1
@DatEpicCoderGuyWhoPrograms оптимизировать впоследствии. Я выясняю, как правильно решить проблему, затем пытаюсь найти ярлыки, а затем, наконец, оптимизирую свой код: P намного проще
Эрик Лагергрен,

4

Рубин - 136 133 129 знаков

Уродство. Думаю, что есть возможности для улучшения. Просто введите код irbили pryнажмите Enter для запуска:

f=->*t{[0,1,2].map{t.sample}*''}
g=->l{(a=f[*?A..?Z]+?-+f[*?0..?9];l|=[a]if/69|666|ASS|SHT|KKK/!~a)until l.size>199;l}
puts g[[]]

4

Рубин, 127 символов

Моя попытка "читаемой" версии Ruby:

a=[]
until a.size==200 do
  p="#{rand(899)+100}-#{('A'..'Z').to_a.sample(3).join}"
  a<<p unless p=~/69|666|ASS|SHT|KKK/
end
puts a

Обратите внимание, что при этом создаются совместимые номерные знаки, но не генерируется весь набор возможных номеров (как в большинстве этих ответов). Это не кажется обязательным требованием.
Марк Томас

4

Python 2,7 - 258 символов

Я не профессиональный программист или что-то еще, поэтому я бы сказал, что доволен результатом.

import random as o
r=o.randint
t,j,k=[],0,""
b=["SHT","KKK","ASS","69","666"]
for i in range(200):
 l,j=b[0],b[4]
 while any(w in l for w in b):
  l,j="",""
  for i in range(3):
   l+=chr(r(65,90))
   j+=str(r(0,9))
 t.append(l+'-'+j)
print "\n".join(set(t))

Размер файла составляет 4,0 К, запустить с python file.py!


Разве это не должно passбыть continue? Вы также можете сохранить некоторые символы, сделав отступ с 1 пробелом вместо 4.
Кристиан Чиупиту

Также for i in range(0,200):можно заменить на for i in range(200):.
Кристиан Чиупиту

@CristianCiupitu Я не мог заставить его делать полные 200 при использовании continue.. Но passсделал свое дело. Плюс короче. И когда я попытался for i in range(200), это только сделало 199 ^^, я подсчитал их потом, сделав duplicatesпеременную и поместив duplicates += 1перед passи посчитав вхождения для -в списке / строке.
Адам

В конце концов, диапазон @CristianCiupitu (200) сработал - на самом деле 4 пробела в блоке кода \tи замена их на 1 пробел не изменили количество символов ... Спасибо за предложения!
Адам

1
Пользователь предложил в предлагаемом редакторе просто удалить if k in t: pass, так как он ничего не делает.
Дверная ручка

3

Питон - 208

Привет, вот мой удар по генерации номерного знака. Это решение похоже на решение @ bitpwner, но без строкового модуля и вместо списка для номерного знака, которое я выбрал для использования набора, а также сначала разрешает номера.

import random as r,re
f=r.randint
l=lambda x:chr(f(65, 90))if x else`f(0,9)`
d=set()
while len(d)<200:
 k=f(0,1);j=1-k;c=l(k)+l(k)+l(k)+'-'+l(j)+l(j)+l(j)
 if not(re.search("666|69|ASS|KKK|SHT",c)):d.add(c)

Пример вывода:

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

3

Python, 252 байта

Вот мой вклад. Я впечатлен этим, но я знаю, что другие сделали лучше с питоном.

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

2

Питон - 165

Этот импорт ...

import random as r,re
j="666|69|ASS|KKK|SHT"
t=r.randint
while len(j)<2e3:
 exec"x="+"chr(t(0,25)+65)+"*3+"'-'"+"+`t(0,9)`"*3
 if not re.search(j,x):print x;j+='|'+x

Если есть необходимость начать случайным образом с цифр или алфавитов, которые я не считаю нужными, тогда 190.

import random as r,re
j="666|69|ASS|KKK|SHT"
t=r.randint
while len(j)<2e3:
 exec"x="+"chr(t(0,25)+65)+"*3+"'-'"+"+`t(0,9)`"*3
 x=x[::r.choice((-1,1))]
 if not re.search(j,x):print x;j+='|'+x

Символы или байты?
DatEpicCoderGuyWhoPrograms

Могу ли я предложить PYG? gist.github.com/Synthetica9/9796173
Эмилио М Бумачар

Я считаю 208 символов, и ваше решение сначала разрешает числа?
Виллем

@willem Четыре пробела для отступа на самом деле являются табуляцией, и сначала только алфавиты.
Векторизовано

2

PHP 341 324 320

Было лучшее, что я мог сделать.

<?$a="p";$b=fopen($a,'a+');while($c<200){$d=rand(100,999);$e='';for($f=0;$f<3;++$f)$e.=chr(rand(65,90));$g=(rand(1,2)==1)?"$d-$e":"$e-$d";$h=array('ASS','666','69','kkk','SHT');$i=1;foreach($h as $j)!preg_match("/$j/",$g)?:++$i;if($i==1){$k=fread($b,filesize($a));if(!strpos($k,$g)){fwrite($b,$g);echo"$g<br />";++$c;}}}

Чтобы запустить код, просто сохраните его как файл .php и перейдите к нему на любом веб-сервере. Он попытается создать файл черного списка p.txt, если он еще не существует. Однако вам может потребоваться указать его с полным путем к серверу, если у вас нет прав root.

Сам код здесь предварительно до гольфификации:

<?
// create random plate
// check it does not break rules
// check is not on all time blacklist file
// Add to blacklist file
// Output to screen

// open file handle
$file = "p"; // filename and path if not root access
$fh = fopen($file, 'a+');

// do 200
while($x<200) {

    // get random number
    $rand_number = rand(100,999);

    // get random letters
    $letters = '';
    for($y=0; $y<3; ++$y) $letters .= chr(rand(65,90));


    // mix up combination
    $string = (rand(1,2)==1) ? "$rand_number-$letters" : "$letters-$rand_number";

    // assume is ok
    $ok = 1;

    // Set checks to be excluded on new plates.
    $checks = array('ASS','666','69','kkk','SHT');

    // do the exclusions
    foreach ($checks as $check) !preg_match("/$check/", $string) ? : ++$ok;


    // if all ok, check is not on the blacklist
    if($ok == 1) {

        // read blacklist
        $blacklist = fread($fh, filesize($file));

        // if not on blacklist, add it to file, echo it to output, increment counter
        if (!strpos($blacklist, $string)) {
            fwrite($fh, $string);
            echo "$string<br />";
            ++$x;
        }
    }
}

Был настолько коротким, насколько я мог получить :-(

Пример вывода

XWU-888
PUD-534
355-QXG
WDE-402
113-QID
362-YBW
TBK-594
939-XDT
148-ARZ
838-ICY
723-ZDA
.... does exactly 200 new plates.

РЕДАКТИРОВАТЬ: привести в порядок пару операторов if для использования краткой формы.


Если таблички не нужно смешивать - то есть могут быть цифры, то только буквы, я могу потерять эту строку $string = (rand(1,2)==1) ? "$rand_number-$letters" : "$letters-$rand_number";
Пол Дрюетт

1
Вы можете использовать односимвольное имя файла (например, p вместо p.txt) и сэкономить 4 символа.
Марк

@ Марк, я не знал, что ты можешь это сделать. Протестировал и все заработало нормально. Читайте о расширениях файлов, и они не работают так, как я думал. Спасибо, это было очень интересно.
Пол Дрюетт

1

Delphi, 161 байт

Вот мой взгляд на это. Он выводит номерные знаки на стандартный вывод без перевода строки между ними. Если требуется LF (не указано в правилах), то это добавляет дополнительные 4 байта.

Гольф версия:

var S,L:string;begin repeat Str(100+Random(69),S);S:=S+'-';while Length(S)<7do S:=S+Chr(65+Random(10));if Pos(S,L)=0then L:=L+S;until Length(L)>1393;Write(L)end.

Ungolfed:

var
  S, L: string;
begin
  repeat
    Str(100 + Random(69), S); // generate and add first three numbers
    S := S + '-'; // add dash
    while Length(S) < 7 do // generate and add last three letters
      S := S + Chr(65 + Random(10));
    if Pos(S, L) = 0 then // check if its not in the L string and add it
      L := L + S;
  until Length(L) > 1393; // exit loop once L string has more than 1393 chars (199 * 7 = 1393)
  Write(L); // output L to stdout
end.

Как запустить:

app.exe > plates.txt

1

PHP, 267

Это настолько коротко, насколько я могу это понять.

<?php $g=file("p",2)?:[];$b=["ASS","666","KKK","SHT"];for($i=0;$i<200;){$m="A";$n=rand(702,18277);for($j=0;$j<$n;$j++){$m++;}$m.=-rand(100,999);if(!(strpos($m,"69")|in_array($m,$b)|in_array($m,$g))){$g[]=$m;echo"$m\n";$i++;}}file_put_contents("p",implode("\n",$g));?>

Пластины хранятся в файле "p".

<?php
$g=file("p",2)?:[]; // Read existing plates
$b=["ASS","666","KKK","SHT"]; // Don't generate these
for($i=0;$i<200;){ // 200 plates
    $m="A"; // Base letter
    $n=rand(702,18277); // 3 random letters
    for($j=0;$j<$n;$j++){$m++;} // Increment until letters are reached (SLOW, but short)
    $m.=-rand(100,999); // Add a dash and three numbers
    if(!(strpos($m,"69")|in_array($m,$b)|in_array($m,$g))){ // Check that it's valid and unused
        $g[]=$m;echo"$m\n";$i++; // Echo it, add it to used array and increment counter
    }
}
file_put_contents("p",implode("\n",$g)); // Save the plates
?>

1

R, 229 символов

Я уверен, что это можно улучшить:

l=function(x)paste0(sample(x,3,r=T),collapse="")
a=function()c(l(LETTERS),l(0:9))
A=list()
for(i in 1:200)while(any(sapply(c("ASS","666","69","KKK","SHT"),grepl,A[[i]]<-a()))|A[i]%in%A[-i])A[[i]]=a()
lapply(A,paste,collapse="-")

Запустите в консоли, распечатывает список номерных знаков.


1

Кобра - 198

class P
    def main
        l,r=[],Random()
        while l.count<200
            a,b=r.next(1000),''
            for i in 3,b+='[r.next(65,91)to char]'
            if not ('69'in'[a]'or 666==a or b in'ASS KKK SHT'),l+=['[a]-'+b]
        print l

1

ECMAScript 6 - 155 168 158

Предупреждение : 200 предупреждений Диалоги (изменение alertк console.logтесту)

for(i=0,s={},r=Math.random,l=x=>String.fromCharCode(65+r()*26);i<200;)/ASS|666|69|KKK|SHT/.test(p=(r()+'-'+l()+l()+l()).slice(-7))?0:s[p]=s[p]||(alert(p),i++)

Редактировать : Ой. Оригинальная версия печатных дубликатов ...

Редактировать 2 : теперь ближе к исходной партитуре - переключен с набора на ассоциативный массив с некоторыми нечетко повторяющимися проверками, позволяющими печатать по ходу дела

Протестировано в консоли Firefox.


Поздравляю с улучшением моего решения
Уильям Барбоза

Я получаю «Ошибка синтаксиса» на: l=x=>String.fromCharCode(65+r()*26);. Я думаю, я не знаю, что происходит сl=x=>...
Кевин Феган

@KevinFegan - Полагаю, вы не используете Firefox ... f=a=>bэто особенность ES6, для которой в основном используется условное обозначение, и function f(a) { b }на данный момент она поддерживается только (?) Firefox.
Alconja

Да, я использую IE 9, и он определенно не работает здесь. Я попробую это на Firefox. Благодарю.
Кевин Феган

1

JavaScript (ES6) 184

Как обычно, тестирование в FireFox консоли и изменения alertк console.logили быть готовым к прессе escape200 раз.

R=x=>Math.random()*++x|0
for(l='ABCDEFGHIKJLMNOPQRSTUVWXYZ',i=0,u={};i<200;)
!(/69|666|ASS|SHT|KKK/.test(k=l[R(25)]+l[R(25)]+l[R(25)]+'-'+R(9)+R(9)+R(9))&u[k])&&alert(k,u[k]=++i);

Я не знаю о консоли, но веб-страницам разрешено только 5 бесплатных предупреждений, прежде чем Firefox начнет предлагать их отключение: mxr.mozilla.org/mozilla-central/…
Нил

@Neil конечно, но предлагать отключить не значит отключить. Разве вам не нравятся 200 (или больше codegolf.stackexchange.com/a/32278/21348 ) всплывающих окон?
edc65

1

Python3, 257 символов

import string as X,re,random as R
I=[0,1,2]
s={}
while len(s)<200:
 L=R.sample([[R.choice(X.digits) for i in I],[R.choice(X.ascii_uppercase) for i in I]],2);L=''.join(L[0]+['-']+L[1])
 if re.search('ASS|KKK|SHT|69|666',L) or L in s:continue
 print(L);s[L]=0

Пример вывода:

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

1
Вы можете сохранить байт, отделяя строки 5 и 6 ;вместо \n .
подземный

@undergroundmonorail, ты прав, спасибо!
Кристиан Чиупиту

1

PHP, 167

while(count($a)<200){$c="";for(;++$y&3;)$c.=chr(rand(65,90));$d=rand(100,999);$c=rand()&1?"$d-$c":"$c-$d";preg_match("/ASS|666|69|KKK|SHT/",$c)||$a[$c]=1;}print_r($a);

это на 100 символов меньше, чем у лучших PHP! :)

while(count($a)<200)
{
    $c="";
    for(;++$y&3;) $c.=chr(rand(65,90));
    $d=rand(100,999);
    $c=rand()&1?"$d-$c":"$c-$d";
    preg_match("/ASS|666|69|KKK|SHT/",$c)||$a[$c]=1;
}
print_r($a);

надеюсь, вам понравится. В случае, если это разрешено:

while(count($a)<200){$c="";for(;++$y&3;)$c.=chr(rand(65,90));$c.=-rand(100,999);preg_match("/ASS|666|69|KKK|SHT/",$c)||$a[$c]=1;}print_r($a);

только 141 символ, но не тасует символы и числа. Любые предложения приветствуются :)


1

F #, 264 символа

Не совсем язык, предназначенный для игры в гольф, но я уверен, что это можно улучшить. Использование Seq.exists с лямбдой довольно раздражает, так же как и множество паренов и отсутствие неявного преобразования.

Использует рекурсию, продолжает идти вечно.

let g=System.Random()
let c()=char(g.Next(65,90))
let k(i:string)l=Seq.exists(fun e->i.Contains(e))l
let rec p d:unit=
 let l=sprintf"%i-%c%c%c"(g.Next(100,999))(c())(c())(c())
 if k l d||k l ["ASS";"666";"69";"KKK";"SHT"]then p d else
  printfn"%s"l
  p(l::d)
p[]

Может быть запущен в FSI.


1

Python 203

Я не уверен, что это технически важно, но мне понравилось, так что я все равно публикую. В то время как я генерирую ответы псевдослучайно, как и почти все остальные, я стратегически выбрал случайное зерно так, чтобы неправильные ответы не попадали в вывод. Таким образом, мой ответ на самом деле не способен генерировать весь набор действительных ответов, а также не может генерировать недействительные.

from random import*;seed(1);L='ABCDEFGHIJKLMNOPQRSTUVWXYZ';D='0123456789';C=choice
for i in 'x'*200:s=randint(0,1);a=''.join(C(L)for _ in'000');b=''.join(C(D)for _ in'000');i=[a,b];print i[s-1]+'-'+i[s]

1

Perl - 123 персонажа

while(@p<200){$l=(AAA..ZZZ)[int rand 999]."-".(100+int rand 899);@p=grep!/ASS|666|69|KKK|SHT|$l/,@p;push@p,$l}$,=$/;print@p

Ungolfed:

while(@p < 200){ # Repeat until we get 200 plates
    $l = (AAA..ZZZ)[int rand 999]."-".(100+int rand 899); # generate the license plate
    @p = grep !/ASS|666|69|KKK|SHT|$l/, @p; # remove disallowed license ones and duplicates
    push @p, $l # add a license plate
}
$,=$/; # so they print with newlines
print @p # print the plates

Если у кого-то есть идеи поиграть в гольф дальше, дайте мне знать, мне интересно. Если вы хотите получить более подробное объяснение части кода, оставьте комментарий, и я с удовольствием объясню больше.


1

Javascript - 283 327 символов

Редактировать:

После реализации предложений от Alconja , вот моя новая версия:

m=Math.random;function y(v){return "ASS|KKK|SHT|666".indexOf(v)<0&&v.indexOf("69")<0?0:!0}function c(){return String.fromCharCode(m()*26+65)}for(i=0;i<200;i++){do {do {n=(m()+"").slice(2,5)}while(y(n));do {l=c()+c()+c()}while(y(l));r=l+"-"+n}while(o.indexOf(r)>=0);o+=r+"\n"}alert(o)
/* 1 line - 283 Characters */

1) Удалить переменную: s и использовать литерал: "\ n" [-4] [323]
2) Удалить "var o =" ", i, r, n, l," [-17] [306]
3) Удалить Переменная: t и используйте литерал: «ASS | KKK | SHT | 666» [-4] [302]
4) Установите m = Math.random и используйте вместо него «m» [-7] [296]
5) Используйте (m ( ) + "") вместо m (). toString () [-6] [290]
6) Удалить ненужные ";" [-7] [283]



Старая версия: Javascript - 327 символов

Я уверен, что есть место для совершенствования ... Я довольно неопытен в Code-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 */


Вот отформатированная версия «Ungolfed» с «неминифицированными» именами переменных / функций:

var outp="",lsep="\n",ndx,res,nbr,ltr,tbl="ASS|KKK|SHT|666";
function fnvfy(vinp){
  return tbl.indexOf(vinp)<0&&vinp.indexOf("69")<0?0:!0;
}
function fnchr(){
  return String.fromCharCode(Math.random()*26+65);
}
for(ndx=0;ndx<200;ndx++){
  do {
    do {
      nbr=Math.random().toString().slice(2,5);
    }
    while(fnvfy(nbr));
    do {
      ltr=fnchr()+fnchr()+fnchr();
    }
    while(fnvfy(ltr));
    res=ltr+"-"+nbr;
  }
  while(outp.indexOf(res)>=0);
  outp+=res+lsep;
}
alert(outp);



Вот отладочная версия, которую можно вставить в URL-адрес избранного / закладки браузера. Вывод помещается в «TEXTAREA» в новом «окне» вместо «alert ()»:

javascript:(function(){var outp="",lsep="\n",ndx,res,nbr,ltr,tbl="ASS|KKK|SHT|666";function fnvfy(vinp){return tbl.indexOf(vinp)<0&&vinp.indexOf("69")<0?0:!0;}function fnchr(){return String.fromCharCode(Math.random()*26+65);}for(ndx=0;ndx<200;ndx++){do {do {nbr=Math.random().toString().slice(2,5);}while(fnvfy(nbr));do {ltr=fnchr()+fnchr()+fnchr();}while(fnvfy(ltr));res=ltr+"-"+nbr;}while(outp.indexOf(res)>=0);outp+=res+lsep;}var x=window.open();x.document.write('<head>\n</head>\n<body>\n<form name=sa><textarea name=t rows=25 cols=80 wrap>'+outp+'</textarea><br />\n</body>\n');x.document.close();})()
/* */

Вот отладочная версия, отформатированная:

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
Не касаясь вашего фактического алгоритма, вот несколько общих советов по игре в javascript: Javascript по своей сути простит с плохим синтаксисом, поэтому вам не нужно использовать var(просто назначение будет делать, 323 ), вам не нужны ;s, если нет следующего утверждения, следующего за (например, последний символ в строке, или перед a }, 316 ), следите за всем, что требует объявить / использовать больше места, чем просто встроенный (например, ваша sпеременная, 312 ), то же самое для обратного, если что-то используется больше, чем . один раз (например , Math.random(...)до r=Math.random ... r(...), 307 , (x+"")короче x.toString(), 300
Alconja

@Alconja - Спасибо за помощь. Мне удалось уменьшить размер на 44 символа.
Кевин Феган
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.