적절한 번호판을 생성하십시오!


15

시나리오 : 귀하는 자동차 및 기타 차량의 번호판을 설계하는 정부 운영 회사에서 근무하는 소프트웨어 디자이너입니다. 번호판을 생성하는 소프트웨어를 개발하라는 요청을 받았습니다. 일하기 전에 상사는이 기본 규칙을 정했습니다.


번호판에는 다음이 포함될 수 없습니다.

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

규칙 및 요구 사항 :

  • 번호판 무작위로 생성 해야합니다 .
  • 임의의 번호판이 생성되면 동일한 번호판을 다시 생성 할 수 없습니다.
  • 최소 200 개의 고유 번호판을 출력해야합니다 . 원하는 경우 더 생성 할 수 있습니다 .
  • 생성 된 플레이트를 파일에 저장하여 "기억"할 수 있습니다.
  • 자동차 번호판에는 다음과 같이 2 개의 섹션이 있습니다. 하나는 세 글자 만 포함하고 다른 하나는 세 개의 숫자 만 포함합니다 (예 : 233-ADF또는) ADF-233.
  • 숫자와 대문자 만 사용할 수 있습니다.
  • 번호판은 표준 출력이나 파일로 작성 될 수 있습니다.
  • 번호판의 각 "면"에는 세 개의 숫자 또는 문자가 포함됩니다.
  • 이것은 이므로 가장 짧고 가장 인기있는 답변이 이깁니다. 우승자는 7 일 후에 선발됩니다.

일반 규칙

  • 다음을 포함 해야 하지만 이에 국한되지는 않습니다.
  • 언어 이름.
  • 문자 수
  • 파일 크기
  • 코드 실행 방법
  • 코드 자체
  • 예 : 파이썬 (234) 문자파이썬 23메가바이트 .

추가 세부 사항을 명확히 해야하는 경우 의견에 언급하고 게시물에 추가하십시오. 어쨌든 행운을 빌어 적절한 번호판을 생성하십시오!


업데이트 1 : 우승자는 약간 일찍 선택됩니다.

곧 여행을 떠나야하므로 7 월 25 일 00:00 (UTC) 경에 승자를 선택하게됩니다. 당첨자가 선정 된 후에도 전체를 제출할 수 있습니다. 당첨자가 선택되었음을 알 수 있습니다. 바이.


업데이트 2 : 우승자!

우리는 승자가 있습니다! 예이! 참여한 모든 사람에게 치즈와 와인! 누가 이겼어?

  • 1 위 : 엥겔-배쉬 (95 자)
  • 2 위 : Martin Büttner-Mathematica (182 바이트)
  • 2 위 : Emilio M Bumachar-Pyg (92?)
  • 2 위 : Peter Taylor-Golfscript (98 자)
  • 3 위 : Mark Thomas-Ruby (127 자)

와우, 세 번째 장소는 3 개입니다. 와. 경연 대회는 끝났지 만 원할 경우 자유롭게 제출하십시오. 바이!



2
" 임의의 번호판이 생성되면 동일한 번호판을 다시 생성 할 수 없습니다. "비 랜덤 번호판은 어떻습니까?
피터 테일러

4
이 작업을 수행하는 분명한 방법은 (실제로 작동하는 방식으로) 숫자를 순서대로 생성하는 것입니다.
피터 테일러

5
"임의로 생성 된"은 정확하지 않습니다. 나는 당신이 "법적 번호판에서 무작위로 무작위로 선택된 것", 즉 법적인 번호판에서 무작위로 무작위로 선택된 것이 아니라AAA-
Peter Taylor

1
모든 판에 있어야합니다 얼마나 많은 숫자 및 유효한 어떤 문자를 알려주세요 - 그것은 나라마다 다릅니다
자랑 haskeller

13
나는 목록에 없는 외설적이거나 부적절한 문자열을 포함하는 임의의 번호판을 생성하는 프로그램을 작성하려고 합니다.
Ilmari Karonen

답변:


12

