Diberikan salah satu dari input berikut:
Bawang Ayam Teriyaki Manis Ayam Bakar Oven Dada kalkun BMT Italia tuna Black Forest Ham Bakso MarinaraKeluarkan angka dari 1-7 (atau 0-6) yang mewakili hari dalam seminggu Anda mendapatkan kesepakatan itu, dimulai dengan hari Senin sebagai angka terendah. Input dapat berupa huruf kecil atau huruf besar jika diinginkan (yaitu "italian bmt"). Tidak ada internet yang diizinkan.
code-golf
string
kolmogorov-complexity
geokavel
sumber
sumber
a
's ditambah jumlahe
' s di setiap input adalah [5,4,3,2,1,3,6] masing-masing.sudo
.Jawaban:
Python 2 ,
383028 byteCobalah online!
Sayangnya masih satu byte lebih lama dari jawaban Python 2 terbaik sejauh ini; meskipun tidak menggunakanenklact
pendekatan-.Sekarang satu byte lebih pendek dari i cri jawaban everytim !
Bagaimana cara kerjanya?
Setelah banyak kekerasan, saya menemukan ekspresi yang menghasilkan angka yang memiliki angka yang tepat.
Saya perhatikan bahwa melihat hanya satu digit spesifik dari panjang string yang diberikan diperlukan 3 byte (
%10
). Jadi saya menulis program Python lain ( tautan Pastebin ) untuk mencari lebih lanjut nomor yang secara langsung memetakan panjang string input ke hari dalam seminggu.Angka ajaib terlihat seperti ini:
6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801
(angka dengan angka desimal 629 mengesankan)Dan seperti yang Anda lihat, angka tersebut menyediakan pemetaan yang diperlukan dari [28, 20, 13, 11, 4, 16, 17] hingga [0, 1, 2, 3, 4, 5, 6] (string Python adalah 0 diindeks):
2871 4 733692 3 1 2 34 5 6 20 1 6711326 0 5758628406742167603868834... [4]^ [11]^ [13]^ [16]^ ^[17] ^[20] ^[28]
Program saya juga menemukan ekspresi lain yang menghasilkan angka dengan properti yang diperlukan, meskipun mereka mengambil lebih byte untuk mewakili (29 bukannya 28):
19439**540
,34052**726
,39311**604
,44873**182
,67930**164
dan78579**469
. (Itu semua adalah ekspresi yang ditemukan oleh program tertaut; pelaksanaannya memakan waktu beberapa jam.)Fungsi alternatif yang membutuhkan 28 byte:
lambda S:`7954<<850`[len(S)]
Fungsi alternatif yang membutuhkan 29 byte:
lambda S:`9699<<2291`[len(S)]
Fungsi alternatif yang membutuhkan 30 byte:
lambda S:`853<<4390`[len(S)+9]
Fungsi alternatif yang membutuhkan 31 byte:
lambda S:`1052<<3330`[len(S)+8]
Bagaimana cara kerjanya? Bagaimana saya menghasilkan angka itu? (Jawaban 30 byte)
Jawaban 30 byte adalah
lambda S:`3879**41`[len(S)%10]
.Melihat panjang string input
[28, 20, 13, 11, 4, 16, 17]
, saya perhatikan bahwa semua digit terakhir dalam basis sepuluh berbeda, menghasilkan daftar[8, 0, 3, 1, 4, 6, 7]
. Jadi saya hanya perlu pemetaan dari daftar itu ke daftar semua tujuh hari dalam seminggu[0, 1, 2, 3, 4, 5, 6]
,.Pendekatan pertama saya hanya menggunakan string untuk melakukan pemetaan:,
lambda S:"13*24*560"[len(S)%10]
meskipun string tersebut membutuhkan sebelas byte ("13*24*560"
).Jadi saya menulis program Python ( tautan Pastebin ) untuk menguji ekspresi aritmatika yang menghasilkan bilangan bulat dengan angka-angka yang cocok, berharap untuk golf program lebih lanjut. Apa yang saya dapatkan sejauh ini adalah
`3879**41`
(hanya sepuluh byte, satu-satunya ekspresi yang ditemukan oleh program saya).Tentu saja, ada banyak kemungkinan ekspresi yang bisa dicoba seseorang; Saya hanya beruntung bahwa ada satu dalam bentuk
a**b
dengan hasil yang cukup kecil yang sesuai dengan kebutuhan saya.Hanya untuk siapa saja yang penasaran
3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147
,.Fungsi lain yang valid yang saya temukan saat mencari ekspresi alternatif yang sayangnya membutuhkan 32 byte:
lambda S:`7**416`[len(S)%10+290]
sumber
-9114**28
adalah integer yang lebih kecil * yang juga berfungsi (* secara absolut bukan hanya karena negatif - 111 digit daripada 629). Tidak menghemat byte.Python 2 , 29 byte
Cobalah online!
Penjelasan
Senar ajaib,,
enklact
ditemukan dengan mencari kolom pertama dengan huruf unik.Kolom pertama
SOTITBM
yang tidak berguna karena mengandung duplikat. Yang kedua dan ketiga juga tidak berfungsi karena merekawvutule
daneeranaa
masing - masing. Kolom keempat, namun berfungsi karena memiliki semua huruf unik.sumber
Python , 26 byte
Cobalah online!
Dengan hutang terima kasih (untuk percobaan kode-golf lurus kedua) untuk jawaban Jonathan Frech - saya tidak akan berpikir untuk menggunakan panjang string daripada surat pembeda!
Kode ini berasal dari pengalaman saya dengan De Bruijn Sequences dan pemrograman untuk catur.
Dalam catur, Anda sering bekerja dengan beberapa bilangan bulat 64-bit, di mana setiap bit mengindikasikan sesuatu benar atau salah tentang kotak yang sesuai di papan catur, seperti "ada bagian putih di sini" atau "kotak ini berisi pion".
Oleh karena itu berguna untuk dapat dengan cepat mengkonversi
2**n
dengann
cepat dan murah. Dalam C dan C ++, cara tercepat untuk melakukan ini adalah mengalikannya dengan urutan De Bruijn 64-bit - setara dengan menggesern
bit - kemudian menggeser-kanan 58 (untuk menempatkan enam bit pertama yang terakhir - pastikan Anda sedang menggunakan int yang tidak ditandatangani atau Anda akan mendapatkan 1s separuh waktu) dan lihat angka 0..63 ini dalam tabel yang memberi Anda korespondensin
yang berada dalam kisaran yang sama, tetapi jarang jumlahnya sama.Ini semacam terkait. Alih-alih mengubah dari
2**n
ken
, bagaimanapun, kami ingin mengubah darin
ke nomor 3-bit lainnya. Jadi, kita menyembunyikan angka 3-bit kami dalam angka ajaib 31-bit (pergeseran 28-bit membutuhkan bit 28-30, dengan penomoran dimulai dari 0.)Saya menghasilkan angka yang dibutuhkan hanya dengan melihat nilai apa yang harus jatuh di mana (mencoba keduanya 0,6 dan 1,,7 sebagai set keluaran). Untungnya, nilai yang tumpang tindih (14, 16, dan 17) berhasil! Dan karena tri-bit pertama
000
dan selanjutnya001
, kita tidak memerlukan 7 bit paling kiri, menghasilkan lebih sedikit digit -> lebih sedikit byte sumber.Angka yang diperlukan adalah
000xxxx001110101011xxxx100xxxx
, di mana x dapat 1 atau 0 dan itu tidak mempengaruhi hasil untuk sub khusus ini - saya mengaturnya ke 0 hanya untuk meminimalkan angka, tetapi mengubah salah satu dari 8 x terakhir seharusnya tidak mempengaruhi panjang kode sumber. Mengatur semua xs ke 0, dan meninggalkan awal, memberikan 1923136 dalam desimal (atau 1D5840 dalam hex, tetapi kemudian Anda memerlukan awalan 0x - malu!) & 7 pada akhirnya hanya menutupi 3 bit terakhir, Anda juga bisa gunakan% 8, tetapi Anda akan membutuhkan tanda kurung karena aturan prioritas operator python.tl; dr: 1923136 mengkodekan masing-masing kombinasi tiga bit dari 0 hingga 6 tepat di tempat yang tepat bahwa nama-nama sandwich ini jatuh pada tempatnya, dan kemudian adalah soal mengambil tiga bit terakhir setelah perubahan yang benar.
sumber
Jelly , 10 byte
Ada apa dengan semua bisnis "enklact" ini?
Tautan monadik mengambil daftar karakter dan mengembalikan hari Senin = 1 hari dalam seminggu.
Cobalah online! atau lihat test-suite
Bagaimana?
sumber
-7761/retinal
kombo?⁽..
.)⁽..
sebenarnya [-31349,32250] - [- 99.999] (ada juga angka lain yang bisa diwakili dengan tiga atau kurang byte seperti7!!
atauȷ76
)C (gcc) ,
727156464139 byteCobalah online!
sumber
i;char x[]="enklact";
lebih pendek darii,x[]={101,110,107,108,97,99,116};
.char*x="enklact"
bahkan lebih pendek: Coba online!i=0
.index
: Coba online!MATL ,
1615 byteCobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
Perl 5 , 24 byte
23 byte kode +1 untuk
-p
.-4 byte terima kasih kepada @nwellnhof !
Cobalah online!
sumber
Saya pikir saya akan memposting beberapa alternatif lain
Javascript 38 byte
Penjelasan: Bit-mask rocks?
Javascript 27 byte
sumber
a=
a=
bagian itu dibutuhkan? Lihatlah jawaban Shaggy .a=
.a=s=>{b=s.Length;return(271474896&7<<b)>>b}
Jelly , 11 byte
Cobalah online!
Penjelasan:
sumber
enklactate
sebagai gantienklact
untuk string saya, dalam hal ini membawanya ke 11;)enk
adalah string danlactate
sebuah kata. EDIT: baru saja dikonfirmasi,enklactate
tidak ada dalam kamus.Japt , 12 byte
Diindeks 0, mengambil input dalam huruf kecil.
Menguji
Penjelasan
Input implisit dari string huruf kecil
U
String yang dikompresi
kotinsm
.Dapatkan indeks pertama (
b
) dari karakter di index (g
) 26 (#
) diU
. (Yay, pembungkus indeks!)Output implisit dari hasil integer.
Alternatif
Sama seperti di atas (dan semua orang lain!), Hanya menggunakan karakter di indeks 3 sebagai gantinya, memungkinkan untuk input judul kasus.
Menguji
sumber
en
? : Pen
dikompresi ke yang tidak diinginkan.bUg
di kode Anda.05AB1E , 11 byte
Disimpan 1 byte berkat Erik the Outgolfer dan 1 byte berkat Magic Octopus Mm.
Cobalah online!
sumber
"enklact"
->’enkl†¼’
’enkl†¼’
->.•ΛΓ2º•
JavaScript (ES6), 25 byte
Diindeks 0.
Menguji
sumber
f=
hanya akan membuatnya 27.GolfScript , 12 byte
Cobalah online!
Memetakan input (melalui jumlah poin kodenya)
0
ke6
.Penjelasan
Ditemukan dengan alat brute force potongan GolfScript yang saya tulis beberapa waktu lalu ...
Berikut ini cara mengubah setiap input ke hasil yang diinginkan:
sumber
Excel, 28 byte
Menggunakan
enklact
metode:sumber
")
Perl 6 , 22 byte
Cobalah online!
sumber
tr/enklact/^6/.comb[3]
yang akan menjadi 22 byte, tetapi tio.run tampaknya belum memilikinya.v2017.6
)CJam , 11 byte
Cobalah online!
Port jawaban GolfScript saya . Biayanya 1 byte untuk membaca input secara eksplisit, tetapi kami menyimpan dua ketika menjumlahkan poin kode.
sumber
Sekam , 10 byte
Cobalah online!
Port lain dari jawaban GolfScript saya . Saya yakin pada akhirnya saya akan menemukan bahasa yang dapat menjumlahkan poin kode untuk satu byte ...
Sekam (pembaruan pasca-tantangan), 9 byte
Cobalah online!
Sekarang,
Σ
apakah jumlah kode poin langsung. Karena ini ditambahkan per permintaan setelah saya menjawab tantangan ini, saya tidak akan menggunakannya sebagai skor utama saya.sumber
Pyth , 13 byte
Verifikasi semua kasus uji.
Alternatif:
3
dapat diganti dengan nilai-nilai berikut:[3, 4, 11, 13, 21, 24, 25, 26]
sumber
Pyke , 12 byte
Coba di sini!
sumber
Proton , 23 byte
Cobalah online!
: P
sumber
Perl 5 , 43 + 1 (
-p
) = 44 byteCobalah online!
Membutuhkan tiga karakter input pertama menjadi huruf besar.
sumber
Java 8, 26 byte
Kredit ke @icrieverytim
Mengambil input sebagai char []
sumber
s->"enklact".indexOf(s[3])
jika Anda menentukan bahwa Anda mengambil input sebagai array char.Haskell , 36 byte
-9 byte berkat H.PWiz.
Cobalah online!
Solusi alternatif, 45 byte
Ini menggunakan
indexOf
fungsiData.List
sebagaielemIndex
.Cobalah online!
sumber
break
. Terima kasih!C ++,
119118777673 byte-41 byte terima kasih kepada Peter Cordes
-1 byte terima kasih kepada Zacharý
-3 byte terima kasih kepada Michael Boger
Pada indeks string 3, karakter untuk setiap sandwich berbeda
Bermain golf dengan
std::string
, itu jelas ofc ... apa yang saya pikirkan ...sumber
std::find
dalam string literal (atau mungkin astd::string
) sepertinya cara yang jelas untuk pergi. Ide dasarnya sama denganindex
ataustrchr
yang digunakan jawaban C, dalam struktur data di mana 0-5 tersirat dari posisi.std::string("enklact").find(p[3])
bekerja dengan baik. Ini menurunkannya 3 karakter.C # (.NET Core) , 289 byte
Jalankan online
sumber
Golfscript, 13 byte
Cobalah online!
Mengambil karakter ke-4 (yang, untuk masing-masing, akan unik) dan mencarinya di string "
enklact
".Kalau tidak:
Ini mengambil keuntungan dari fakta bahwa
?
fungsi Golfscript mengembalikan -1 jika elemen yang dicari tidak ditemukan (yang, untuk hari Senin, tidak akan). Jika ini diizinkan, solusinya dapat dikurangi dengan 1 byte.sumber
Dyalog APL, 13 byte
Cobalah online!
sumber
K (oK) , 13 byte
Larutan:
Cobalah online!
Contoh:
Penjelasan:
Diinterpretasikan dari kanan ke kiri, tarik keluar elemen ke-4 dari input dan kembalikan lokasi indeks-nol dalam daftar "enklact":
sumber