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
Al
untukAlabama
. - 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 Columbia
sebagai input dan produksiDC
, Kepulauan Virgin, dll.
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek dalam byte di setiap bahasa menang .
(Awalnya diusulkan oleh Produk ETH)
code-golf
string
kolmogorov-complexity
state-abbreviation
Steve Bennett
sumber
sumber
Entity[a="AdministrativeDivision",{#,"UnitedStates"}]@EntityProperty[a,"StateAbbreviation"]&
20
byte:Entity["AdministrativeDivision",{#,"UnitedStates"}]@"StateAbbreviation"&
:)Jawaban:
Javascript,
124117 byte(disimpan 7 byte berkat hvd)
Penjelasan:
sumber
[A-Z]
tidak diperlukan karena input diketahui valid. Kasus khusus Iowa dapat disingkat menjadi[AFIOUW][^o]
untuk mengecualikannya, meninggalkannya untuk final.+
.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? :)Javascript,
13713513413211311010810199949392 byteIni didasarkan pada solusi HP Williams, dengan beberapa perbaikan di luar regex, dan beberapa penyesuaian di dalamnya.
(Linebreak hanya untuk keterbacaan)
Komentar untuk regex:
Alternatif regex tak berguna (panjang yang sama):
Sejarah
94
99
101
108
110
113
132
134
135
137
sumber
...s.s?
menangkap Mississippi, Missouri, Massachussetts dan Alaska) secara tidak sengaja. Saya sebenarnya sedang dalam proses memindahkan.*sk
fragmen ke tempat lain, dan tes kebetulan berlari dan berlalu, sementara fragmen tidak hadir di mana pun. Keuntungan 5 karakter termudah yang pernah ada!...s.s?
itu juga secara tidak sengaja menyamai Kansas, dan, secara ajaib, masih memberikan hasil yang tepat.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.JavaScript (ES6),
156136 byteDemo
Tampilkan cuplikan kode
sumber
X MOD[50-1000] MOD[50-1000] MOD[50-100]
. Tapi.slice(1)
itu sebuah kesalahan. Saat ini berjalan lagi di seluruh string.Jelly , 75 byte
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
k
atauo
);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 (untukz 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).
sumber
Python 2 , 191 byte
Cobalah online!
Menggunakan fungsi hash sederhana untuk menemukan karakter kedua dari singkatan.
sumber
Python 2,
9490 byteCobalah 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.
sumber
Retina ,
1138180777068 byteCobalah 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
79 byte terima kasih lagi ke @SteveBennett. Surat-surat lainnya kemudian dihapus dan string ditulis dengan huruf besar.sumber
e
benar-benar merepotkan.d
. (Anda mungkin ingin menggunakan pengujian otomatis - Saya memiliki skrip yang terus-menerus memeriksa semua 50 kasus.)PHP> = 7.1, 113 Bytes
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 Baratow(a)
cocok dengan Iowalas(k)
cocok dengan Alaskassi?(.)
cocok dengan Massachusetts, Mississippi, Missouri,Tennesseen(n|t|[de]$)
pertandinganConnecticut,Kentucky,Maine, Maryland, Minnesota, Montana,Pennsylvania,Rhode Island,Tennessee,VermontTidak 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 BytesCobalah online!
PHP, 150 Bytes
Cobalah online! Testcases
sumber
n|t|
satu byte lebih pendek dari[nt]|
?PHP,
887854 byteCobalah online!
Timer pertama, hore!
sumber
$argv[1]
diganti dengan$argn
sandbox.onlinephpfunctions.com/code/…php
!C,
945937718711660616 byteDisimpan 219 byte berkat ASCII saja.
Baris baru tidak perlu, hanya untuk tujuan tampilan. Mengambil status sebagai input. Cobalah online!
Bagaimana itu bekerja:
struct{int*a,b;}m[]=...
mendeklarasikan petam
dengan dua nilai - string empat byte dan satu karakter. Ini digunakan dalam loop perbandingan, yang membandingkan indeks kedua sampai kelima denganchar*a
di peta.gets(b)
membaca sebuah stringb
. 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 darib
(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.sumber
C,
148141 byte*(int*)(s+1)
menganggap karakter input kedua hingga kelima sebagai integer; integer itu kemudian di-hash menjadi 0-56 menggunakan hashi%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
0x
awalan. 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.sumber
Sebenarnya , 181 byte
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.
sumber
Python 3 , 230 byte
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
a
dengan menerapkan hasha = sum(o*5**i) % 236
(di manao
ASCII ordinal karakter dani
indeksnya dalam string, dihitung kembali dari akhir). Modulus236
dipilih 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).sumber
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'[sum(c*5**i for i,c in enumerate(s[::-1]))%236]
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('%','$$').replace('$','!!').replace('!','..')[sum(c*5**i for i,c in enumerate(s[::-1]))%236-5]
Ruby,
106103 byteJika 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.
Tidak digabungkan dalam program uji
sumber
/// ,
619608 byteCobalah 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
sumber
Python 2 ,
131125 byteCobalah online!
sumber
TAESGL , 386 byte
Penerjemah
Kompresi yang sangat sederhana dari nama-nama negara, ditambahkan ke dalam array dengan singkatan.
sumber
Japt, 383 byte
Kompresi string pertama dapat ditingkatkan dengan bereksperimen dengan urutan huruf.
Cobalah online
sumber
Mathematica,
138140134 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.sumber
Perl 5,
150148 byte (147 +1)Ini tidak berarti optimal, tetapi ia melakukan tugasnya. Membutuhkan
-n
bendera baris perintah.sumber
Python 2 , 152 byte
Cobalah online!
Port jawaban Arnauld .
sumber