Sandviçimi ne zaman alırım?


37

görüntü tanımını buraya girin

Aşağıdaki girdilerden biri verilir:

Tatlı Soğanlı Tavuk Teriyaki
Fırında Kavrulmuş Tavuk
Hindi göğsü
İtalyanca BMT
Tuna
Kara Orman Jambonu
Köfte Marinara
Pazartesi'den itibaren en düşük sayı olarak başlayan, bu anlaşmayı aldığınız haftanın gününü temsil eden 1-7 (veya 0-6) arasında bir sayı girin. Tercih edildiğinde, girişin tümü küçük harf veya büyük harf olabilir (ör. "İtalyan bmt"). İnternet izin yok.


8
Bu Kolmogorov karmaşıklığının nasıl olduğunu gerçekten görmeyin. Metin giriş ... sayıları çıkış.
geokavel

5
Ayrıca Pazar günü "Köfte Marinara" mı, yoksa "Köfte Marina Ra" mı diyor?
Outgolfer Erik,

17
Marinara olması gerektiğinden oldukça eminim, ama görüntüdeki keming oldukça korkunç ...
tamamen insancıl

6
Eğer herhangi biri için faydalıysa: her bir girişteki ' aartı e' sayısı artı sırasıyla [5,4,3,2,1,3,6] 'dır.
geokavel

Yanıtlar:


85

Python 2 , 38 30 28 bayt

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

Çevrimiçi deneyin!

Maalesef , bugüne kadarki en iyi Python 2 cevabından daha uzun bir süre hala bir bayt; enklact-acroach kullanarak olmasa da .

Şimdi kısa bir byte daha i cri everytim cevabı !

O nasıl çalışır?

Çok fazla kaba kuvvetten sonra, sadece doğru rakamlara sahip bir sayı ile sonuçlanan bir ifade buldum.
Verilen dize uzunluklarının sadece bir basamağına bakmanın 3 byte ( %10) gerektirdiğini fark ettim . Bu yüzden giriş dizelerinin uzunluklarını haftanın gününe doğrudan eşleyen sayıları aramak için başka bir Python programı ( Pastebin bağlantısı ) yazdım .

Sihirli sayı şuna benzer: 6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801(etkileyici 629 ondalık basamağı olan bir sayı)

Ve gördüğünüz gibi, sayı [28, 20, 13, 11, 4, 16, 17] ila [0, 1, 2, 3, 4, 5, 6] 'dan gerekli eşleşmeyi sağlar (Python dizeleri 0- endeksli):

2871 4 733692 3 1 2 34 5 6 20 1 6711326 0 5758628406742167603868834... [4]^ [11]^ [13]^ [16]^ ^[17] ^[20] ^[28]

Benim programı da daha (29 yerine 28) temsil edecek bayt almak olsa da, gerekli özelliğiyle numaralarını verim diğer ifadeler bulundu: 19439**540, 34052**726, 39311**604, 44873**182, 67930**164ve 78579**469. (Bunlar bağlantılı program tarafından bulunan tüm ifadelerdir; yürütülmesi birkaç saat sürmüştür.)

28 bayt gerektiren lambda S:`7954<<850`[len(S)]
alternatif fonksiyon : 29 bayt lambda S:`9699<<2291`[len(S)]
gerektiren lambda S:`853<<4390`[len(S)+9]
alternatif fonksiyon : 30 bayt gerektiren alternatif fonksiyon: 31 bayt gerektiren alternatif fonksiyon:lambda S:`1052<<3330`[len(S)+8]

O nasıl çalışır? Bu numarayı nasıl ürettim? (30 baytlık cevap)

30 baytlık cevap oldu lambda S:`3879**41`[len(S)%10].

Giriş dizgisinin uzunluklarına bakıldığında, [28, 20, 13, 11, 4, 16, 17]on tabanındaki tüm son basamakların farklılık gösterdiğini ve listede sonuçlandığını fark ettim [8, 0, 3, 1, 4, 6, 7]. Bu yüzden sadece bu listeden haftanın yedi gününün listesine bir haritaya ihtiyacım vardı [0, 1, 2, 3, 4, 5, 6].

İlk yaklaşımım sadece eşleme yapmak için bir dize kullandı: lambda S:"13*24*560"[len(S)%10]dize onbir bayt ( "13*24*560") gerektirse de.
Bu yüzden programın daha fazla golf oynamayı ümit ederek, eşleştirilen rakamlarla bir tamsayı ile sonuçlanan aritmetik ifadeleri test etmek için bir Python programı ( Pastebin bağlantısı ) yazdım . Şimdiye kadar bulduğum şey `3879**41`(yalnızca on bayt, programımın bulduğu tek ve dolayısıyla en küçük ifade).

