Singkat negara bagian AS itu!


50

Diberikan salah satu dari 50 nama negara bagian AS di sebelah kiri sebagai input, menampilkan kode pos dua huruf seperti yang ditunjukkan di kanan:

Alabama         AL
Alaska          AK
Arizona         AZ
Arkansas        AR
California      CA
Colorado        CO
Connecticut     CT
Delaware        DE
Florida         FL
Georgia         GA
Hawaii          HI
Idaho           ID
Illinois        IL
Indiana         IN
Iowa            IA
Kansas          KS
Kentucky        KY
Louisiana       LA
Maine           ME
Maryland        MD
Massachusetts   MA
Michigan        MI
Minnesota       MN
Mississippi     MS
Missouri        MO
Montana         MT
Nebraska        NE
Nevada          NV
New Hampshire   NH
New Jersey      NJ
New Mexico      NM
New York        NY
North Carolina  NC
North Dakota    ND
Ohio            OH
Oklahoma        OK
Oregon          OR
Pennsylvania    PA
Rhode Island    RI
South Carolina  SC
South Dakota    SD
Tennessee       TN
Texas           TX
Utah            UT
Vermont         VT
Virginia        VA
Washington      WA
West Virginia   WV
Wisconsin       WI
Wyoming         WY

Aturan

  • Input dan output keduanya case sensitive. Anda banyak yang tidak menghasilkan misalnya Aluntuk Alabama.
  • Anda dapat mengasumsikan input adalah salah satu dari 50 nama negara yang ditunjukkan di atas.
  • Anda tidak boleh mengakses internet atau menggunakan data status bawaan (menatap Anda, Mathematica).

Daftar input dan output yang terpisah dapat ditemukan dalam cuplikan ini (jangan jalankan, itu hanya untuk mengompresi pos):

(Non-skor) Brownie menunjuk jika Anda juga dapat mengambil District of Columbiasebagai input dan produksiDC , Kepulauan Virgin, dll.

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte di setiap bahasa menang .

(Awalnya diusulkan oleh Produk ETH)


