Từ mảng đến nhà nước


16

Đây thực chất là nghịch đảo của Tạo biển số Hoa Kỳ

Thách thức: Đưa ra một chuỗi khớp với một trong các định dạng biển số dưới đây, xuất ra tất cả các trạng thái có thể phù hợp với định dạng đó. Trong bảng dưới đây 0là viết tắt của một chữ số 0thông qua 9bao gồm, và Alà viết tắt của một chữ cái Athông qua Zbao gồm. Đối với mục đích của thử thách này, chúng tôi bỏ qua các trạng thái có quy tắc định dạng phức tạp (như Del biết, có số chữ số thay đổi) và bỏ qua việc loại bỏ các chữ cái giống nhau (ví dụ: 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

Ví dụ:

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)

Quy tắc và làm rõ

  • Chuỗi đầu vào được đảm bảo không trống và được đảm bảo là một trong các định dạng trên
  • Hành vi nếu được cung cấp một định dạng khác với ở trên là không xác định
  • Đầu vào và đầu ra có thể được cung cấp bởi bất kỳ phương pháp thuận tiện
  • Bạn có thể in kết quả sang STDOUT hoặc trả lại dưới dạng kết quả hàm
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận
  • Sơ hở tiêu chuẩn bị cấm
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng

Câu trả lời:


15

JavaScript (ES6),  203 202 201  200 byte

Đã lưu 1 byte nhờ @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)

Hãy thử trực tuyến!

Làm sao?

Chuyển đổi đầu vào

Chúng tôi biến chuỗi đầu vào thành một số nguyên bằng cách áp dụng các thay thế sau:n

  • khoảng trắng được thay thế bằng0
  • chữ số được thay thế bằng9
  • chữ cái được thay thế bằng7
  • dấu gạch nối được thay thế bằng6

Như mã 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

Hàm băm

Sau đó chúng ta áp dụng hàm băm sau:

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

Điều này cung cấp một ID duy nhất trong . Thực sự có một sự va chạm giữa và cả hai đều dẫn đến , nhưng điều đó hoàn toàn tốt vì các định dạng tấm này chỉ được sử dụng ở Indiana.[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

Mã hóa nhà nước

Tất cả các mẫu trạng thái được nối với nhau thành một chuỗi, với mỗi mẫu kết thúc bằng một chữ cái viết thường. Các khe trống được lấp đầy với một tùy ý x.

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

Chúng tôi chia chúng lại thành một chuỗi các chuỗi match(/[A-Z]*./g)và chọn chuỗi đúng theo .f(n)

Cuối cùng, bản thân mẫu được chuyển đổi thành chữ hoa đầy đủ và chia thành các nhóm gồm 2 ký tự.


2
Tôi thích cách bạn luôn đưa ra một giải pháp toán học thanh lịch như vậy cho một vấn đề liên quan đến chuỗi. :)
admBorkBork

Ôi! Hôm nay tôi không có một ngày tốt, phải không?!
Xù xì

Phương pháp rất thông minh! Hai định dạng tấm va chạm là Indiana, không phải Illinois.
BradC

[A-Z]*.thay vì .*?[a-z]nên tiết kiệm một byte
Nahuel Fouilleul

@NahuelFouilleul Tôi đã từng mắc lỗi đó trước đây ... Cảm ơn!
Arnauld

2

T-SQL, 475 byte

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

Ngắt dòng chỉ dành cho khả năng đọc.

Giới hạn đối với SQL 2017 trở lên bằng cách sử dụng TRIMhàm. SQL 2016 (bắt buộc STRING_SPLIT), có thể bằng cách thay thế RTRIMvới chi phí 1 byte.

Đầu vào được lấy thông qua bảng có sẵn với trường varchar , theo quy tắc IO của chúng tôiTôiv

Về cơ bản, tôi đang thực hiện một LIKEkết hợp ngược lại : Tôi mở rộng mẫu của mỗi tấm thành một chuỗi ký tự đại diện đầy đủ giống như chuỗi'[A-Z][0-9][0-9] [0-9][A-Z][A-Z]' , sau đó so sánh với giá trị đầu vào và trả về các trạng thái khớp (được kết hợp thành một trường duy nhất).

Có thể tiết kiệm thêm dung lượng bằng cách GZIP'ing chuỗi dài; Tôi sẽ xem nếu điều đó giúp ...


2

Perl 5 (-p) , 165 byte

Câu trả lời Javascript của @ Arnauld, cũng nâng cao anh ấy.

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

Hãy thử trực tuyến!


2

Than , 177 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

                 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

Hãy thử tất cả các trường hợp thử nghiệm! Liên kết là phiên bản dài dòng của mã. (Mã hơi khác nhau cần thiết để xử lý nhiều trường hợp.)

Không có gì đáng ngạc nhiên khi một cổng của giải pháp @ Arnauld lại ngắn hơn nhiều chỉ với 121 byte:

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Modulo thứ hai bằng 30 được ẩn trong việc lập chỉ mục vào mảng.


0

Python 3 , 382 378 byte

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

Hãy thử trực tuyến!

Thay thế các số bằng 0và các chữ cái bằng 1, sau đó tìm kiếm chuỗi cho tấm theo sau là một chuỗi các chữ cái. Sau đó, nó chỉ đơn giản trả về mọi cặp chữ cái không chồng chéo trong chuỗi đó.

Không phải là byte hiệu quả nhất, nhưng một khởi đầu tốt (có thể).

Tôi thích những thách thức dựa trên thông tin không thể tạo ra.


0

05AB1E , 176 byte

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

Hãy thử trực tuyến!

•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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.