จากแผ่นสู่รัฐ


16

นี่เป็นสิ่งที่ตรงกันข้ามกับการสร้าง US License Plate

ถาม:กำหนดสตริงที่ตรงกับหนึ่งในรูปแบบป้ายทะเบียนด้านล่างออกสถานะที่เป็นไปได้ทั้งหมดที่ตรงกับการจัดรูปแบบนั้น ในตารางด้านล่าง0ย่อมาจากหลักเดียว0ผ่าน9รวมและAย่อมาจากตัวอักษรเดียวAผ่านZรวม สำหรับจุดประสงค์ของการท้าทายนี้เราไม่สนใจสถานะที่มีกฎรูปแบบที่ซับซ้อน (เช่นเดลาแวร์ซึ่งมีตัวเลขหลายหลัก) และไม่สนใจการลบตัวอักษรที่มีลักษณะเหมือนกัน (เช่นIและ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

ตัวอย่าง:

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

JavaScript (ES6),  203 202 201  200 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @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)

ลองออนไลน์!

อย่างไร?

การแปลงอินพุต

n

  • 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)พอควร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)(n)

ในที่สุดรูปแบบตัวเองจะถูกแปลงเป็นตัวพิมพ์ใหญ่เต็มและแบ่งออกเป็นกลุ่มของตัวละคร 2 ตัว


2
ฉันชอบที่คุณคิดวิธีแก้ปัญหาทางคณิตศาสตร์ที่สง่างามเพื่อแก้ปัญหาเกี่ยวกับสตริง :)
AdmBorkBork

D'โอ้! ฉันไม่ได้มีวันที่ดีวันนี้ฉัน!
Shaggy

วิธีการที่ฉลาดมาก! รูปแบบแผ่นสองรูปแบบที่ชนกันคือ Indiana ไม่ใช่ Illinois
BradC

[A-Z]*.แทนที่จะ.*?[a-z]ช่วยประหยัดหนึ่งไบต์
Nahuel 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]'))

การขึ้นบรรทัดใหม่มีไว้เพื่อให้สามารถอ่านได้เท่านั้น

จำกัด เฉพาะ SQL 2017 หรือสูงกว่าโดยการใช้TRIMฟังก์ชั่น SQL 2016 (จำเป็นต้องมีSTRING_SPLIT) อาจเป็นไปได้โดยการทดแทนRTRIMที่ราคา 1 ไบต์

ผมโวลต์

โดยทั่วไปแล้วฉันจะทำการ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

Python 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.