11
Bagi yang penasaran ingin tahu pendekatan Mathematica:Entity[a="AdministrativeDivision",{#,"UnitedStates"}]@EntityProperty[a,"StateAbbreviation"]&
DavidC

12
@BetaDecay Pertanyaan yang ditutup sebagai di luar topik bukan target dupe yang berguna.
Mego

7
@ DavidvidC Anda dapat menyimpan 20byte: Entity["AdministrativeDivision",{#,"UnitedStates"}]@"StateAbbreviation"&:)
ngenisis

2
Tawarkan kredit ekstra untuk memasukkan 12 kode dua karakter lainnya dalam daftar resmi lengkap singkatan pos AS: AA (AMERICAS ANGKATAN ARMED), AE (EROPA ANGKATAN BERSENJATA AROM), AP (PASANGAN ARMED PASIFIK), AS (AMERIKA SAMOA), DC (KABUPATEN COLUMBIA), FM (FEDERATED STATES OF MICRONESIA), GU (GUAM), MH (PULAU MARSHALL), MP (PULAU MARIANA UTARA), PR (PUERTO RICO), PW (PALAU), VI (PULAU VIRGIN).
joe snyder

2
Ya ini bukan penipuan.
Christopher

Jawaban:


25

Javascript, 124 117 byte

(disimpan 7 byte berkat hvd)

x=>/.+[A-Z]|A..[sz]k?|M.ss.s?|M[io]n?t?|Nev?|[AFIOUW][^o]|T..|.+/.exec(x)[0].replace(/(.).*(.)/,'$1$2').toUpperCase()

Penjelasan:

  • Regexp menemukan kecocokan dengan huruf pertama dan terakhir, dua huruf singkatan
  • Bagian pertama cocok dengan negara bagian dengan lebih dari dua kata (termasuk District of Columbia)
  • Bagian kedua cocok dengan Alaska dan Arizona
  • Bagian ketiga cocok dengan Massachusets, Mississippi dan Missouri
  • Bagian keempat cocok dengan Michigan, Minnesota dan Montana
  • Bagian kelima cocok dengan Nebraska dan Nevada
  • Bagian keenam cocok dengan semua negara bagian yang tersisa disingkat dua huruf pertama mereka, dengan kasus khusus untuk mengecualikan Iowa
  • Bagian ketujuh cocok dengan semua negara yang tersisa disingkat huruf pertama dan ketiga mereka
  • Bagian kedelapan cocok dengan yang lainnya, yang disingkat menjadi huruf pertama dan terakhir mereka
  • Maka itu hanya kasus pengupasan surat-surat itu dan memanfaatkannya
  • Juga cocok dengan Puerto Riko dan Samoa Amerika, tetapi tidak untuk Guam, kepulauan Marianas, atau Kepulauan Virgin AS

Wow, ini luar biasa! +1!
NoOneIsHere

3
Bagus! Beberapa peluang lagi: inisial [A-Z]tidak diperlukan karena input diketahui valid. Kasus khusus Iowa dapat disingkat menjadi [AFIOUW][^o]untuk mengecualikannya, meninggalkannya untuk final .+.
hvd

1
Mesin regex Anda sangat efisien dibandingkan dengan milik saya ... berharap ada cara untuk membuatnya bekerja dengan regex saya yang lebih pendek. Tapi mereka dibangun di atas prinsip yang berbeda.
Steve Bennett

1
Yah ada beberapa yang aneh dengan caranya sendiri. Ada koleksi bagus yang cocok dengan aturan "pertama dan terakhir" dan "dua pertama" (Colorado, Delaware, California ...), tetapi kemudian Mississippi (MS) merusaknya.
Steve Bennett

1
101: s=>s[0]+/.+[A-Zz]|Nev?|.*sk|M.ss.s?|M[io]n?t?|[AFIOUW][^o]|Te.|.+/.exec(s)[0].slice(-1).toUpperCase()Bisakah kita mencapai 100? :)
Steve Bennett

22

Javascript, 137 135 134 132 113 110 108 101 99 94 93 92 byte

Ini didasarkan pada solusi HP Williams, dengan beberapa perbaikan di luar regex, dan beberapa penyesuaian di dalamnya.

s=>s[0]+
/.*( .|z)|...s.s?|T..|M[i-t]+|[AFINOUW][^o]v?|.*/
.exec(s)[0].slice(-1).toUpperCase()

(Linebreak hanya untuk keterbacaan)

Komentar untuk regex:

.*( .|z)|      // Two-or-three word states, plus Arizona
...s.s?|       // Mississippi, Missouri, Massachussetts, Alaska, and (non-harmfully) Kansas
M[i-t]+|       // Montana, Minnesota, Michigan
[AFINOUW][^o]v?|  // All the other first-two-letter states, avoiding Iowa, plus Nevada
T‌​..|           // Tennessee, Texas
.+             // Everything else is first-and-last

Alternatif regex tak berguna (panjang yang sama):

/...(a$|z|s.s?|.* .)|M[i-t]+|T..|[AFINOUW].v?|.*/  

Sejarah

94

s=>s[0]+/.*( .|z)|...s.s?|M[io]n?t?|[AFIOUWN][^o]v?|T..|.*/
.exec(s)[0].slice(-1).toUpperCase()

99

s=>s[0]+/.*( .|z|l.*k)|T..|M.ss.s?|M[io]n?t?|[AFIOUWN][^o]v?|.*/
.exec(s)[0].slice(-1).toUpperCase()

101

s=>s[0]+/.+[A-Zz]|Nev?|.*sk|M.ss.s?|M[io]n?t?|[AFIOUW][^o]|T‌​e.|.+/
.exec(s)[0].sl‌​ice(-1).toUpperCase(‌​)

108

 s=>s[0]+/MI(N|SSO|S)|[CDGHKLPV].*|.* .|.*[XZV]|.*?N[NTE]|.*(SK|D$|WA)|../
.exec(s.toUpperCase())[0].slice(-1)

110

s=>s[0]+/MI(N|SSO|S)|[CGHKLPV].*|.* .|.*[XZV]|.*?N[NTE]|.*(SK|[ED]$|WA)|../
.exec(s.toUpperCase())[0].slice(-1)

113

s=>s[0]+/^MI(N|SSO|S)|^[CGHKLPV].*|.*?( .|[XZV])|.*?N[NTE]|.*(SK|[ED]$|WA)|../
.exec(s.toUpperCase())[0].slice(-1)

132

s=>(S=s.toUpperCase(),' ._SSO_^MI[NS]_^[CGHKLPV].*_.V_N[TNE]_SK_[ED]$_WA_Z_X_..'
.split`_`.some(p=>s=S.match(p)),S[0]+s[0].slice(-1))

134

s=>' ._SSO_^MI[NS]_^[CGHKLPV].*_.V_N[TNE]_SK_E$_D$_WA_Z_X_..'.split`_`
.map(p=>s=(z=s.toUpperCase().match(p))?s[0]+z[0].slice(-1):s)&&s

135

s=>' ._SSO_^MI[NS]_LASK_^[CGHKLPV].*_NT_EN_[DE]$_WA_.[XVZ]_..'.split`_`
.map(p=>s=(z=s.toUpperCase().match(p))?s[0]+z[0].slice(-1):s)&&s

137

s=>' ._OWA_SSO_ONT_^MI[NS]_LASK_^[CGHKLPV].*_EN_[DE]$_.[XVZ]_..'.split`_`.
map(p=>s=(z=s.toUpperCase().match(p))?s[0]+z[0].slice(-1):s)&&s

Ini hanya gila, saya berharap saya bisa membesarkan lagi.
ETHproduksi

Jangan lihat sekarang! 99!
Steve Bennett

94. Benar-benar gila. Saya menemukan pengoptimalan ini ( ...s.s?menangkap Mississippi, Missouri, Massachussetts dan Alaska) secara tidak sengaja. Saya sebenarnya sedang dalam proses memindahkan .*skfragmen ke tempat lain, dan tes kebetulan berlari dan berlalu, sementara fragmen tidak hadir di mana pun. Keuntungan 5 karakter termudah yang pernah ada!
Steve Bennett

Wow, dan saya baru sadar bahwa ...s.s?itu juga secara tidak sengaja menyamai Kansas, dan, secara ajaib, masih memberikan hasil yang tepat.
Steve Bennett

Dan satu lagi karakter dengan M[onti]+. Sangat aneh: jika negara dimulai dengan M, maka huruf kedua adalah yang terakhir dalam urutan setidaknya satu o, n, t, atau i. Cara yang sangat aneh untuk menangkap Michican, Minnesota, atau Montana.
Steve Bennett

20

JavaScript (ES6), 156 136 byte

s=>s[0]+'.KT..N.VEA.XVL.H.TZ.AA..I.EADATO.JTISRDIYOI.DALA.Y.KE.C.D.R.YAS.NM...C.L...N'[parseInt(s.split` `.join``,36)%359%248*8%99*3%83]

Demo


1
Apakah ini bruteforced menjadi optimal menggunakan metode ini?
ASCII

2
@ Khusus ASCII Ini bruteforced pada rentang arbitrase, jadi dijamin hanya akan optimal X MOD[50-1000] MOD[50-1000] MOD[50-100]. Tapi .slice(1)itu sebuah kesalahan. Saat ini berjalan lagi di seluruh string.
Arnauld

2
Bisakah Anda jelaskan kepada seorang pemula apa ini?
Hankrecords

1
@Hankrecords Tentu, akan lakukan. (Tapi saya di kereta dengan akses internet terbatas sekarang.)
Arnauld

1
sekarang milikku 135!
Steve Bennett

17

Jelly , 75 byte

³Oḅ⁹%⁽qġ%14ị⁽"wB¤Ḥ
“¿ØƈṢḍw÷S=)µZṂ÷ĿæÆɱ»Ḳiµ%2+3¢⁸?
e“\B“½ƈN»ȧ5ȯÇ’
i⁶ȯÇ‘ịṭḢŒu

Cobalah online!

... atau lihat test suite - Perhatikan perubahan kecil yang harus dilakukan untuk menjalankan program lengkap untuk beberapa input sekaligus (saya mengganti atom input program ³,, untuk memanggil kembali dari register ®,, satu dan mengatur register untuk setiap nama negara bagian pada gilirannya).

Bagaimana?

Hitung indeks yang akan digunakan untuk karakter kedua dari kode pos, tambahkan ke karakter pertama dan huruf besar hasilnya.

Pertama menemukan indeks karakter spasi (atau 0 jika tidak ditemukan);

Lain memeriksa apakah itu Alaska atau Missouri (menghasilkan 5 untuk katau o);

Lain menemukan indeks negara input dalam daftar Arizona Minnesota Mississippi Nevada Montana Texas Tennessee(atau 0 jika tidak ditemukan) - jika demikian diperlukan indeks mod 2 ditambah 3 (untuk z n s v t x n);

Lain mengubah string ke ordinals, mengubahnya dari basis 256, menemukan sisanya setelah membaginya dengan 29487, menemukan sisanya setelah membaginya dengan 14 dan menggunakannya untuk mengindeks ke representasi biner 9620 dan menggandakan hasilnya - menghasilkan 0 untuk negara-negara yang menggunakan huruf terakhir mereka dan 2 untuk mereka yang menggunakan huruf kedua mereka.

Semua kecuali kasus pertama bertambah, dan nilai yang dihasilkan dikurangi (menaikkan indeks ruang ditemukan oleh satu).

i⁶ȯÇ‘ịṭḢŒu - Main link: state string
 ⁶         - space character
i          - first index (of a space character in the state) or 0 if not found  (n-1 or 0)
   Ç       - call link 3 as a monad  (get n-1 in other cases)
  ȯ        - logical or  (yielding n-1)
    ‘      - increment   (yielding n)
     ị     - index into the state string (get the nth character)
       Ḣ   - head the state string (get the first character)
      ṭ    - tack
        Œu - convert to uppercase
           - implicit print

e“\B“½ƈN»ȧ5ȯÇ’ - Link 3: n-5 or ... : state string
 “\B“½ƈN»      - ["Alaska","Missouri"]
e              - exists in? (1 if so, 0 if not)
          5    - 5
         ȧ     - logical and
            Ç  - call link 2 as a monad
           ȯ   - logical or
             ’ - decrement

“¿ØƈṢḍw÷S=)µZṂ÷ĿæÆɱ»Ḳiµ%2+3¢⁸? - Link 2: n = 3 or n = 4 or ... : state string
“¿ØƈṢḍw÷S=)µZṂ÷ĿæÆɱ»           - "Arizona Minnesota Mississippi Nevada Montana Texas Tennessee"
                    Ḳ          - split at spaces
                     i         - first index of state string in that list or 0
                      µ        - monadic chain separation (call that i)
                             ? - if: 
                            ⁸  -   link's left argument, i
                               - then:
                       %2      -   mod 2
                         +3    -   plus 3  - odd entries to 4: AriZona, MisSissippi, MonTana, TenNessee
                               -            even entries to 3: MiNnesota, NeVada, TeXas
                               - else:
                           ¢   -   call link 1 as a nilad