Tabii ki, bir insanın deneyebileceği birçok olası ifade vardır; Sadece a**bihtiyacım olan ufak bir sonucu olan formda bir tane olduğu için şanslıydım .

Sadece meraklı herkes için 3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147.

Ne yazık ki 32 bayt gerektiren alternatif ifadeleri ararken buldum başka bir geçerli fonksiyon: lambda S:`7**416`[len(S)%10+290]


1
Bu numarayı nasıl ürettiniz? : o
totallyhuman

10
@icrieverytim Brute force.
Jonathan Frech

-9114**28aynı zamanda çalışan daha küçük bir tamsayıdır * (* yalnızca negatif olduğu için mutlak terimlerle değil - 629 yerine 111 basamak). Yine de baytlarda tasarruf sağlamaz.
Jonathan Allan

4
Arada sırada HNQ'daki PCG sorularını kontrol ediyorum ve golf dillerinin ilk üç sıra olduğunu bulmak beni hayal kırıklığına uğratıyor. Bugün hayal kırıklığına uğramadım. Teşekkür ederim!
Sidney

4
@icrieverytim ಠ_ಠ aynı sayı, ancak bir tane daha vardiya faktörü ile yarıya indi.
ಠ_ಠ

49

Python 2,29 bayt

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

Çevrimiçi deneyin!

açıklama

Sihirli dize, enklactilk harfleri benzersiz harflerle arayarak bulundu.

İlk sütun SOTITBMkullanışsızdır, çünkü yinelemeler içerir. İkinci ve üçüncü olanlar da işe yaramıyor, çünkü onlar wvutuleve eeranaasırasıyla. Ancak dördüncü sütun, tüm benzersiz harflere sahip olduğu gibi çalışır.

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 bayt

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

Çevrimiçi deneyin!

Jonathan Frech'in cevabına teşekkür ederim (benim ikinci düz kod-golf denemem için) - ayırt edici bir mektup yerine tel uzunluğunu kullanmayı düşünmezdim!

Bu kod, De Bruijn Sequences deneyimim ve satranç programlamamdan kaynaklanıyor.

Satrançta, genellikle her bitin satranç tahtasındaki ilgili karede bir şeyin doğru veya yanlış olduğunu, örneğin “beyaz bir parça var” veya “bu karenin bir piyon içerdiğini” gösterdiği 64 bitlik tamsayılarla çalışırsınız.

Hızla dönüştürmek edebilmek için bu nedenle faydalıdır 2**niçin nhızlı ve ucuz. C ve C ++ 'da bunu yapmanın en hızlı yolu 64 bitlik bir De Bruijn dizisi ile çarpmaktır - nbitlerle kaydırmaya eşdeğerdir - sonra sağa kaydırma 58 (ilk altı bitini en son koymak için - emin olun' yeniden işaretlenmemiş bir int kullanıyorsanız veya bu sürenin yarısı kadarını alırsınız) ve bu 0,.63 sayıyı n, aynı aralıktaki, ancak nadiren aynı sayıdaki karşılığı veren bir tabloda arayın .

