판에서 상태로


16

이것은 본질적 으로 미국 번호판 생성 과 반대입니다.

도전 과제 : 아래 번호판 형식 중 하나와 일치하는 문자열이 있으면 해당 형식과 일치하는 가능한 모든 상태를 출력하십시오. 테이블 아래에서 0한 자리를 의미 09포함하고, A단일 문자의 약자 A통해 Z포함. 이 문제를 해결하기 위해 복잡한 형식 규칙 (예 : 가변 자릿수를 가진 델라웨어)을 사용하여 상태를 무시하고 모양이 비슷한 문자 (예 : I1)를 제거하지 않습니다.

AAA 000: AK, IA, MS, MP, VT
0000: AS
AAA0000: AZ, GA, WA
000 AAA: AR, KS, KY, LA, ND, OR
0AAA000: CA
AA-00000: CT
AA-0000: DC
AAA A00: FL
AA 00000: IL
000A,000AA,000AAA,AAA000: IN
0AA0000: MD
AAA 0000,0AA A00,AAA 000: MI
000-AAA: MN
00A-000: NV
000 0000: NH
A00-AAA: NJ
000-AAA,AAA-000: NM
AAA-0000: NY, NC, PA, TX, VA, WI
AAA 0000: OH
000AAA: OK
AAA-000: PR
000-000: RI
AAA 000,000 0AA: SC
A00-00A: TN
A00 0AA: UT

예 :

B32 9AG
[UT]

1YUC037
[CA]

285 LOR
[AR, KS, KY, LA, ND, OR] (in any order)

285-LOR
[MN, NM] (in any order)

285LOR
[IN, OK] (in any order)

규칙 및 설명

  • 입력 문자열은 비어 있지 않으며 위 형식 중 하나 여야합니다.
  • 위의 형식 이외의 형식이 지정되지 않은 경우 동작
  • 편리한 방법으로 입력 및 출력 가능
  • 결과를 STDOUT에 인쇄하거나 함수 결과로 리턴 할 수 있습니다.
  • 전체 프로그램 또는 기능이 허용됩니다
  • 표준 허점 은 금지되어 있습니다
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

답변:


15

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

해시 기능

그런 다음 다음 해시 함수를 적용합니다.

에프()=((×)모드47)모드30

[1..29]000AAAAA00024

 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)에프()

마지막으로 패턴 자체는 대문자로 변환되어 2 개의 문자 그룹으로 분할됩니다.


2
나는 당신이 항상 문자열 관련 문제에 대한 우아한 수학 솔루션을 생각해내는 방법을 좋아합니다. :)
AdmBorkBork

도! 나는 오늘 좋은 하루를 보내고 있지 않습니까?
Shaggy

매우 영리한 방법! 충돌하는 두 가지 판 형식은 일리노이가 아닌 인디애나입니다.
BradC

[A-Z]*.대신 .*?[a-z]한 바이트 저장해야합니다
나우 Fouilleul

@NahuelFouilleul 내가 그 실수를 전에 한 적이 ... 감사합니다!
Arnauld

2

T-SQL, 475 바이트

SELECT STUFF(value,1,8,'')
FROM STRING_SPLIT('000 0000NH|000 055 SC|000 555 AR,KS,KY,LA,ND,OR|0000    AS|000-000 RI|0005    IN|00055   IN|000555  IN,OK|000-555 MN,NM|005-000 NV|055 500 MI|0550000 MD|0555000 CA|500 055 UT|500-005 TN|500-555 NJ|55 00000IL|55-0000 DC|55-00000CT|555 000 AK,IA,MI,MS,MP,SC,VT|555 0000MI,OH|555 500 FL|555000  IN|555-000 NM,PR|5550000 AZ,GA,WA|555-0000NY,NC,PA,TX,VA,WI','|')
,i WHERE v LIKE TRIM(REPLACE(REPLACE(LEFT(value,8),5,'[A-Z]'),0,'[0-9]'))

줄 바꿈은 읽기 쉬운 것입니다.

TRIM기능 을 사용하여 SQL 2017 이상으로 제한됩니다 . SQL 2016 (에 필요함 STRING_SPLIT) RTRIM은 1 바이트의 비용으로 대체 할 수 있습니다 .

나는V

기본적으로 역 LIKE일치를하고 있습니다. 각 판의 패턴을와 같은 전체 와일드 카드 패턴 일치 문자열로 확장 '[A-Z][0-9][0-9] [0-9][A-Z][A-Z]'한 다음 입력 값과 비교하고 일치 상태 (단일 필드로 결합)를 반환합니다.

긴 문자열을 GZIP하여 더 많은 공간을 절약 할 수 있습니다. 그것이 도움이되는지 볼 수 있습니다 ...



2

, 177 바이트