³Oḅ⁹%⁽qġ%14ị⁽"wB¤Ḥ - Link 1 ...n=2 or n=0: no arguments
³                  - program's 1st input    e.g. Iowa          or Ohio
 O                 - cast to ordinals            [73,111,119,97]  [79, 104, 105, 111]
   ⁹               - 256
  ḅ                - convert from base           1232041825       1332242799
     ⁽qġ           - 29487
    %              - modulo                      15991            20139
        %14        - modulo 14                   3                7
                ¤  - nilad followed by link(s) as a nilad:
            ⁽"w    -   9620                     V       V
               B   -   convert to binary = [1,0,0,1,0,1,1,0,0,1,0,1,0,0]
           ị       - index into                  0                1
                 Ḥ - double                      0                2
                   -   ...0th index of Iowa is 'a', 2nd of Ohio is 'h'

1
Ini adalah Jelly terpanjang yang pernah saya lihat =)
caird coinheringaahing

11

Python 2 , 191 byte

lambda s:s[0]+("KZD"*5+"HNTD"*5+"AYY"*4+"__L_O_VTA_I__A_T_RS_KA__S_"+"MOO"*5+"I_C_"+"AE"*6+"_I_D__A_"+"EDL"*5+"HV_A"+"IR"*7+"XC"*6+"E____N__YJ_YT___L")[reduce(lambda a,x:a+ord(x)^24,s,0)%174]

