Menurut RollingStone , di bawah ini adalah 26 penyanyi terhebat sepanjang masa:
Aretha Franklin Al Green
Ray Charles Robert Plant
Elvis Presley Mick Jagger
Sam Cooke Tina Turner
John Lennon Freddie Mercury
Marvin Gaye Bob Marley
Bob Dylan Smokey Robinson
Otis Redding Johnny Cash
Stevie Wonder Etta James
James Brown David Bowie
Paul McCartney Van Morrison
Little Richard Michael Jackson
Roy Orbison Jackie Wilson
Anda bisa mendapatkan ini sebagai daftar string di sini .
Tugas
Mengingat nama penyanyi, mencetak atau kembali surat dari A
ke Z
mana unik mengidentifikasi penyanyi ini. (Jika kode Anda mengembalikan A untuk Bob Dylan , maka tidak dapat mengembalikan A untuk penyanyi lain.)
Berbeda dengan tantangan serupa lainnya, pemetaan terserah Anda selama bebas dari benturan.
Aturan
- Masukan tersebut dijamin menjadi salah satu dari 26 nama penyanyi yang tercantum di atas dengan ejaan yang tepat ini dan tanpa spasi putih terkemuka atau tertinggal.
- Anda dapat menampilkan huruf dalam huruf kecil atau besar. Tetapi harus konsisten.
- Anda disarankan untuk memberikan suite uji untuk semua 26 input yang mungkin.
- Ini kode-golf , jadi jawaban tersingkat dalam byte menang!
Jawaban:
MATL , 28 byte
Cobalah online!
Penjelasan
Secara implisit mendapatkan string input. Jumlah karakter dari string input, dan lakukan modulus 98 diikuti oleh modulus 40. Hasil dalam salah satu angka berikut:
38 18 13 34 29 23 27 30 5 28 22 1 0 16 7 32 8 14 3 36 25 4 2 6 24 35
(dalam urutan daftar Pastebin).Tekan alfabet (huruf kecil) dengan
2Y2
. Ini menangani angka dalam kisaran [1,26]. Namun, beberapa angka hilang, dan kami memiliki angka hingga 38. Karenanya, kami menambahkan (h
) string yang menangani angka yang lebih tinggi, dengan memetakan angka-angka ini ke huruf 'hilang'. Ruang bisa apa saja, saya menggunakan huruf kapital dalam program asli saya untuk kenyamanan saya sendiri.Kita sekarang dapat mengindeks nomor dari langkah pertama ke dalam string dari langkah kedua dengan
)
. Kami menggunakanw
untuk mendapatkan argumen dalam urutan yang benar. Meskipun tampaknya kita menggunakan pengindeksan berbasis 0 (jumlahnya bervariasi dari 0 hingga 38, dan string sepanjang 39 karakter), kenyataannya sebenarnya sedikit lebih rumit: kita menggunakan pengindeksan modular berbasis 1, fitur yang unik untuk MATL. Ini berarti bahwa1
indeks kea
,38
sebenarnya indeks keu
, dan0
indeks ke akhirz
string.sumber
Python 2 ,
8071 byteCobalah online!
Jumlah ordinals yang diubah memberi angka antara
0
dan38
Angka-angka yang lebih besar dari 25 kemudian digeser untuk mengisi kekosongan seperti di bawah ini (urutan diurutkan ditampilkan):
Kurangi
18
jikai>25
:Tambahkan
3
jikai>31
:Kurangi
8
jikai>37
:Yang memberi urutan
0..25
Ini kemudian dikonversi ke
A-Z
denganchr(i+65)
sumber
(i>31)
untuki/32
, dll6502 rutin kode mesin (C64), 83 byte
Ini adalah kode posisi-independen, taruh saja di suatu tempat di RAM dan lompat ke sana, misalnya menggunakan
sys
perintah.Demo online (memuat ke
$C000
/49152
).Penggunaan:,
sys49152,"[name]"
missys49152,"Aretha Franklin"
.Penting: Jika program dimuat dari disk (seperti di demo online), keluarkan
new
perintah terlebih dahulu! Ini diperlukan karena memuat program mesin menghancurkan beberapa pointer BASIC C64.Catatan: C64 secara default dalam mode tanpa huruf kecil - untuk dapat memasukkan nama yang dapat dibaca , beralih ke mode huruf kecil terlebih dahulu dengan menekan
SHIFT
+CBM
.Penjelasan
Tantangannya adalah menemukan fungsi hash minimal yang sempurna untuk nama-nama ini; untuk C64, saya harus menemukan satu yang mudah dihitung dalam operasi 8bit sederhana. Berikut daftar pembongkaran yang dikomentari:
Test suite (C64 BASIC, berisi kode mesin rutin dalam
data
barisan)Demo online test suite .
sumber
Python 2 , 68 byte
Cobalah online!
sumber
chr(65+i-i/25*2-i/29*21+i/35*2)
) mirip dengan jawaban TFelds . Operasi modulo dilakukan dengan skrip yang sudah saya gunakan di sini dan di sini .Javascript,
138132 karakterKarena semua inisial unik, kecuali untuk
MJ
= M ichael J ackson / M ick J agger, saya memeriksa Michael Jackson secara khusus (satu-satunya denganh
posisi 4), dan untuk semua nama lain saya membuat string dengan inisial diikuti oleh surat yang unik.Cuplikan Kode
Coba di sini:
sumber
Java (OpenJDK 8) ,
128126115113 byteTidak terlalu buruk untuk pengiriman java!
Terima kasih kepada Kevin karena telah menyelamatkan saya banyak byte dengan ekspresi lambda!
Cobalah online!
sumber
{a+=i;}
kea+=i;
char g(String s)
kes->
. Saya telah memodifikasi TIO Anda untuk menunjukkan bagaimana melakukan ini, jika Anda hanya terbiasa dengan metode Java 7.Python 3,
1329996 byteCobalah online!
Tidak bermain golf dengan cemerlang, tetapi saya pikir saya akan mencobanya.
-33 byte berkat modifikasi yang dilakukan oleh TFeld.
-3 byte dengan menggunakan
find
bukanindex
berkat ovs.sumber
sum(map(ord,m))
, saya juga menambahkan Aretha Franklin untuk 128 bytechr(97+...)
sebagai gantinyaascii_lowercase
: 99 bytesum(map(ord,m))
menjumlahkan nilai ASCII dari karakter dalam stringm
(memberikan bilangan bulat dalam kisaran 702–1506). Kemudian memanggilnyachr
mengkonversinya menjadi karakter (Unicode) dengan nomor itu:chr(702)
adalahʾ
kechr(1506) = ע
dan banyak di antaranya. Solusi ini hanya mencari karakter ini di daftar semua kemungkinan (26) karakter tersebut untuk mendapatkan indeks (0-26), lalu mengembalikan karakter dengan kode ASCII 97 + indeks itu (jadi 'a' ke 'z').PHP,
90 88 8672 + 1 bytemungkin menjadi lebih pendek dengan modulo yang berbeda.
Simpan ke file dan jalankan sebagai pipa dengan
-nF
atau coba online .sumber
W
pada kasus uji Anda, dan tidak adaX
output. Tidak tahu apakah ini kesalahan kode itu sendiri atau coba saja konversi daring :)<?=
bagian itu. Dan 'Jalankan sebagai pipa' saya tidak mulai bekerja. Juga, saya mendapat pemberitahuan ketika mencoba menjalankannya dari baris perintah.<?=
... Jadi pertanyaan saya adalah, bagaimana saya menjalankan kode Anda (dari baris perintah)? Saya gagal memberi makan$argn
di baris perintah ... Semua upaya saya sejauh ini baik memberikan artefak, dan tampaknya masih membutuhkan lebih banyak kode untuk menjalankannya.echo <input> | php -nF <scriptfilename>
Perl,
56,54,50, 46 +1 (-p) byte$ = crypt $ , DT; / .. (.) /; $ _ = $ 1; y / 01268ADIJNVW / adhilmnpqsux /$ = crypt $ , DT; / .. (.) /; $ = $ 1; y / 01268JVW / hlmpqsux /; $ = lc$ = crypt $ , mO; / .. (.) /; $ = $ 1; y / 035eft / AHPRXZ /; $ = lcBerkat komentar Dom dapat menghemat 4 byte lebih banyak, juga diubah menjadi huruf besar agar sesuai dengan permintaan yang lebih baik.
Cobalah secara Online
sumber
perl -pe '$_=crypt$_,mO;/..(.)/;$_=$1;y/035eft/AHPRXZ/;$_=lc'
menambahkan tautan ke tio$1^$2
tetapi tidak berpikir untuk menggunakancrypt
... Anda dapat menyimpan 4 byte dengan memesan ulang: Cobalah online!Python 2,
5043 byteKredit untuk japh untuk versi baru
Cobalah online!
Catatan: Ini tergantung pada
hash
builtin dan tidak akan bekerja di semua implementasisumber
lambda n:chr(hash(n)%2354%977%237%54%26+65)
Ruby, 63 byte
Tambahkan kode ascii dari input, bawa mod 98 dan kemudian mod 66 untuk mendapatkan salah satu dari 26 angka unik
n
di kisaran 0..65. Angka heksadesimal besar berisi1
sedikit di masing-masing 26 tempat ini, jadi dengan hakhifting dengann
kami memperoleh nomor dengan 1,261
bit di dalamnya. Kami menghitung1
bit dengan menambahkan kode ascii dan mengambil mod 48, kemudian menambahkan 64 dan mengkonversi ke kode ASCII.Program uji
yang
map
iterates melalui penyanyi mencetak kode huruf dan penyanyi. Kemudian mengembalikan array kode surat, yangsort
ed untuk menunjukkan bahwa setiap huruf digunakan sekali.Keluaran
sumber
Oktaf ,
85 83 8074 byteKekacauan anonim ini adalah hasil dari beberapa main-main di MATLAB mencoba menemukan cara yang baik untuk menyandikan data.
Pada dasarnya setelah analisis cepat, hanya huruf 1,2, dan 8 dari string input (string terkecil adalah 8 karakter, jadi kami baik) diperlukan untuk menghasilkan nilai unik dari setiap input. Bagian yang sulit kemudian mengubah nilai unik itu menjadi sesuatu yang dapat digunakan.
MATLAB sangat buruk dalam mengompresi data, jadi saya harus mencari cara lain untuk melakukan pemetaan pencarian. Saya mencoba mencari beberapa fungsi pada tiga huruf input yang menghasilkan nilai unik yang juga merupakan nilai ASCII yang dapat dicetak sehingga saya bisa menanamkan pemetaan dalam string satu karakter per input.
Ternyata matriks yang mengalikan karakter pada indeks
[1 2 8]
dengan matriks integer[1;15;47]
dan kemudian melakukan mod 124 menghasilkan nilai-nilai unik yang semua dicetak ASCII (dan tidak ada'
karakter yang akan mengganggu string literal). Menyenangkan pemetaan berakhir denganTIO
yang benar-benar tidak disengaja. Menariknya ini adalah satu - satunya pemetaan untuk persamaan ini yang memberikan 26 karakter ASCII yang dapat dicetak yang unik.Jadi pada dasarnya itu adalah pemetaan dan perhitungan pencarian saya. Melakukan pencarian hanyalah kasus melakukan perhitungan dan membandingkan dengan pemetaan. Menambahkan
'A'-1
ke indeks di peta menghasilkan karakter AZ.Anda dapat mencobanya secara online di TIO, yang menunjukkan pemetaan penuh input dan output. Untuk kelengkapan pemetaan lengkapnya juga di bawah ini:
+32
.'A':'Z'
daripada menemukan.sumber
JavaScript (Chrome), 102
Catatan Sayangnya ini hanya berfungsi di Chrome, karena pendekatan yang bergantung pada implementasi di parseInt () (terima kasih @Arnauld)
Saya mencari fungsi hash, mengambil sepotong nama masing-masing, mengkonversi ke angka menggunakan basis 36 dan kemudian menerapkan modulo.
Saya menggunakan kode ini untuk mencari hash terbaik:
Dan hasilnya:
Fungsi hash terbaik memberikan 26 nilai yang berbeda antara 0 dan 50, tapi saya menggunakan yang berbeda, dengan 1 duplikat tetapi rentang yang lebih kecil.
Uji
sumber
parseInt()
.C,
655549 byteh(char*s){return*s<77?(*s^s[5]+40)%13+65:(s[5]&s[4]+s[1])%13+78;}
h(char*s){return*(long*)s%887%392%224%120%67%40%26+65;}
Pendekatan yang sama dengan jawaban KSab . C tidak menyediakan
hash
fungsi string seperti Python. Atau apakah itu?Cobalah online!
h
mengembalikanint
nilai yang merupakan kode ASCII untukA .. Z
.sumber
Javascript, 98 byte
Saya menemukan bahwa kombinasi karakter kedua dan keempat adalah unik untuk masing-masing.
Oleh karena itu saya membuat string dengan kombinasi
name[4] + name[2]
, tidakname[2] + name[4]
atau saya akan memiliki pengulangan dari grup chareh
nama pertama Aretha Franklineh
dan ketika Smokey Robinson dan Johnny Cashoehn
digabungkan.Saya hanya bisa memindahkan Johnny Cash ke posisi lain dari string dan mendapatkan pemetaan yang berbeda, tetapi menggabungkan karakter ke-4 dan ke-2 dalam urutan ini untuk menghindari tabrakan dan membiarkan urutan dataset tetap utuh tanpa menambahkan lebih panjang untuk solusi. Jadi saya memutuskan untuk pergi ke sana (itu hanya pilihan pribadi)
Saya mencari posisi gabungan dari huruf 4 dan 2 dari parameter yang diberikan dalam string dan membaginya dengan 2 sehingga saya mendapatkan angka antara 0 dan 25. Kemudian saya menambahkan 10 dan mengubahnya menjadi string dari basis 36, di mana 10 sesuai dengan
a
dan 35 kez
sumber
Bahasa Wolfram (Mathematica) , 101
126byte+32
tampaknya mengarah ke hashtable stirng terpendek di MathematicaInputForm
.Cobalah online!
sumber
///,
390231 byteCobalah online!
231 byte setelah menghapus baris baru.
Ini sangat panjang, tetapi /// tidak dapat menangani karakter yang berbeda secara umum. Dengan kata lain, /// tidak mendukung regex.
sumber
Excel, 96 byte
Setelah terlalu banyak waktu yang terbuang untuk mencoba pendekatan lain, telah menerapkan pendekatan @Eduardo Paez:
sumber