§⪪”}∧▶⧴βμÞ∕×peH✂d‽n➙MR⁶↙↷◨5⁶;πNM﹪θW:¡✂⧴O^(P↷kⅉχR⁺≔º↶∨§º⊞B⎚×p↔L\`²‖6'⁶⁹‴XüR⦃N4U⊙YF⁻ZMχLS⁸CX\hγ”;⌕⪪”{⊟“◨⦄»U>⌕⁻9“]±R▷Q↔θü&$▷l⁹Z⁼¡⁷×À›¶aA*βZ³δ¡⟲²Y«№⌕TμN»πX·SΣ"εl⊙=3✂S?K”;⭆S⎇№αιA⎇Σι⁰ι

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

                 S              Input string
                ⭆               Map over characters and join
                  ⎇             If
                     ι          Current character
                   №α           Is an uppercase letter
                      A         Then literal string `A`
                       ⎇        Else if
                         ι      Current character
                        Σ       Is non-zero
                          ⁰     Then digit `0`
                           ι    Else original character
        ⌕                       Find index in
          ”...”                 Compressed string of plates
         ⪪     ;                Split on semicolons
§                               Index into
  ”...”                         Compressed string of states
 ⪪     ;                        Split on semicolons
                                Implicitly print

모든 테스트 사례를 시도하십시오! 링크는 자세한 버전의 코드입니다. 여러 사례를 처리하려면 약간 다른 코드가 필요합니다.

당연히 @Arnauld의 솔루션 포트는 121 바이트로 훨씬 짧습니다.

§⪪”}∧↨¦↑↧‴q⁰mπi3JE⪫³yS⪪c)?0≦·ê⊞Þ«ⅉ⁺&±<pARιaγ1A↑1L¶⟧/)Vº;Π∧,b✂≦¤ⅉαX⊕|″IνB[w∕¦H´Gγ§ν⟲^π!⪪¶ςbFü⊟»2”;﹪׳I⭆S⎇№αι⁷⎇⁼ι ⁰⎇⁼ι-⁶9⁴⁷

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 두 번째 모듈로 30은 배열에 대한 색인 작성에 내재되어 있습니다.


0

파이썬 3 , 382 378 바이트

import re;f=lambda p,l='[A-Z]',r=re.sub,f=re.findall:f(l+'{2}',f(r(l,'1',r('[0-9]','0',p))+l+'+','0000AS0001IN00011IN000111INOK111000IN000 011SC000 111ARKSKYLANDOR000-000RI000-111MNNM001-000NV011 100MI0110000MD0111000CA100-001TN100-111NJ11-0000DC111 100FL111 000AKIAMIMSMPSCVT111-000NMPR1110000AZGAWA11 00000IL11-00000CT111 0000MIOH111-0000NYNCPATXVAWI1100 011UT000 0000NH')[0])

온라인으로 사용해보십시오!

숫자를 0문자로 바꾸고 문자를 1플레이트에서 찾은 다음 문자열을 찾습니다. 그런 다음 단순히 해당 문자열에서 겹치지 않는 모든 문자 쌍을 반환합니다.

가장 효율적인 바이트는 아니지만 좋은 시작입니다.

나는 단지 생성 될 수없는 정보에 기초한 도전을 즐깁니다.


0

05AB1E , 176 바이트

•1–ºʒÉQ÷¦PαN]lā?¨ìÎ₆™@ΔîÅλEŸʒ»ú<ŧa–½ã…ôkƒ¼½Ü%-ò∊aÍÙ•44374в4вε©gIgQi…'-Q'd'a„ðQ)VIεY®Nèè.V}Pë0].•=#îYn«ÈO4êʒIWj∊bÛˆ_ãZÑ"yŠótм‰иÔN–HδÖc°ìSJ9Ç\}ζÎäǝÑïÒ∞V.÷ζkÚ"¿Õнα£!ɪB…žä•#sÏ`2ô

온라인으로 사용해보십시오!

•1–ºʒÉQ÷¦PαN]lā?¨ìÎ₆™@ΔîÅλEŸʒ»ú<ŧa–½ã…ôkƒ¼½Ü%-ò∊aÍÙ•44374в4в
                        push all patterns as base 4 integers (0="-", 1=number, 2=letter, 3=" ")

ε                       for each pattern
  ©                       copy it for later use inside another for for-loop
  gIgQi                   if it has the same length, as input
    …'-Q'd'a„ðQ)V           store ["'-Q", "d", "a", "ðQ"] in Y (05AB1E codes for "equals '-', is positive, is letter and equals ' ')
    Iε                      for each letter of input
      Y®Nèè                   get the 05AB1E code corresponding to the current index of the pattern
      .V                      run it
    }
    P                       check if all positions of that pattern were true
  ë                       else
    0                       push false
]

.•=#îYn«ÈO4êʒIWj∊bÛˆ_ãZÑ"yŠótм‰иÔN–HδÖc°ìSJ9Ç\}ζÎäǝÑïÒ∞V.÷ζkÚ"¿Õнα£!ɪB…žä•#
                        push list of states matching the pattern

sÏ                      get the entry of that list, that is true in the other list
`2ô                        split into groups of 2 letters and print
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.