Kapan saya mendapatkan sandwich saya?


37

masukkan deskripsi gambar di sini

Diberikan salah satu dari input berikut:

Bawang Ayam Teriyaki Manis
Ayam Bakar Oven
Dada kalkun
BMT Italia
tuna
Black Forest Ham
Bakso Marinara
Keluarkan 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.


8
Tidak terlalu melihat betapa rumitnya Kolmogorov ini. Teks adalah input ... angka adalah output.
geokavel

5
Juga apakah hari Minggu mengatakan "Bakso Marinara" atau "Bakso Marina Ra"?
Erik the Outgolfer

17
Saya cukup yakin itu seharusnya Marinara tetapi keming dalam gambar cukup mengerikan ...
totallyhuman

6
Jika bermanfaat bagi siapa pun: jumlah a's ditambah jumlah e' s di setiap input adalah [5,4,3,2,1,3,6] masing-masing.
geokavel

Jawaban:


85

Python 2 , 38 30 28 byte

lambda S:`6793**164`[len(S)]

Cobalah online!

Sayangnya masih satu byte lebih lama dari jawaban Python 2 terbaik sejauh ini; meskipun tidak menggunakan enklactpendekatan-.

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**164dan 78579**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**bdengan 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]


1
Bagaimana Anda menghasilkan angka itu? : o
totallyhuman

10
@icrieverytim Brute force.
Jonathan Frech

-9114**28adalah integer yang lebih kecil * yang juga berfungsi (* secara absolut bukan hanya karena negatif - 111 digit daripada 629). Tidak menghemat byte.
Jonathan Allan

4
Sesekali saya memeriksa pertanyaan PCG di HNQ, dan saya biasanya kecewa menemukan bahasa golf adalah tiga tempat teratas. Hari ini saya tidak kecewa. Terima kasih!
Sidney

4
@icrieverytim ಠ_ಠ itu hanya nomor yang sama tetapi dibelah dua dengan faktor shift satu lagi ಠ_ಠ: P
HyperNeutrino

49

Python 2 , 29 byte

lambda s:'enklact'.find(s[3])

Cobalah online!

Penjelasan

Senar ajaib,, enklactditemukan dengan mencari kolom pertama dengan huruf unik.

Kolom pertama SOTITBMyang tidak berguna karena mengandung duplikat. Yang kedua dan ketiga juga tidak berfungsi karena mereka wvutuledan eeranaamasing - masing. Kolom keempat, namun berfungsi karena memiliki semua huruf unik.

lambda s:'enklact'.find(s[3])

lambda s:                      # declare a function that takes a single paramater s
                  .find(    )  # find the index of the first instance of...
                        s[3]   # the fourth (0-indexing) character of s...
         'enklact'             # in the magic string

18

Python , 26 byte

lambda S:1923136>>len(S)&7

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**ndengan ncepat dan murah. Dalam C dan C ++, cara tercepat untuk melakukan ini adalah mengalikannya dengan urutan De Bruijn 64-bit - setara dengan menggeser nbit - 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 korespondensi nyang berada dalam kisaran yang sama, tetapi jarang jumlahnya sama.

Ini semacam terkait. Alih-alih mengubah dari 2**nke n, bagaimanapun, kami ingin mengubah dari nke 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 000dan selanjutnya 001, 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.


Cukup mirip dengan pendekatan topeng bit saya, tetapi bahkan lebih baik.
Bruno Costa

12

Jelly , 10 byte

Ada apa dengan semua bisnis "enklact" ini?

⁽ṃXị“Ð$¥»i

Tautan monadik mengambil daftar karakter dan mengembalikan hari Senin = 1 hari dalam seminggu.

Cobalah online! atau lihat test-suite

Bagaimana?

⁽ṃXị“Ð$¥»i - Link: list of characters, sandwichName  e.g. "Tuna"
⁽ṃX        - base 250 literal                             -7761
   ị       - index into sandwichName (1-indexed & modular) 'n'
    “Ð$¥»  - dictionary word                               "retinal"
         i - index of                                           5

Bagaimana Anda menemukan -7761/retinalkombo?
Emigna

3
Tulis loop yang dijalankan melalui pembuatan "kata-kata" dan lihat apakah ada di kamus. "retinal" adalah satu-satunya antara -32249 dan 32250 (kisaran ⁽...)
Jonathan Allan

... sedikit kesalahan - kisaran ⁽..sebenarnya [-31349,32250] - [- 99.999] (ada juga angka lain yang bisa diwakili dengan tiga atau kurang byte seperti 7!!atau ȷ76)
Jonathan Allan

9

C (gcc) , 72 71 56 46 41 39 byte

f(char*s){s=index(s="enklact",s[3])-s;}

Cobalah online!


i;char x[]="enklact";lebih pendek dari i,x[]={101,110,107,108,97,99,116};.
Jonathan Frech

Akan memposting itu ke: char*x="enklact"bahkan lebih pendek: Coba online!
scottinet

