Od płyty do stanu

16

Jest to zasadniczo odwrotność generowania amerykańskiej tablicy rejestracyjnej

Wyzwanie: Biorąc pod uwagę ciąg pasujący do jednego z poniższych formatów tablic rejestracyjnych, wypisz wszystkie możliwe stany, które pasują do tego formatowania. W poniższej tabeli 0oznacza jedną cyfrę 0przez 9włącznie i Aoznacza jedną literę Aprzez Zwłącznie. Na potrzeby tego wyzwania ignorujemy stany ze złożonymi regułami formatu (np. Delaware, który ma zmienną liczbę cyfr) oraz ignorujemy usuwanie podobnych do siebie liter (np. II 1).

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

Przykłady:

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)

Zasady i wyjaśnienia

  • Ciąg wejściowy jest gwarantowany jako niepusty i ma jeden z powyższych formatów
  • Zachowanie, jeśli podano inny format niż powyższy, jest niezdefiniowane
  • Dane wejściowe i wyjściowe można podać dowolną dogodną metodą
  • Możesz wydrukować wynik do STDOUT lub zwrócić go jako wynik funkcji
  • Dopuszczalny jest pełny program lub funkcja
  • Standardowe luki są zabronione
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach)
AdmBorkBork
źródło

Odpowiedzi:

15

JavaScript (ES6),  203 202 201  200 bajtów

Zapisano 1 bajt dzięki @NahuelFouilleul

s=>'xMiAZGAWaMIOhNvInxMNNmARKSKYLANDOrNMPrAKIAMIMSMPSCVtAsMdxScRiNhUtDcCtxFlxNYNCPATXVAWiInIlINOkNjCaTn'.match(/[A-Z]*./g)[s.replace(/./g,c=>c<'!'?0:1/c?9:6-~(c+1))*3%47%30].toUpperCase().match(/../g)

Wypróbuj online!

W jaki sposób?

Konwersja wejściowa

n

  • 0
  • 9
  • 7
  • 6

Jako kod 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

Funkcja skrótu

Następnie stosujemy następującą funkcję skrótu:

fa(n)=((3)×n)mod47)mod30

Daje to unikalny identyfikator w[1..29] . Jest rzeczywiście kolizji i oba wyniku w , ale to perfekcyjnie, ponieważ te formaty płyt są wykorzystywane wyłącznie w stanie Indiana.24000AAAAA00024

 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

Kodowanie stanu

Wszystkie wzorce stanów są połączone razem w jeden ciąg, a każdy wzór kończy się małą literą. Puste miejsca są wypełnione arbitralnie x.

[ [], [ 'MI' ], [ 'AZ', 'GA', 'WA' ], [ 'MI', 'OH' ], ... ] --> 'xMiAZGAWaMIOh...'

Dzielimy je z powrotem na tablicę ciągów match(/[A-Z]*./g)i wybieramy właściwy zgodnie z .fa(n)

Wreszcie sam wzorzec jest konwertowany na pełne wielkie litery i dzielony na grupy 2 znaków.

Arnauld
źródło
2
Uwielbiam to, jak zawsze wymyślasz takie eleganckie matematyczne rozwiązanie problemu związanego ze strunami. :)
AdmBorkBork
Nie! Nie mam dzisiaj dobrego dnia, prawda ?!
Kudłaty
Bardzo sprytna metoda! Dwa zderzające się formaty płyt to Indiana, a nie Illinois.
BradC,
[A-Z]*.zamiast .*?[a-z]zaoszczędzić jeden bajt
Nahuel Fouilleul
@NahuelFouilleul Popełniłem ten błąd przed ... Dzięki!
Arnauld
2

T-SQL, 475 bajtów

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

Podziały linii służą wyłącznie do odczytu.

Ograniczony do SQL 2017 lub nowszego przy użyciu TRIMfunkcji. SQL 2016 (wymagany dlaSTRING_SPLIT ) jest prawdopodobnie przez podstawienie RTRIMkosztem 1 bajtu.

jav zgodnie z naszymi regułami IO

Zasadniczo wykonuję odwrotne LIKEdopasowanie: rozszerzam wzór każdej płytki na pełny ciąg pasujący do wzoru wieloznacznego, na przykład '[A-Z][0-9][0-9] [0-9][A-Z][A-Z]', następnie porównuję z wartością wejściową i zwracam pasujące stany (które są łączone w jedno pole).

Może być w stanie zaoszczędzić trochę więcej miejsca przez GZIP'ing długiego łańcucha; Zobaczę, czy to pomoże ...

BradC
źródło
2

Perl 5 (-p) , 165 bajtów

Odpowiedź Porta @ Arnaulda na Javascript, również go oceń.

y/0-8/9/;y/- A-Z/607/;$_=('xMiAZGAWaMIOhNvInxMNNmARKSKYLANDOrNMPrAKIAMIMSMPSCVtAsMdxScRiNhUtDcCtxFlxNYNCPATXVAWiInIlINOkNjCaTn'=~/[A-Z]*./g)[$_*3%47%30];s/../\U$& /g

Wypróbuj online!

Nahuel Fouilleul
źródło
2

Węgiel drzewny , 177 bajtów

§⪪”}∧▶⧴βμÞ∕×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⎇Σι⁰ι

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

                 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

Wypróbuj wszystkie przypadki testowe!Link jest do pełnej wersji kodu. (Nieco inny kod potrzebny do przetworzenia wielu spraw.)

Nic dziwnego, że port rozwiązania @ Arnauld jest znacznie krótszy i ma tylko 121 bajtów:

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

Wypróbuj online! Link jest do pełnej wersji kodu. Drugi moduł o wartości 30 jest domyślny w indeksowaniu do tablicy.

Neil
źródło
0

Python 3 , 382 378 bajtów

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

Wypróbuj online!

Zamienia cyfry na 0 i litery na 1, a następnie przeszukuje ciąg w poszukiwaniu płyty, po której następuje ciąg liter. Następnie zwraca po prostu każdą nie nakładającą się parę liter w tym ciągu.

Nie najbardziej wydajna bajtowo, ale dobry początek (być może).

Lubię wyzwania oparte na informacjach, których nie można po prostu wygenerować.

Matthew Jensen
źródło
0

05AB1E , 176 bajtów

•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ô

Wypróbuj online!

•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
dorycki
źródło