자바 스크립트 (ES6) 203 202 201 200 바이트
@NahuelFouilleul 덕분에 1 바이트 절약
s=>'xMiAZGAWaMIOhNvInxMNNmARKSKYLANDOrNMPrAKIAMIMSMPSCVtAsMdxScRiNhUtDcCtxFlxNYNCPATXVAWiInIlINOkNjCaTn'.match(/[A-Z]*./g)[s.replace(/./g,c=>c<'!'?0:1/c?9:6-~(c+1))*3%47%30].toUpperCase().match(/../g)
온라인으로 사용해보십시오!
어떻게?
입력 변환
엔
- 공백은 으로 대체됩니다0
- 숫자는 로 대체됩니다9
- 문자는 로 대체됩니다7
- 하이픈은 으로 대체됩니다6
JS 코드로 :
c < '!' ? // if c is a space:
0 // replace it with 0
: // else:
1 / c ? // if c is a digit:
9 // replace it with 9
: // else:
6 - ~(c + 1) // if c is a hyphen, this gives:
// 6 - ~('-1') --> 6 - 0 --> 6
// if c is a letter (e.g. 'A'), this gives:
// 6 - ~('A1') --> 6 - ~NaN --> 6 - (-1) --> 7
해시 기능
그런 다음 다음 해시 함수를 적용합니다.
에프( n ) = ( ( 3 × n ) mod 47 ) 모드 30
[ 1..29 ]000AA
AAA000
24
format | n | * 3 | mod 47 | mod 30 | states
------------+----------+-----------+--------+--------+----------------------
'AAA 000' | 7770999 | 23312997 | 10 | 10 | AK,IA,MI,MS,MP,SC,VT
'0000' | 9999 | 29997 | 11 | 11 | AS
'AAA0000' | 7779999 | 23339997 | 32 | 2 | AZ,GA,WA
'000 AAA' | 9990777 | 29972331 | 8 | 8 | AR,KS,KY,LA,ND,OR
'0AAA000' | 9777999 | 29333997 | 28 | 28 | CA
'AA-00000' | 77699999 | 233099997 | 19 | 19 | CT
'AA-0000' | 7769999 | 23309997 | 18 | 18 | DC
'AAA A00' | 7770799 | 23312397 | 21 | 21 | FL
'AA 00000' | 77099999 | 231299997 | 25 | 25 | IL
'000A' | 9997 | 29991 | 5 | 5 | IN
'000AA' | 99977 | 299931 | 24 | 24 | IN
'000AAA' | 999777 | 2999331 | 26 | 26 | IN,OK
'AAA000' | 777999 | 2333997 | 24 | 24 | IN
'0AA0000' | 9779999 | 29339997 | 12 | 12 | MD
'AAA 0000' | 77709999 | 233129997 | 33 | 3 | MI,OH
'0AA A00' | 9770799 | 29312397 | 1 | 1 | MI
'000-AAA' | 9996777 | 29990331 | 7 | 7 | MN,NM
'00A-000' | 9976999 | 29930997 | 34 | 4 | NV
'000 0000' | 99909999 | 299729997 | 46 | 16 | NH
'A00-AAA' | 7996777 | 23990331 | 27 | 27 | NJ
'AAA-000' | 7776999 | 23330997 | 9 | 9 | NM,PR
'AAA-0000' | 77769999 | 233309997 | 23 | 23 | NY,NC,PA,TX,VA,WI
'000-000' | 9996999 | 29990997 | 15 | 15 | RI
'000 0AA' | 9990977 | 29972931 | 44 | 14 | SC
'A00-00A' | 7996997 | 23990991 | 29 | 29 | TN
'A00 0AA' | 7990977 | 23972931 | 17 | 17 | UT
상태 인코딩
모든 상태 패턴은 단일 문자열로 결합되며 각 패턴은 소문자로 끝납니다. 빈 슬롯은 임의의 것으로 채워집니다 x
.
[ [], [ 'MI' ], [ 'AZ', 'GA', 'WA' ], [ 'MI', 'OH' ], ... ] --> 'xMiAZGAWaMIOh...'
match(/[A-Z]*./g)
에프( n )
마지막으로 패턴 자체는 대문자로 변환되어 2 개의 문자 그룹으로 분할됩니다.