Anda juga dapat menghapus i=0.
Jonathan Frech

Versi yang lebih singkat menggunakan index: Coba online!
scottinet

@ skottinet Bagus! Saya belum pernah menggunakan index () sebelumnya. Terima kasih
cleblanc

7

MATL , 16 15 byte

O5OHlO7KI6vjYm)

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

O5OHlO7KI6 % Push numbers 0, 5, 0, 2, 1, 0, 7, 4, 3, 6
v          % Concatenate all numbers into a column vector
j          % Push input as a string
Ym         % Mean (of ASCII codes)
)          % Index into the column vector (modular, 1-based, with implicit rounding)
           % Implicit display


5

Saya pikir saya akan memposting beberapa alternatif lain

Javascript 38 byte

a=s=>(271474896&7<<s.Length)>>s.Length

Penjelasan: Bit-mask rocks?

Javascript 27 byte

s=>"240350671"[s.length%10]

alternatif ke-2 lupa 29 bytea=
Bruno Costa

Mengapa a=bagian itu dibutuhkan? Lihatlah jawaban Shaggy .
geokavel

1
@BrunoCosta Di situs ini, kami tidak mengharuskan Anda menyebutkan nama fungsi Anda. Yang anonim berfungsi, jadi Anda tidak perlu a=.
Rɪᴋᴇʀ

1
@BrunoCosta itu keren, terserah Anda. Anda juga bisa tidak menghitungnya dalam jumlah byte header, dan memasukkannya ke dalam snippet untuk kemudahan pengujian.
Rɪᴋᴇʀ

1
@MichaelBoger Unfofrtantly Saya tidak berpikir itu bisa karena jumlah minimum kode untuk membuat itu bekerja saya percaya itu sesuatu di sepanjang garisa=s=>{b=s.Length;return(271474896&7<<b)>>b}
Bruno Costa

4

Jelly , 11 byte

4ị“-ƭɼoṚ0»i

Cobalah online!

Penjelasan:

4ị“-ƭɼoṚ0»i
4ị          4th element of z
  “-ƭɼoṚ0»i First index in "enklactate"

2
@ Mr.Xcoder kecuali saya gunakan enklactatesebagai ganti enklactuntuk string saya, dalam hal ini membawanya ke 11;)
Erik the Outgolfer

5
Oh, demi fudge, mengapa enklactate dalam kamus Jelly?
totallyhuman

3
@icrieverytim Bukan, enkadalah string dan lactatesebuah kata. EDIT: baru saja dikonfirmasi, enklactatetidak ada dalam kamus.
Erik the Outgolfer

1
@icrieverytim, saya pikir itu hanya laktat .
Tn. Xcoder

2
Ah maaan, aku ingin mencari cara untuk mengejek kamus Jelly ... Mungkin lain kali. : P
totallyhuman

3

Japt , 12 byte

Diindeks 0, mengambil input dalam huruf kecil.

`kÇXsm`bUg#

Menguji


Penjelasan

Input implisit dari string huruf kecil U

`kÇXsm`

String yang dikompresi kotinsm.

bUg#

Dapatkan indeks pertama ( b) dari karakter di index ( g) 26 ( #) di U. (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.

`klact`bUg3

Menguji


Kemana perginya en? : P
totallyhuman

1
@icrieverytim: itu adalah string terkompresi; endikompresi ke yang tidak diinginkan.
Shaggy

7
Saya rasa saya melihat bUgdi kode Anda.
shenles


3

JavaScript (ES6), 25 byte

Diindeks 0.

s=>"enklact".search(s[3])

Menguji

o.innerText=(f=
s=>"enklact".search(s[3])
)(i.value);oninput=_=>o.innerText=f(i.value)
<select id=i><option selected value="Sweet Onion Chicken Teriyaki">Sweet Onion Chicken Teriyaki</option><option value="Oven Roasted Chicken">Oven Roasted Chicken</option><option value="Turkey Breast">Turkey Breast</option><option value="Italian BMT">Italian BMT</option><option value="Tuna">Tuna</option><option value="Black Forest Ham">Black Forest Ham</option><option value="Meatball Marinara">Meatball Marinara</option></select><pre id=o>


1
Ini adalah 25 byte !
geokavel

Terima kasih, @geokavel. Tidak tahu dari mana saya mendapat ekstra 3 byte itu; bahkan menghitung f=hanya akan membuatnya 27.
Shaggy

solusi sederhana dan efektif. +1 :)
Brian H.

@ Shaggy Mungkin byte tambahan ketiga Anda adalah baris tambahan.
Michael Boger

3

GolfScript , 12 byte