bash (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 

주의 사항 : 프로세스가 완료 대기 상태로 두지 않도록하기 위해 m실제로 는 최종적 으로 exec m(+ 5 자) 이어야합니다 (그러나 많은 문제없이 수천을 가질 수 있음)

크레딧은 http://www.cyberciti.biz/faq/linux-random-password-generator/ 를 사용하여tr -dc


나에게 고유성 요구 사항이 없는가?
Cristian Ciupitu

1
@ Cristian-Ciupitu : grep -v블랙리스트와 이미 생성 한 플레이트 목록을 모두 제외합니다 ( grepp는 한 줄에 하나의 패턴 을 포함 할 것으로 예상 되지만, 플레이트에는 정규식 메타 문자가 포함되어 있지 않으므로 서로 일치합니다). 반복 당 하나 또는 0 개의 플레이트 만 생성하므로 각 반복 후에는 제외 할 전체 (업데이트 된) 플레이트 목록을 grep에서 읽습니다. : D
Ángel

6

PYG -92

Pe(Se(Re.sub(".*(666|69|ASS|KKK|SHT).*","",J(RSm(STuc*3,3)+[j]+RSm(STd*3,3)))for j in'-'*K))

이제 사용하지 않은 모든 플레이트에서 균일하게 선택할 수 있으며 OP의 사양을 유지하면서 1 문자를 더 단축 할 수 있습니다.

이론적으로 999 개의 플레이트 목록에 충분한 반복이 포함되어 트림 된 세트가 200보다 작을 수 있습니다. 그러나 그 가능성은 무한히 작습니다. 열 번의 시험에서 내가 얻은 가장 짧은 길이는 994입니다.

편집 : bitpwner의 조언에 따라 두 개의 문자를 저장하기 위해 999를 K (1000의 pyg)로 변경했습니다.


1
허용되지 않는 값을 필터링 했습니까? KKK 또는 666은 어디에도 없습니다.
벡터화

5
@ bitpwner : 0에서 5까지의 숫자와 A에서 J까지의 문자 만 사용하므로 허용되지 않는 값이 발생할 수 없습니다.
Emilio M Bumachar

매우 영리한! 아무도 다른 사람들이 사용되어야한다고 말한 적이 없습니다. 좋은.
Kjeld Schmidt

1
OP는 무작위성이 "사용되지 않은 법적 번호판에서 무작위로 무작위로 선택됨"에 동의했습니다. 문제의 의견을 참조하십시오. 유니폼에 대한 정의가 모든 범위에서 유니폼을 의미하지 않는 한. 그리고 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

자바 스크립트 (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 당신은 분명히 내 400 + 문자 한 줄 JS 정규식을
보지 못했습니다

@eric_lagergren 글씨를 쓰는 데 어려움이 있었을 것
같군요

3
@DatEpicCoderGuyWhoPrograms 여러 줄로 쓴 다음 불필요한 공백을 제거 할 수 있습니다. js 파일 크기를 줄이고 그에 따라 대역폭을 절약하기 위해 + 다른 단축 (기능 교체 / var 등 이름)을 제공하는 여러 온라인 서비스가 있습니다.
SBoss

1
@DatEpicCoderGuyWhoPrograms는 나중에 최적화합니다. 문제를 올바르게 해결하는 방법을 찾은 다음 바로 가기를 찾은 다음 마침내 코드를 최적화합니다 .P 훨씬 간단하게
Eric Lagergren

4

루비 - 136 133 129 자

끔찍한. 그래도 개선의 여지가 있다고 생각하십시오. 코드를 irb넣거나 pryEnter 키를 눌러 실행하십시오.

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 자

"읽을 수있는"루비 버전에 대한 나의 시도 :

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

이는 호환되는 번호판을 생성 하지만 가능한 대부분의 번호판을 생성하지는 않습니다 (대부분의 답변과 동일). 그것은 요구 사항이 아닌 것 같습니다.
Mark Thomas

4

파이썬 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 K입니다 python file.py.


그게 안 passcontinue? 4 대신 1 칸으로 들여 쓰기하여 일부 문자를 절약 할 수도 있습니다.
Cristian Ciupitu

또한 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및 위해 발생을 계산 -목록 / 문자열.
Adam

@CristianCiupitu range (200)는 결국 작동했습니다. 코드 블록의 4 공백은 실제로 \t1 공백으로 바꾸면 문자 수가 변경되지 않았습니다 ... 제안에 감사드립니다!
Adam

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 바이트

여기 내 공헌이 있습니다. 나는 그것에 감명을 받았지만 다른 사람들이 파이썬으로 더 잘했다고 알고 있습니다.

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

숫자 나 알파벳으로 무작위로 시작할 필요가 있다면, 실제로는 필요하지 않다고 생각합니다.

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

@willem 들여 쓰기를위한 4 개의 공백은 실제로 탭이며 알파벳입니다.
벡터화

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.

편집 : 짧은 형식을 사용하기 위해 두 개의 if 문을 정리했습니다.


번호판이 섞일 필요가없는 경우, 즉 숫자 만 가능하고 글자 만 가능 $string = (rand(1,2)==1) ? "$rand_number-$letters" : "$letters-$rand_number";
하다면

1
단일 문자 파일 이름 (예 : p.txt 대신 p)을 사용하고 4 자도 저장할 수 있습니다.
Mark

@ Mark 나는 당신이 그렇게 할 수 있다는 것을 몰랐습니다. 그것을 테스트하고 잘 작동했습니다. 파일 확장자를 읽으면 생각했던 방식대로 작동하지 않습니다. 고마워요, 정말 흥미로 웠습니다.
Paul Drewett

1

델파이, 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.

언 골프 드 :

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 경고 대화 상자 (변경 alertconsole.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 콘솔에서 테스트되었습니다.


솔루션 개선을 축하합니다
William Barbosa

에 "구문 오류"가 표시됩니다 l=x=>String.fromCharCode(65+r()*26);. 나는 무슨 일이 일어나고 있는지 모르겠다l=x=>...
Kevin Fegan

@KevinFegan-Firefox를 사용하지 않는 것 같습니다 ... f=a=>b기본적으로 축약 된 ES6 기능이며 function f(a) { b }현재 Firefox에서만 지원됩니다 (?).
Alconja

예, IE 9를 사용하고 있으며 확실히 작동하지 않습니다. Firefox에서 시도하겠습니다. 감사.
Kevin Fegan

1

자바 스크립트 (ES6) 184

보통, 파이어 폭스 콘솔에서 테스트 및 변화로 alertconsole.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);

콘솔에 대해서는 잘 모르겠지만 Firefox에서 웹 사이트를 비활성화하기 시작하기 전에 5 개의 무료 경고 만 허용됩니다. mxr.mozilla.org/mozilla-central/…
Neil

@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

@undergroundmonorail, 당신 말이 맞아요, 감사합니다!
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);

현재 PHP보다 100 문자가 적습니다. :)

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

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

자바 스크립트-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 */


다음은 "최소화되지 않은"변수 / 함수 이름이있는 형식화 된 "비 골프"버전입니다.

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에 붙여 넣을 수있는 "디버그"버전입니다. 출력은 "alert ()"대신 새 "창"의 "TEXTAREA"에 배치됩니다.

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는 본질적으로 잘못된 구문으로 용서하므로 사용할 필요가 없습니다 var(할당 할 것입니다, 323 ), ;다음과 같은 다른 언급이 없으면 (예 : 라인의 마지막 문자 또는 }, 316 이전 ), 인라인 (예 : s변수, 312 ) 보다 선언 / 사용에 더 많은 공간을 차지하는 것이 있는지 확인하십시오. . (예를 들어 한 번 Math.random(...)r=Math.random ... r(...), (307) , (x+"")보다 짧은 x.toString(), 300
Alconja

@Alconja-도움 주셔서 감사합니다. 크기를 44 자로 줄일 수있었습니다.
Kevin Fegan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.