Cobalah online!

Menggunakan fungsi hash sederhana untuk menemukan karakter kedua dari singkatan.


11

Python 2, 94 90 byte

lambda s:s[0]+s[(19**9*0x4710b8f6019c1b61deca10eef13b1>>hash(s)%8199472%52*3&7)+1].upper()

Cobalah online

(Hanya Python 2 karena hash Python 3 tidak stabil dan Anda juga tidak dapat meng-hash string tanpa mengubahnya menjadi byte.)

Bekerja dengan semua 50 negara bagian, ditambah sebagai bonus District of Columbia dan Puerto Rico.

Ini akan mungkin untuk menyelamatkan satu byte dengan menuliskan nomor dalam basis-36: int("5clu7x0aixb0pelmpugv5iiibphrpf",36). Saya menunggu untuk melihat apakah saya dapat memikirkan solusi yang lebih kreatif.

Memperbarui:

Karena ada 12 posisi digit yang tidak digunakan dalam hash, ada 2 36 kemungkinan angka yang akan berfungsi. Rasanya masuk akal untuk percaya bahwa salah satu dari mereka akan memiliki faktor utama dengan eksponen besar. Untuk prime dan eksponen yang diberikan, menemukan nilai cukup cepat; Saya berhasil menemukan satu dengan faktor 19 9 , mengurangi ukuran ekspresi yang diperlukan untuk merepresentasikan angka dengan empat byte.

Ini pada dasarnya prosedur yang sama dengan jawaban C saya tetapi menggunakan Python. Karena fungsi hash dasar berbeda, saya harus menemukan fungsi reduksi yang berbeda, yang ternyata menjadi mod 52 bukannya mod 54. Tetapi penghematan terbesar di atas C berasal dari kemungkinan menggunakan bignum untuk menyandikan vektor, dan tentu saja fakta bahwa standar untuk Python tampaknya tidak masalah menggunakan lambda literal alih-alih program yang lengkap.


9

Retina , 113 81 80 77 70 68 byte

