Створіть мені кілька відповідних номерних знаків!


15

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


Номерний знак не може містити:

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

Правила та вимоги:

  • Номерний знак повинен бути генерований випадковим чином.
  • Щойно генерується випадковий номерний знак, той самий номерний номер не може бути створений знову.
  • Ви повинні видати щонайменше 200 унікальних номерних знаків. Ви можете генерувати більше, якщо хочете .
  • Ви можете зберігати згенеровані таблички у файлі, щоб "запам'ятати" їх.
  • Номерний знак містить 2 розділи, один містить лише три літери, а один містить лише три цифри, розділені тире, як це: 233-ADFабо ADF-233.
  • Можна використовувати лише цифри та великі літери.
  • Номерні знаки можуть бути написані на stdout або у файл.
  • Кожна "сторона" номерного знака буде містити або три цифри, або літери.
  • Це , тому найкоротший, найпопулярніший виграш відповіді. Переможець буде обраний через сім днів.

Загальні правила

  • Відповідь повинна включати, але не обмежуючись цим, наступне.
  • Назва мови.
  • Кількість персонажів
  • Розмір файлу.
  • Як виконується код.
  • Сам код.
  • Приклад: Python 234 символів або Python 23mb .

Якщо мені потрібно уточнити будь-які додаткові деталі, будь ласка, зазначте це у коментарях, і я додам його до своєї публікації. У будь-якому разі, удачі, і генеруйте мені якісь відповідні номерні знаки!


Оновлення 1: Переможець буде обраний трохи раніше.

Виявляється, я маю скоріше поїхати в подорож, тому я виберу переможця близько 00:00 UTC, 25 липня. Після вибору переможця, ви все ще можете подати учасників, просто знайте, що був обраний переможець. Бай.


Оновлення 2: Переможці!

У нас є переможці! Так! Сир та вино всім, хто брав участь! Ось хто переміг.

  • 1 місце: Ангел - Баш (95 символів)
  • 2 місце: Мартін Бюттнер - Математика (182 байти)
  • 2 місце: Еміліо М Бумачар - Піг (92?)
  • 2 місце: Пітер Тейлор - Гольфскрипт (98 символів)
  • 3 місце: Марк Томас - Рубі (127 символів)

Вау, три краватки на другому місці. Ого. Конкурс закінчився, але сміливо подайте заявки, якщо хочете. Бай!



2
" Щойно генерується випадковий номерний знак, той самий номерний номер не може бути генерований знову. " А що з випадковими номерними знаками?
Пітер Тейлор

4
Очевидний спосіб зробити це (і, мабуть, як це працює в реальному житті) - це генерувати числа в порядку.
Пітер Тейлор

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

1
скажіть, будь ласка, скільки цифр має бути на кожній табличці та які символи дійсні - вона залежить від країни до країни
гордий haskeller

13
Зараз я дещо спокусився написати програму для генерації випадкових номерних знаків, які містять нецензурну чи іншу невідповідну рядок, не знайдений у вашому списку.
Ільмарі Каронен

Відповіді:


12

баш (95 символів)

Збережіть сценарій як mу папці у вашому PATH з набором бітів виконання.

Виконати як bash m. Пластини зберігаються у файлі 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

Це еквівалентно виконанню наступних дій:

# 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 

Caveat: Фінал mнасправді повинен бути exec m(+5 знаків), щоб уникнути процесів, які чекають завершення (але їх можна мати без особливих проблем)

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


Це мені чи вимога унікальності відсутня?
Крістіан Цюпіту

1
@ Cristian-Ciupitu: The grep -vвиключає як чорний список, так і список таблиць, які ми вже створили ( grepочікуємо, що p містить один візерунок на рядок, але оскільки у таблицях немає метахарактерів регулярних виразів, вони відповідають лише собі). Ми генеруємо лише одну або нульову таблички за ітерацію, тому після кожної ітерації повний (оновлений) список табличок для виключення буде прочитаний грепом. : 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))

Тепер можна вибирати рівномірно з усіх невикористаних табличок, дотримуючись специфікацій OP, при цьому скорочуючись ще на 1 символ.

Теоретично можливо, що список із 999 табличок буде містити достатньо повторень, так що оброблений набір буде менше 200. Але шанси на це нескінченно малі. У десяти випробуваннях найнижча довжина я була 994

EDIT: змінив 999 на K (що становить 1000 піг), щоб зберегти два знаки за порадою bitpwner.


1
Ви фільтрували заборонені значення? Ніде не бачиш ні KKK, ні 666.
Векторизований

5
@bitpwner: Я використовую лише цифри від 0 до 5 та літери від А до J, тому заборонені значення не можуть виникати.
Еміліо М Бумачар

Дуже розумний! Ніхто ніколи не казав, що треба використовувати інших. Приємно.
К'єльд Шмідт

1
ОП погодилося, щоб випадковість була "рівномірно обрана випадковим чином з невикористаних законних номерних знаків". Дивіться відповідні коментарі. Якщо ваше визначення рівномірного не означає рівномірне з будь-якого діапазону. І ви можете змінити 999 на K, заощадивши u 2 знаки.
Векторизований

3
Не впевнений, я б вважав вихід випадковим, якщо є дійсні таблички, які неможливо генерувати ...
Alconja

5

Математика, 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

Безумовно

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+ char;)
Eric Lagergren

@eric_lagergren Це звучить так, як це було б боляче писати ...
DatEpicCoderGuyWhoPrograms

3
@DatEpicCoderGuyWhoPrograms Ви можете записати його через кілька рядків, а потім видалити зайві пробіли. Є декілька онлайн-сервісів, які пропонують + інші скорочення (заміна імен функцій / var тощо), щоб зменшити розміри файлів 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):.
Cristian Ciupitu

@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

Пітон, 252 байти

Ось мій внесок. Я вражений цим, але я знаю, що інші зробили краще з 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

Пітон - 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
Emilio M Bumachar

Я рахую 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, якщо він ще не існує. Однак вам може знадобитися визначити його з повним маршрутом до сервера, якщо у вас немає кореневого доступу.

Сам код знаходиться тут перед гольфіфікацією:

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

РЕДАКТУВАННЯ: підправляйте пару, якщо в заявах використовується коротка форма.


Якщо таблички не потрібно змішувати - тобто можуть бути цифри, то лише букви, я можу втратити цей рядок $string = (rand(1,2)==1) ? "$rand_number-$letters" : "$letters-$rand_number";
Пол Дрюетт

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

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

1

Delphi, 161 байт

Ось мій погляд на це. Він видає номерні знаки для stdout без подачі рядків між ними. Якщо 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.

Безголівки:

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на 200 разів console.logабо підготуйтеся до цього escape.

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

Пітон 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

Безголівки:

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. випадковий і використовувати "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 ), вам не потрібно ;, якщо немає іншого твердження, що слідує за (наприклад, останній символ у рядку або перед a }, 316 ), слідкуйте за тим, що потребує більше місця для оголошення / використання, ніж просто вбудована (наприклад, ваша sзмінна, 312 ), ditto для зворотного, якщо щось використовується більше, ніж . один раз (наприклад , 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.