Bu bir tür ilişkidir. Ancak yerine 2**ngeçmek yerine, başka bir 3-bit sayıya geçmek nistiyoruz n. Bu yüzden 3 bitlik sayılarımızı sihirli 31 bitlik bir sayıya gizleriz (28 bitlik bir kayma 28-30 bit gerektirir, numaralandırma 0'dan başlar.)

Sadece hangi değerlerin nereye düşmesi gerektiğini görerek gerekli sayıyı oluşturdum (çıkış kümeleri olarak hem 0,6 hem de 1,7'yi deneyin). Neyse ki, örtüşen değerler (14, 16 ve 17) işe yaradı! Ve ilk tri-bit olduğu 000ve bir sonraki olduğu için 001, en soldaki 7 bit'e ihtiyacımız yok, sonuçta daha az basamak -> daha az kaynak baytı.

Gerekli sayı 000xxxx001110101011xxxx100xxxx, x'lerin 1 veya 0 olabileceği ve bu belirli alt sonuçların sonucunu etkilemediği durumdadır - sayıyı en aza indirmek için onları 0'a ayarladım, ancak son 8 x'in herhangi birini değiştirmek etkilenmemelidir. kaynak kodun uzunluğu. Tüm x'leri 0'a ayarlamak ve başlangıçtan çıkmak, 1923136'yı ondalık olarak verir (veya hex'te 1D5840 verir, ancak daha sonra 0x önekine ihtiyacınız vardır - utanç!) Sonunda & 7 sadece son 3 bitin maskesini alır. % 8 kullanın, ancak python'un işleç önceliği kuralları nedeniyle parantez gerekir.

tl; dr: 1923136, 0 ila 6 arasındaki üç bitlik kombinasyonların her birini, tam olarak bu sandviç adlarının yer aldığı doğru noktalarda kodlar ve daha sonra, doğru bir değişimden sonra son üç bitin alınması meselesidir.


Benim bit maskesi yaklaşımıma benzer, ama daha da iyisi.
Bruno Costa,

12

Jöle , 10 bayt

Bütün bu "enklact" işinde ne var?

⁽ṃXị“Ð$¥»i

Karakter listesini alan ve pazartesi günü dönen monadik bir bağlantı = haftanın 1 günü.

Çevrimiçi deneyin! veya test odasına bakın

Nasıl?

⁽ṃ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

Komboyu nasıl buldunuz -7761/retinal?
Emigna

3
"Kelimeler" oluşturarak ve sözlükte olup olmadıklarını görerek geçen bir döngü yazdı. "retinal", -32249 ile 32250 (aralığı ⁽..) arasındaki tek kişiydi .
Jonathan Allan

... hafif hata - aralığı ⁽..aslında [-31349,32250] - [- 99,999] (biri veya üç ya da daha az bayt ile temsil edebilecek başka numaralar 7!!da vardır ȷ76)
Jonathan Allan

9

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

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

Çevrimiçi deneyin!


i;char x[]="enklact";daha kısa i,x[]={101,110,107,108,97,99,116};.
Jonathan Frech

Bunu göndermek üzereydi mi: char*x="enklact"daha kısa: çevrimiçi deneyin!
scottinet

Ayrıca, kaldırabilirsiniz i=0.
Jonathan Frech

Kullanarak daha da kısa versiyon index: Çevrimiçi deneyin!
scottinet

@scottinet Güzel! İndex () 'yi daha önce hiç kullanmamıştım. Thanks
cleblanc



5

Birkaç alternatif daha gönderirim diye düşündüm.

Javascript 38 bayt

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

Açıklama: Bit maskesi kayalar?

Javascript 27 bayt

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

2. alternatif 29 byte uzun süredir unutuldua=
Bruno Costa

a=Parça neden gerekli? Shaggy'nin cevabına bak .
geokavel

1
@BrunoCosta Bu sitede, işlevlerinizi adlandırmanızı istemiyoruz. Anonim olanlar işe yarıyor, yani ihtiyacın yok a=.
Rɪᴋᴇʀ

1
@ BrunoCosta havalı değil, gerçekten size kalmış. Ayrıca sadece başlık bayt sayımında sayılmaz ve test kolaylığı için pasaja dahil edemezsiniz.
Rɪᴋᴇʀ

1
@MichaelBoger Ne yazık ki, bence bu işi yapmak için gereken asgari miktarda kod, bunun satırları boyunca bir şey olduğuna inanıyoruma=s=>{b=s.Length;return(271474896&7<<b)>>b}
Bruno Costa

4

Jöle , 11 bayt

4ị“-ƭɼoṚ0»i

Çevrimiçi deneyin!

Açıklama:

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

2
@ Mr.Xcoder string'im enklactateyerine kullanmazsam enklact, bu durumda onu 11'e düşürür;)
Outgolfer Erik

5
Ah, şekerleme aşkına, neden Jelly'nin sözlüğünde enklaktat var?
tamamen insan

3
@icrieverytim Değil, enkbir dize ve lactatebir kelimedir. EDIT: sadece onaylandı, enklactatesözlükte yok.
Outgolfer Erik,

1
@icrieverytim bence sadece laktat .
Bay Xcoder

2
Maaan, Jelly'in sözlüğüyle dalga geçmenin bir yolunu bulmak istedim ... Belki bir dahaki sefere. : P
totallyhuman

3

Japt , 12 bayt

0 indeksli, küçük harflerle giriş yapar.

`kÇXsm`bUg#

Dene


açıklama

Küçük harfli dizgelerin örtük girişleri U

`kÇXsm`

Sıkıştırılmış dize kotinsm.

bUg#

bKarakterin ilk indexini ( ) index ( g) 26 ( #) 'de alın U. (Yay, indeks sarma!)

Tamsayı sonucunun örtük çıktısı.


Alternatif

Yukarıdakilerle aynı (ve diğerleri!), Sadece indeks 3'teki karakterleri kullanarak, başlık harfleri girişine izin vererek.

`klact`bUg3

Dene


Nereye gitti en? : P
totallyhuman

1
@icrieverytim: bu sıkıştırılmış bir dize; enyazdırılamaz yazdırılır.
Shaggy

7
Sanırım bUgkodunda bir kod görüyorum .
Zona


3

JavaScript (ES6), 25 bayt

0 endeksli.

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

Dene

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
Bu 25 bayt !
geokavel

Teşekkürler, @geokavel. Bu ekstra 3 baytı nereden aldığımı bilmiyorum; bile saymak f=sadece 27 yapardı.
Shaggy

basit ve etkili bir çözüm. +1 :)
Brian H.

@Shaggy Belki de üçüncü ekstra baytınız takip eden bir yeni satırdı.
Michael Boger

3

GolfScript , 12 bayt

{+}*93&(5?7%

Çevrimiçi deneyin!

(Kendi kod noktası toplamı üzerinden) giriş eşleştirir 0için 6.

açıklama

Bir süre önce yazdığım bir GolfScript snippet kaba kuvvet aracıyla bulundu ...

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

Bu, girişlerin her birini istenen sonuca dönüştürür:

                                 {+}*   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 bayt

enklactYöntemi kullanarak :

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

Bunu Google Sayfalarına dönüştürerek ve bırakarak 2 bayt bırakabilirsiniz")
Taylor Scott

2

Perl 6 , 22 bayt

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

Çevrimiçi deneyin!


perl 2017.07 tr/enklact/^6/.comb[3]22 bayt olacağını kabul ediyor , ancak tio.run henüz buna sahip değil.
Massa

(tio.run perl6 çalışır v2017.6)
Massa

1
22 byte sürümünü çalıştırabilecek bir tercüman bulunduğu sürece geçerlidir.
Shaggy






1

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

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

Çevrimiçi deneyin!

Girişin ilk üç karakterinin büyük harf olmasını gerektirir.


Hepsi büyük harf, küçük harf veya normal olmalıdır.
geokavel

Öyleyse hepsini büyük harfle çağır. İlk üç karakterin ötesindeki herhangi bir şey göz ardı edilir.
Xcali

1

Java 8, 26 bayt

@İcrieverytim kullanıcısına kredi ver

Karakteri olarak girdi alır []

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

s->"enklact".indexOf(s[3])Girdiyi karakter dizisi olarak aldığınızı belirtirseniz yapabilirsiniz .
shooqie

Uygun mu? Bu şekilde kısaltılabilen birkaç cevabım var
Roberto Graham


1

C ++, 119 118 77 76 73 bayt

Peter
Boges -1 byte sayesinde -41 byte , Zacharý
-3 byte sayesinde

Dize endeksi 3'te her sandviç için karakter farklıdır

#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);
}

Golf std::stringoynamak, bu açıktı ... ne düşünüyordum ...


1
std::findbir dizgede değişmez (ya da belki bir std::string), gidilecek bariz yol gibi gözüküyor. Temel olarak , C cevaplarıyla aynı fikirde indexveya strchr0-5'in açık olduğu bir veri yapısında kullanılıyor.
Peter Cordes

2. ve 3. satırlar arasındaki yeni satırı kaldırabilirsiniz.
Zacharý

Enklact saklamak için bir değişken gerekmez. std::string("enklact").find(p[3])iyi çalışıyor. Bu 3 karakter aşağı getiriyor.
Michael Boger

Dize değişmezlerini işlevinize aktarabilirsiniz (g ++ yalnızca bir uyarı oluşturur), böylece memcpy öğelerine gerek kalmaz.
Michael Boger

0

C # (.NET Core) , 289 bayt

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()));}}

Çevrimiçi çalıştır


0

Golf Betiği, 13 bayt

Çevrimiçi deneyin!

'enklact'\3=?

Dördüncü karakteri alır (her biri için benzersiz olacaktır) ve " enklact" dizgisine bakar .

Alternatif:

'nklact'\3=?)

Bu, ?aranan öğe bulunamadığında Golfscript'in işlevinin -1 döndürmesi gerçeğinden faydalanır (bu, Pazartesi için, olmayacaktır). Buna izin verilirse, çözelti 1 bayt azaltılabilirdi.



0

K (oK) , 13 bayt

Çözüm:

"enklact"?*3_

Çevrimiçi deneyin!

Örnekler:

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

Açıklama:

Sağdan sola yorumlanır, 4. öğeyi girişten çıkarır ve "enklact" listesinde sıfır dizin konumunu döndürür:

"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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.