M1!`.+[A-Zz]|...s.s?|M[io]n?t?|[AFIOUWN][^o]v?|T..|.*
\B.*(?=.)

T`l`L

Cobalah online! Termasuk semua 51 kasus uji. Disimpan 32 byte dengan menggunakan regex @ JörgHülsermann yang menemukan huruf kedua (dengan tweak untuk mendukung DC; edit: disimpan 1 byte berkat @ JörgHülsermann). Disimpan 3 byte dengan beralih ke regex @ SteveBennett dari komentarnya ke jawaban @ HPWilliam. Disimpan 7 9 byte terima kasih lagi ke @SteveBennett. Surat-surat lainnya kemudian dihapus dan string ditulis dengan huruf besar.


Sangat bagus, tidak akan mengira Anda bisa mendapatkan satu set string yang sepenuhnya dapat dilepas.
colsw

@ConnorLSW ebenar-benar merepotkan.
Neil

@ JörgHülsermann Terima kasih atas bantuan balasannya!
Neil

@ JörgHülsermann Oh, jadi saya bisa menyimpan byte lain kalau begitu?
Neil

1
Tunggu, Indiana tidak menjadi ID. Anda mungkin dapat memperbaikinya hanya dengan menambahkan $ setelah d. (Anda mungkin ingin menggunakan pengujian otomatis - Saya memiliki skrip yang terus-menerus memeriksa semua 50 kasus.)
Steve Bennett

8

PHP> = 7.1, 113 Bytes

<?=($a=$argn)[0],ucfirst(preg_match('#[vxz]| .|owa|lask|[CGHKLPV].*|ssi?.|n(n|t|[de]$)#',$a,$t)?$t[0][-1]:$a[1]);

Versi Online

Serangan dilakukan melalui pertandingan awal sebelumnya sebelumnya

([vxz])cocok Arizona, Nevada, New Mexico, Pennsylvania, Texas,

(.) (satu spasi sebelumnya) cocok dengan New Hampshire, New Jersey, New Mexico, New York, Carolina Utara, Dakota Utara, Rhode Island, Carolina Selatan, Dakota Selatan, Virginia Barat

[CGHKLPV].*(.)pertandingan California, Colorado, Connecticut, Georgia, Hawaii, Kansas, Kentucky, Louisiana, New Hampshire , Carolina Utara, Pennsylvania, Carolina Selatan , Vermont, Virginia, Virginia Barat

ow(a) cocok dengan Iowa

las(k) cocok dengan Alaska

ssi?(.)cocok dengan Massachusetts, Mississippi, Missouri, Tennessee

n(n|t|[de]$)pertandingan Connecticut, Kentucky, Maine, Maryland, Minnesota, Montana, Pennsylvania, Rhode Island, Tennessee, Vermont

Tidak ada kecocokan untuk negara-negara ini sehingga kami mengambil dua huruf pertama Alabama, Arkansas, Delaware, Florida, Idaho, Illinois, Indiana, Michigan, Nebraska, Ohio, Oklahoma, Oregon, Utah, Washington, Wisconsin, Wyoming

Pertama kali saya menggunakan Subpatter Regex ini ?|dengan memungkinkan untuk menyimpan referensi di dalam satu.

Mendukung Distrik Columbia

Ganti (.)dengan ([^o])+3 Bytes

Cobalah online!

PHP, 150 Bytes

<?=($t=preg_replace("#.\K\w+ |las|ri|nec|eorgi|awa|ow|[aio]ni?|e(?=n|v|x)|ntuck|ouisi|a?in|arylan|issi?|nnsylv|erm|irg#","",$argn))[0],ucfirst($t[1]);

Cobalah online! Testcases


3
Bukankah n|t|satu byte lebih pendek dari [nt]|?
Neil

@Neil Ya itu. Saya belum menyadarinya. Terima Kasih
Jörg Hülsermann

7

PHP, 887 854 byte

<?=array_combine(['Alabama','Alaska','Arizona','Arkansas','California','Colorado','Connecticut','Delaware','Florida','Georgia','Hawaii','Idaho','Illinois','Indiana','Iowa','Kansas','Kentucky','Louisiana','Maine','Maryland','Massachusetts','Michigan','Minnesota','Mississippi','Missouri','Montana','Nebraska','Nevada','New Hampshire','New Jersey','New Mexico','New York','North Carolina','North Dakota','Ohio','Oklahoma','Oregon','Pennsylvania','Rhode Island','South Carolina','South Dakota','Tennessee','Texas','Utah','Vermont','Virginia','Washington','West Virginia','Wisconsin','Wyoming'],['AL','AK','AZ','AR','CA','CO','CT','DE','FL','GA','HI','ID','IL','IN','IA','KS','KY','LA','ME','MD','MA','MI','MN','MS','MO','MT','NE','NV','NH','NJ','NM','NY','NC','ND','OH','OK','OR','PA','RI','SC','SD','TN','TX','UT','VT','VA','WA','WV','WI','WY'])[$argv[1]];

Cobalah online!

Timer pertama, hore!


1
Dengan cara ini sedikit golf Dalam Array adalah nilai-nilai dengan spasi atau di mana huruf kedua dihapus dengan benar. Dan $argv[1]diganti dengan $argn sandbox.onlinephpfunctions.com/code/…
Jörg Hülsermann

@ JörgHülsermann terima kasih banyak! Saya sangat menikmati jawaban Anda di sini di codegolf php!
Ivanka Todorova

Saya hanya sedikit terang terhadap orang lain di sini. Upaya pembelajaran itu baik jika seseorang menemukan peningkatan. Saya harap Anda menjawab lebih banyak pertanyaan di masa depan
Jörg Hülsermann

7

C, 945 937 718 711 660 616 byte

Disimpan 219 byte berkat ASCII saja.

struct{int*a,b;}m[]={"laba",76,"lask",75,"rizo",90,"rkan",82,"alif",65,"olor",79,"onne",84,"elaw",69,"lori",76,"eorg",65,"awai",73,"daho",68,"llin",76,"ndia",78,"owa",65,"ansa",83,"entu",89,"ouis",65,"aine",69,"aryl",68,"assa",65,"ichi",73,"inne",78,"issi",83,"isso",79,"onta",84,"ebra",69,"evad",86,"ew H",72,"ew J",74,"ew M",77,"ew Y",89,"orth",67,"orth",68,"hio",72,"klah",75,"rego",82,"enns",65,"hode",73,"outh",67,"outh",68,"enne",78,"exas",88,"tah",84,"ermo",84,"irgi",65,"ashi",65,"est ",86,"isco",73,"yomi",89};
i;char b[99];main(){gets(b);putchar(*b);for(;m[i].a;i++)if(!strncmp(m[i].a,b+1,4))puts(&m[i].b);}

Baris baru tidak perlu, hanya untuk tujuan tampilan. Mengambil status sebagai input. Cobalah online!

Bagaimana itu bekerja:

  • struct{int*a,b;}m[]=...mendeklarasikan peta mdengan dua nilai - string empat byte dan satu karakter. Ini digunakan dalam loop perbandingan, yang membandingkan indeks kedua sampai kelima dengan char*adi peta.
  • gets(b)membaca sebuah string b. Ini akan menjadi negara yang disingkat.
  • putchar(*b) mencetak karakter pertama dari string itu, karena setiap singkatan dimulai dengan huruf pertama dari negara.
  • for(;m[i].a;i++)loop melalui setiap nilai peta. (Ini mungkin bisa dipersingkat.)
  • if(!strncmp(m[i].a,b+1,4))membandingkan nilai peta saat ini dengan karakter kedua hingga kelima dari b(status disingkat). Ini karena satu-satunya perbedaan adalah dalam lima karakter pertama, tetapi kami sudah mencetak karakter pertama.
  • puts(&m[i].b); mencetak huruf kedua dari singkatan (jika nama negara cocok dengan nilai peta saat ini), dan baris baru.

Ini tampaknya menghasilkan output yang salah untuk negara-negara * Utara / Selatan *.
Felix Dombek

6

C, 148 141 byte

main(){char s[99];gets(s);printf("%c%c\n",*s,s["-2-1--561-1-62--642138364---4142--1416--67-7131-111-7-246"[*(int*)(s+1)%663694%57]-48]&95);}

*(int*)(s+1)menganggap karakter input kedua hingga kelima sebagai integer; integer itu kemudian di-hash menjadi 0-56 menggunakan hash i%663694%57. Nilai hash kemudian dicari dalam vektor offset yang mewakili lokasi huruf kedua dari singkatan. Saya memilih empat byte tertentu karena (1) Missouri dan Mississippi pertama berbeda dalam karakter kelima dan (2) beberapa negara hanya memiliki empat karakter Dalam C Anda dapat menggunakan byte terminator NUL, tetapi tidak ada yang lebih baik dari itu. (Ini hash kedua Utara ke nilai yang sama, serta kedua Selatan. Tapi itu tidak masalah karena offset terkait adalah 6 untuk semua ini.)

Ketika terjadi, hash tertentu menghasilkan posisi yang benar untuk huruf kedua singkatan dari District of Columbia, Puerto Rico dan "Virgin Islands" (diketik seperti itu, bukan sebagai "US Virgin Islands", karena algoritma menegaskan bahwa yang pertama karakter singkatan menjadi karakter pertama dari nama).

Konstanta 663694 dan 57 ditemukan dengan tes otomatis; 57 adalah rentang hash terkecil yang saya temukan. (Versi pertama menggunakan 380085 dan 63, tetapi ketika saya memperpanjang rentang tes saya menemukan yang baru.) Tampaknya ada sedikit hash yang lebih kecil jika kode ditambahkan untuk "gunakan karakter terakhir dalam nama"; sayangnya, sintaks C untuk memilih karakter terakhir terlalu bertele-tele untuk membuatnya bermanfaat.

Hanya ada 8 offset yang berbeda, sehingga bisa disimpan dalam tabel pencarian 171-bit (3 * 57) dengan tiga bit per entri. Tetapi saya tidak bisa memikirkan cara untuk memasukkan bit-bit itu secara efisien ke dalam program. Hex-encoding akan membutuhkan sekitar satu karakter per empat bit, ditambah 0xawalan. Saya tidak bisa melakukan lebih baik dari 151 byte, yang jauh lebih lama daripada versi string. Jika 171 bit entah bagaimana bisa dimasukkan sebagai oktet mentah, mereka akan menempati 22 byte, jadi mungkin ada solusi, tetapi membaca file itu kikuk.


4

Sebenarnya , 181 byte

2"OHCALAGAMAWVFLNVILMNMOMIRINCDEMTMEINWANYTXORNEOKIDAZNMUTNDMDVAKYSDPAARWYNHIAMSALNJAKTNHIKSVTWICOSCCT"╪"âäà♠îÉæô↨→←∟♣áíå*,▓/12│┤94▼╛?DE╞G╚╠╬ST╒WXßb;Θoq╙|⌂"♂┘Z⌠i≈┐⌡MXO;rR5♀ⁿ*:236@%└

Solusi ini mengharapkan input sebagai string yang dikutip.

Cobalah online!

Penjelasan

Solusi ini menggunakan strategi hashing yang sama dengan solusi Python 3 saya . Untuk singkatnya, saya akan menghilangkan penjelasan tentang bagaimana hash dihitung dan mengapa hash dipilih (baca jawaban lain jika Anda menginginkannya).

Juga untuk singkatnya, saya akan meninggalkan isi dari string yang sangat panjang, karena jika tidak penjelasannya tidak dapat dibaca.

2"..."╪"..."♂┘Z⌠i≈┐⌡MXO;rR5♀ⁿ*:236@%└
2"..."╪                                state abbreviations (push the long string, split into length-2 chunks)
       "..."♂┘                         hash values for the state names (a string of CP437-encoded characters, converted to their CP437 ordinals)
              Z                        zip the two lists
               ⌠i≈┐⌡M                  for each pair:
                i                        flatten the pair
                 ≈                       convert hash value to int
                  ┐                      store abbreviation at the register numbered by the hash value
                     X                 discard the now-empty list
                      O                convert input string to list of ASCII ordinals
                       ;rR             range(len(ordinal_list)), reversed
                          5♀ⁿ          5**i mapped over that range
                             *         dot product of powers of 5 and ordinal list
                              :236@%   mod by 236
                                    └  push value in that register

3

Python 3 , 230 byte

lambda s:chr(s[0])+'IA%%L!NOI!M%!E.N!Y.XR.Z$D.I!.D$DA.D%!.HA!LJ%.N%‌​$T.I%!C!T!.HAAT$.A!.‌​VL.V%$CE%%AEK%.T$!.Y‌​.A!.R.Y$O.S%!.K$!.S'‌​.replace('%','$$').r‌​eplace('$','!!').rep‌​lace('!','..')[sum(c‌​*5**i for i,c in enumerate(s[::-1]))%236-5]

Cobalah online!

Input diharapkan sebagai objek byte (string byte, bukan string Unicode).

Terima kasih kepada Johnathon Allan untuk jumlah byte yang tidak masuk akal

Penjelasan

Setiap nama negara hash ke integer adengan menerapkan hash a = sum(o*5**i) % 236(di mana oASCII ordinal karakter dan iindeksnya dalam string, dihitung kembali dari akhir). Modulus 236dipilih karena modulus terkecil yang menyebabkan semua nilai hash menjadi berbeda untuk 50 nama negara bagian AS. Hash ini kemudian dipetakan ke singkatan negara, dan kamus yang dihasilkan (dikompres menggunakan string string) digunakan untuk mencari singkatan yang diberi nama negara (hashing untuk mendapatkan kunci yang tepat).


Simpan 179 byte denganlambda s:chr(s[0])+'.....IA................L..NOI..M..........E.N..Y.XR.Z....D.I...D....DA.D...........HA..LJ.........N............T.I..........C..T...HAAT.....A...VL.V............CE................AEK.........T.......Y.A...R.Y....O.S...........K.......S'[sum(c*5**i for i,c in enumerate(s[::-1]))%236]
Jonathan Allan

... dan 51 lainnya selain itulambda s:chr(s[0])+'IA%%L!NOI!M%!E.N!Y.XR.Z$D.I!.D$DA.D%!.HA!LJ%.N%$T.I%!C!T!.HAAT$.A!.VL.V%$CE%%AEK%.T$!.Y.A!.R.Y$O.S%!.K$!.S'.replace('%','$$').replace('$','!!').replace('!','..')[sum(c*5**i for i,c in enumerate(s[::-1]))%236-5]
Jonathan Allan

Saya terkejut bahwa menghitung mundur biayanya lebih sedikit byte daripada fungsi hash yang diperhitungkan ke depan - tetapi saya tidak dapat menemukannya dengan sedikit permainan
Chris H

1
@ Chris Saya pikir saya menemukan satu, tetapi string yang dikompresi lebih mahal.
Mego

2

Ruby, 106 103 byte

->s{s[0]+(s=~/ /?$'[0]:s[(j="()6>P_ac;?.O}AFLKMrS".index((s.sum%136%95+32).chr))?j>7?j/4:-1:1]).upcase}

Jika input berisi spasi, huruf keluaran kedua adalah yang setelah spasi. Lain...

Hash jumlah semua karakter dalam input untuk mendapatkan karakter yang indeksnya dalam string ajaib menunjukkan indeks huruf keluaran kedua dalam string input, sesuai dengan rumus j>8?j/4:-1(-1 berarti akhir.). Jika hash memberikan karakter yang tidak ada dalam string ajaib, huruf kedua adalah huruf kedua dari input.

Sebagai penjelasan tentang string ajaib, karakter hash dan indeks huruf yang mereka encode ada di bawah ini. Perhatikan bahwa Delaware muncul meskipun huruf kedua akan dilakukan - ini karena kode hashnya berbenturan dengan Kentucky. Untungnya surat terakhir Delaware sama dengan yang kedua.

Letter(index)
Last  (-1)  (-MD    )-VA    6-GA-LA  >-DE-KY    P-PA    _-CT    a-KS    c-VT
3rd    (2)  ;-TN    ?-MN    .-TX     O-NV
4th    (3)  }-MS    A-IA    F-MT     L-AZ
5th    (4)  K-MO    M-AK    r-ME     S-HI 

Tidak digabungkan dalam program uji

a="Alabama
Alaska
Arizona
Arkansas
California
Colorado
Connecticut
Delaware
Florida
Georgia
Hawaii
Idaho
Illinois
Indiana
Iowa
Kansas
Kentucky
Louisiana
Maine
Maryland
Massachusetts
Michigan
Minnesota
Mississippi
Missouri
Montana
Nebraska
Nevada
New Hampshire
New Jersey
New Mexico
New York
North Carolina
North Dakota
Ohio
Oklahoma
Oregon
Pennsylvania
Rhode Island
South Carolina
South Dakota
Tennessee
Texas
Utah
Vermont
Virginia
Washington
West Virginia
Wisconsin
Wyoming".split($/)

f=->s{                                                            #String argument s.
  s[0]+(                                                          #Return character s[0] +
    s=~/ /?$'[0]:                                                 #if s contains a space, 1st character after space, ELSE
      s[(j="()6>P_ac;?.O}AFLKMrS".index((s.sum%136%95+32).chr))?  #if (sum of ascii codes, mod 136 mod 95 +32).chr in the magic string
        j>7?j/4:-1:                                                 #return s[j/4] if j>7 else return s[-1] ELSE
      1]                                                          #if not in the magic string, return s[1].
  ).upcase                                                        #Convert the second character to uppercase if needed.
}


a.map{|i|p [i,f[i]]}

2

/// , 619 608 byte

/2/~M//@/~South //1/~North //!/~New //~/\/\///Alabama/AL~Alaska/AK~Arizona/AZ~Arkansas/AR~California/CA~Connecticut/CT~Delaware/DE~Florida/FL~Georgia/GA~Hawaii/HI~Idaho/ID~Illinois/IL~Indiana/IN~Iowa/IA~Kansas/KS~Kentucky/KY~Louisiana/LA2aine/ME2aryland/MD2assachusetts/MA2ichigan/MI2innesota/MN2ississippi/MS2issouri/MO2ontana/MT~Nebraska/NE~Nevada/NV!Hampshire/NH!Jersey/NJ!Mexico/NM!York/NY1Carolina/NC1Dakota/ND~Ohio/OH~Oklahoma/OK~Oregon/OR~Pennsylvania/PA~Rhode Island/RI@Carolina/SC@Dakota/SD~Tennessee/TN~Texas/TX~Utah/UT~Vermont/VT~Virginia/VA~Washington/WA~West Virginia/WV~Wisconsin/WI~Wyoming/WY/

Cobalah online!

Karena tidak ada cara lain untuk mengambil input di ///, ia berjalan di akhir program. Cukup tambahkan input yang diinginkan ke program.

Disimpan 11 byte dengan membuat lebih banyak penggantian, seperti yang direkomendasikan oleh @SteveBennett


Mungkin ada beberapa pola yang dapat Anda ganti beberapa kali sekaligus, seperti "Baru" dan "akota". Mengganggu bahwa Anda tidak dapat melakukan jauh lebih pintar seperti menghapus bagian nama negara, karena mengubah karakter yang tersisa menjadi huruf besar sangat mahal ...
Steve Bennett

@SteveBennett Diedit, terima kasih!
Kamerad SparklePony

2

Python 2 , 131 125 byte

lambda s:s[0]+'CLLKARADEZVAK.T..DETTH.NSAHY...ID.D..O..Y.IRE.X..NALINC.VJM.SY.T..AAOI'[int(s[0]+s[-2:],36)%386%334%181%98%70]

Cobalah online!


1

TAESGL , 386 byte

B=«ōďā,AL,ņćđ,AK,ķċđ,AZ,ćōē,AR,ďċđ,CA,ĭāď,CO,ŕĭ,CT,ćđēą,DE,ĕŕ,FL,īĭ,GA,ńāē,HI,ćĉďą,ID,ĭċď,IL,ľđā,ţ,ńĕĕ,IA,ķő,KS,ŏĝ,KY,ŏĕĕ,LA,ŏđć,ME,ņāē,MD,ńđā,MA,īđą,MI,ļēď,MN,ŕğ,MS,ňė,MO,ććĕĉ,MT,ćċćĉ,NE,ŕēď,NV,ň ćŋā,NH,ň ĩēđ,NJ,ň ğĕċ,NM,ň ĉĝ,NY,ćņ ġĉă,NC,ćņ ńċą,ND,ĩēą,OH,ŋĺ,OK,ļķ,OR,ĺđď,PA,ĉĉğ đēā,RI,ōċ ġĉă,SC,ōċ ńċą,SD,ňďą,TN,ċĕď,TX,ōđą,UT,ćđāā,VT,ğğ,VA,ďĉē,WA,ĉĉć ğğ,WV,ľēđ,WI,ĉĩĕ,WY»Ĵ",";B[BĪA)+1

Penerjemah

Kompresi yang sangat sederhana dari nama-nama negara, ditambahkan ke dalam array dengan singkatan.


1

Japt, 383 byte

Kompresi string pertama dapat ditingkatkan dengan bereksperimen dengan urutan huruf.

g +`lkzÇUaidlnyaÀÍ¥evhjmycdhkÎödnxttaaviy`g`alabaµ
Ã2ka
iza
kÂ6s
Öâfnia
åªv
¬nש
Ü.Ø
fÓQ»
gegia
°ii
i»
ÅJno
Äa
Å0
kÂ6s
kÀ_cky
lia
Úpe
æ¯À
ÚUaÖ³etts
Úòig
·nÌta
æ«7ppi
æ¬
Úa
ßka
va»
w mp¢i
w jÀ y
w ´xi¬
w yk
Íh ÖÚ¦na
Íh »kota
oo
oklaÊá
eg
pnsylvia
r¸ Ó
Ñh ÖÚ¦na
Ñh »kota
âÊte
x
©ah
vÚ
virgia
Øgn
ØÙ virgia
æÈ;n
wyÇg`·bUv) u

Cobalah online


1

Mathematica, 138 140 134 Bytes

+2 byte - menemukan kesalahan (diperlukan offset array 1 bukan 0)

-6 byte - menemukan hash yang lebih baik

#~StringTake~1<>"R_ATE__IN_COI_J_I_SLNAT_Y_Y_HKOAE__SAA_DDLM_RVAH_XDTVA__I_N_EA_T_DY_C_KZL"~StringTake~{1+Hash@#~Mod~89866736~Mod~73}&

Mirip dengan yang lain, ia mengambil nama dan mengambil huruf pertama. Kemudian itu berlaku hash Mathematica default kemudian menerapkan dua modulus untuk " Hash@#~Mod~89866736~Mod~73" mendapatkan nomor unik untuk setiap negara. Nilai ini kemudian dicari dalam sebuah string untuk menghasilkan huruf kedua.

Mungkin bisa bermain golf lebih banyak tetapi ruang pencarian sangat besar untuk ditemukan oleh Mathematica. Huruf kedua duplikat tidak dipertimbangkan dalam pencarian hash. _karakter mewakili nilai yang terbuang dalam string. Secara teori Anda bisa mendapatkan string hingga hanya 19 karakter tetapi menemukan hash kustom untuk menghasilkan itu akan menjadi mimpi buruk.


1

Perl 5, 150 148 byte (147 +1)

Ini tidak berarti optimal, tetapi ia melakukan tugasnya. Membutuhkan -nbendera baris perintah.

s/las//;s/ai?n//;s/[oie]n|ri//;s/e([vx])/$1/;s/issi?//;s/(.).+ /\1/;/(.)(.)/;/^([^W]).*(?:[cogavn][wiku]|[ir][ys][li]|rm)([adyti])$/;print uc"$1$2"

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.