Plakadan Eyalete


16

Bu aslında ABD Plaka Oluşturma işleminin tersidir

Zorluk: Aşağıdaki plaka biçimlerinden biriyle eşleşen bir dize verildiğinde, bu biçimlendirmeyle eşleşen tüm olası durumların çıktısını alın. Masanın altında ise 0tek haneli açılımı 0yoluyla 9dahil ve Atek harf için standları Aaracılığıyla Zdahil. Bu zorluğun amaçları doğrultusunda, karmaşık biçim kurallarına (değişken sayıları olan Delaware gibi) sahip durumları ve benzer harflerin kaldırılmasını (ör . IVe 1) yok sayıyoruz .

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

Örnekler:

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)

Kurallar ve Açıklamalar

  • Giriş dizesinin boş olmadığı ve yukarıdaki biçimlerden birinde olduğu garanti edilir
  • Yukarıdakilerden farklı bir biçim verilirse davranış tanımsızdır
  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir
  • Sonucu STDOUT'a yazdırabilir veya işlev sonucu olarak döndürebilirsiniz
  • Tam bir program veya bir işlev kabul edilebilir
  • Standart boşluklar yasaktır
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır

Yanıtlar:


15

JavaScript (ES6),  203 202 201  200 bayt

@NahuelFouilleul sayesinde 1 bayt kaydedildi

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

Çevrimiçi deneyin!

Nasıl?

Girdi dönüşümü

n

  • boşluklar ile değiştirilir0
  • basamaklar ile değiştirilir9
  • harfler ile değiştirilir7
  • tireler ile değiştirilir6

JS kodu olarak:

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

Özet fonksiyonu

Daha sonra aşağıdaki sağlama işlevini uygularız:

f(n)=((3xn)şık47)şık30

Bu [1..29] da benzersiz bir kimlik verir . Aslında arasında bir çarpışma var 000AAve AAA000her ikisi de24

 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

Durum kodlaması

Tüm durum kalıpları, her kalıp küçük harfle bitecek şekilde tek bir dizede birleştirilir. Boş yuvalar isteğe bağlı olarak doldurulur x.

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

match(/[A-Z]*./g)f(n)

Son olarak, desenin kendisi büyük harfe dönüştürülür ve 2 karakterlik gruplara ayrılır.


2
İp ile ilgili bir soruna her zaman böyle zarif bir matematiksel çözüm bulmayı seviyorum. :)
AdmBorkBork

D'oh! Bugün iyi bir gün geçirmiyorum, değil mi ?!
Shaggy

Çok akıllı bir yöntem! Çarpışan iki plaka biçimi Illinois değil Indiana'dır.
BradC

[A-Z]*.yerine .*?[a-z]bir bayt kurtarmalı
Nahuel Fouilleul

@NahuelFouilleul Bu hatayı daha önce yaptım ... Teşekkürler!
Arnauld

2

T-SQL, 475 bayt

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

Satır kesmeleri yalnızca okunabilirlik içindir.

TRIMİşlev kullanılarak SQL 2017 veya üstü ile sınırlıdır . SQL 2016 (için gereklidir STRING_SPLIT), muhtemelen RTRIM1 bayt maliyetiyle değiştirilir .

benv

Temelde bir ters LIKEeşleşme yapıyorum : Ben gibi tam bir joker desen eşleme dize her plaka desen genişletmek '[A-Z][0-9][0-9] [0-9][A-Z][A-Z]', daha sonra giriş değeri ile karşılaştırın ve (tek bir alanda birleştirilir) eşleşen durumları döndürür.

Uzun dizeyi GZIP'leyerek biraz daha fazla yer tasarrufu sağlayabilir; Bunun yardımcı olup olmadığını göreceğim ...


2

Perl 5 (-p) , 165 bayt

Port of @ Arnauld'un Javascript yanıtı da onu onaylıyor.

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

Çevrimiçi deneyin!


2

Kömür , 177 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

                 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

Tüm test senaryolarını deneyin! Bağlantı, kodun ayrıntılı versiyonudur. (Birden fazla vakayı işlemek için biraz farklı kod gerekir.)

Şaşırtıcı olmayan bir şekilde @ Arnauld'un çözümünün bir limanı sadece 121 baytta çok daha kısadır:

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. İkinci modülo 30, dizinin endekslenmesinde örtüktür.


0

Python 3 , 382 378 bayt

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

Çevrimiçi deneyin!

Sayıları 0ve harfleri ile değiştirir 1, ardından plakayı ve ardından bir harf dizesini arar. Daha sonra, o dizede çakışan olmayan her çift çifti döndürür.

En bayt verimli değil, ama iyi bir başlangıç ​​(belki).

Sadece üretilemeyen bilgilere dayanan zorluklardan hoşlanıyorum.


0

05AB1E , 176 bayt

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

Çevrimiçi deneyin!

•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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.