{+}*93&(5?7%

Cobalah online!

Memetakan input (melalui jumlah poin kodenya) 0ke 6.

Penjelasan

Ditemukan dengan alat brute force potongan GolfScript yang saya tulis beberapa waktu lalu ...

{+}*  # Sum all code points.
93&   # ... AND 93.
(     # Decrement.
5?    # ... raised to the fifth power.
7%    # ... modulo 7.

Berikut ini cara mengubah setiap input ke hasil yang diinginkan:

                                 {+}*   93&     (            5?   7%
Sweet Onion Chicken Teriyaki     2658    64    63     992436543    0
Oven Roasted Chicken             1887    93    92    6590815232    1
Turkey Breast                    1285     5     4          1024    2
Italian BMT                       965    69    68    1453933568    3
Tuna                              408    24    23       6436343    4
Black Forest Ham                 1446     4     3           243    5
Meatball Marinara                1645    77    76    2535525376    6

2

Excel, 28 byte

Menggunakan enklactmetode:

=FIND(MID(A1,4,1),"enklact")

Anda dapat menjatuhkan 2 byte dengan mengonversikannya ke Google Sheets dan menjatuhkan")
Taylor Scott

2

Perl 6 , 22 byte

tr/enklact/^6/.comb[3]

Cobalah online!


perl 2017.07 menerima tr/enklact/^6/.comb[3]yang akan menjadi 22 byte, tetapi tio.run tampaknya belum memilikinya.
Massa

(tio.run menjalankan perl6 v2017.6)
Massa

1
Selama ada interpreter yang dapat menjalankan versi 22 byte, itu valid.
Shaggy


2

Sekam , 10 byte

%7^5←n93ṁc

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

%7^5←n93Σ

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.





1

Perl 5 , 43 + 1 ( -p) = 44 byte

for$i(S,O,TUR,I,TUN,B,M){$"++;$_=$"if/^$i/}

Cobalah online!

Membutuhkan tiga karakter input pertama menjadi huruf besar.


Itu harus semua huruf besar, semua huruf kecil, atau biasa.
geokavel

Sebut semua huruf besar, lalu. Apa pun di luar tiga karakter pertama diabaikan.
Xcali

1

Java 8, 26 byte

Kredit ke @icrieverytim

Mengambil input sebagai char []

s->"enklact".indexOf(s[3])

Anda dapat melakukannya s->"enklact".indexOf(s[3])jika Anda menentukan bahwa Anda mengambil input sebagai array char.
shooqie

Apakah itu tidak apa apa? Saya punya beberapa jawaban yang dapat disingkat seperti itu
Roberto Graham


1

C ++, 119 118 77 76 73 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

#include<string>
int s(char*p){return std::string("enklact").find(p[3]);}
std::initializer_list<char*> t{
    "Sweet Onion Chicken Teriyaki",
    "Oven Roasted Chicken",
    "Turkey Breast",
    "Italian BMT",
    "Tuna",
    "Black Forest Ham",
    "Meatball Marinara"
};

for (auto& a : t) {
    std::cout << s(a);
}

Bermain golf dengan std::string, itu jelas ofc ... apa yang saya pikirkan ...


1
std::finddalam string literal (atau mungkin a std::string) sepertinya cara yang jelas untuk pergi. Ide dasarnya sama dengan indexatau strchryang digunakan jawaban C, dalam struktur data di mana 0-5 tersirat dari posisi.
Peter Cordes

Anda dapat menghapus baris baru di antara baris 2 dan 3.
Zacharý

Anda tidak perlu variabel untuk menyimpan enklact. std::string("enklact").find(p[3])bekerja dengan baik. Ini menurunkannya 3 karakter.
Michael Boger

Anda BISA meneruskan string literal ke fungsi Anda (g ++ hanya memunculkan peringatan) sehingga barang memcpy tidak diperlukan.
Michael Boger

0

C # (.NET Core) , 289 byte

using System;class c{delegate int s(string r);static void Main(){s y=x=>{if(x[0]==83)return 1;if(x[0]==79)return 2;if (x[0]==84&x[2]=='r')return 3;if(x[0]==73)return 4;if(x[0]==84)return 5;if(x[0] ==66)return 6;if(x[0]==77)return 7;return 0;};Console.Write(y.Invoke(Console.ReadLine()));}}

Jalankan online


0

Golfscript, 13 byte

Cobalah online!

'enklact'\3=?

Mengambil karakter ke-4 (yang, untuk masing-masing, akan unik) dan mencarinya di string " enklact".

Kalau tidak:

'nklact'\3=?)

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.



0

K (oK) , 13 byte

Larutan:

"enklact"?*3_

Cobalah online!

Contoh:

> "enklact"?*3_"Black Forest Ham"
5
> "enklact"?*3_"Turkey Breast"
2

Penjelasan:

Diinterpretasikan dari kanan ke kiri, tarik keluar elemen ke-4 dari input dan kembalikan lokasi indeks-nol dalam daftar "enklact":

"enklact"?*3_  / the solution
           3_  / 3 drop, 3_"Turkey Breast" => "key Breast" 
          *    / first, *"key Breast" => "k"
         ?     / lookup right in left
"enklact"      / list to lookup element in
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.