Khi nào tôi nhận được bánh sandwich của tôi?


37

nhập mô tả hình ảnh ở đây

Cho một trong các đầu vào sau:

Gà ngọt hành tây Teriyaki
Gà nướng lò
Thổ Nhĩ Kỳ vú
BMT Ý
cá ngừ
Rừng đen
Thịt viên Marinara
xuất một số từ 1-7 (hoặc 0-6) đại diện cho ngày trong tuần mà bạn nhận được thỏa thuận đó, bắt đầu từ thứ Hai là số thấp nhất. Đầu vào có thể là tất cả chữ thường hoặc chữ hoa nếu được ưu tiên (nghĩa là "bmt tiếng Ý"). Không cho phép internet.


8
Đừng thực sự thấy sự phức tạp của Kolmogorov này. Văn bản là đầu vào ... số là đầu ra.
geokavel

5
Chủ nhật cũng nói "Meatball Marinara" hay "Meatball Marina Ra"?
Erik the Outgolfer

17
Tôi khá chắc chắn rằng đó là Marinara nhưng kem trong hình ảnh khá khủng khiếp ...
hoàn toàn là

6
Nếu nó hữu ích với bất kỳ ai: số lượng acộng với số lượng etrong mỗi đầu vào tương ứng là [5,4,3,2,1,3,6].
geokavel

Câu trả lời:


85

Python 2 , 38 30 28 byte

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

Hãy thử trực tuyến!

Thật không may, vẫn còn một byte dài hơn câu trả lời Python 2 tốt nhất cho đến nay; mặc dù không sử dụng enklact-approach.

Bây giờ một byte ngắn hơn câu trả lời của tôi cri everytim !

Làm thế nào nó hoạt động?

Sau rất nhiều lực lượng vũ phu, tôi tìm thấy một biểu thức dẫn đến một số có đúng các chữ số.
Tôi nhận thấy rằng chỉ nhìn vào một chữ số cụ thể có độ dài của chuỗi đã cho cần 3 byte ( %10). Vì vậy, tôi đã viết một chương trình Python khác ( liên kết Pastebin ) để tìm kiếm thêm các số người trực tiếp ánh xạ độ dài của chuỗi đầu vào đến ngày trong tuần.

Số ma thuật trông như thế này: 6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801(một số có 629 chữ số thập phân ấn tượng)

Và như bạn có thể thấy, số này cung cấp ánh xạ cần thiết từ [28, 20, 13, 11, 4, 16, 17] đến [0, 1, 2, 3, 4, 5, 6] (Chuỗi Python là 0- được lập chỉ mục):

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

Chương trình của tôi cũng tìm thấy những biểu hiện khác mà mang số với tài sản cần thiết, mặc dù họ mất nhiều byte để biểu diễn (29 thay vì 28): 19439**540, 34052**726, 39311**604, 44873**182, 67930**16478579**469. (Đó là tất cả các biểu thức được tìm thấy bởi chương trình được liên kết; quá trình thực thi của nó mất vài giờ.)

Hàm thay thế yêu cầu 28 byte: lambda S:`7954<<850`[len(S)]
Hàm thay thế yêu cầu 29 byte: lambda S:`9699<<2291`[len(S)]
Hàm thay thế yêu cầu 30 byte: lambda S:`853<<4390`[len(S)+9]
Hàm thay thế yêu cầu 31 byte:lambda S:`1052<<3330`[len(S)+8]

Làm thế nào nó hoạt động? Làm thế nào tôi tạo ra số đó? (Câu trả lời 30 byte)

Câu trả lời 30 byte là lambda S:`3879**41`[len(S)%10].

Nhìn vào độ dài của chuỗi đầu vào [28, 20, 13, 11, 4, 16, 17], tôi nhận thấy rằng tất cả các chữ số cuối cùng trong cơ sở mười khác nhau, dẫn đến danh sách [8, 0, 3, 1, 4, 6, 7]. Vì vậy, tôi chỉ cần một ánh xạ từ danh sách đó vào danh sách của tất cả bảy ngày trong tuần , [0, 1, 2, 3, 4, 5, 6].

Cách tiếp cận đầu tiên của tôi chỉ đơn giản là sử dụng một chuỗi để thực hiện ánh xạ: lambda S:"13*24*560"[len(S)%10]mặc dù chuỗi yêu cầu mười một byte ( "13*24*560").
Vì vậy, tôi đã viết một chương trình Python ( liên kết Pastebin ) để kiểm tra các biểu thức số học dẫn đến một số nguyên có các chữ số phù hợp, hy vọng sẽ tiếp tục chơi chương trình này. Những gì tôi nghĩ ra cho đến nay là `3879**41`(chỉ mười byte, biểu thức duy nhất và do đó nhỏ nhất mà chương trình của tôi tìm thấy).

Tất nhiên, có nhiều cách diễn đạt khác nhau mà người ta có thể thử; Tôi chỉ may mắn khi có một mẫu trong mẫu a**bcó kết quả khá nhỏ phù hợp với nhu cầu của tôi.

Chỉ dành cho bất cứ ai tò mò 3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147,.

Một hàm hợp lệ khác mà tôi đã tìm thấy trong khi tìm kiếm các biểu thức thay thế không may yêu cầu 32 byte: lambda S:`7**416`[len(S)%10+290]


1
Làm thế nào bạn tạo ra số đó? : o
hoàn toàn là

10
@icrieverytim Lực lượng vũ phu.
Jonathan Frech

-9114**28là một số nguyên nhỏ hơn * cũng hoạt động (* về mặt tuyệt đối không chỉ vì nó âm - 111 chữ số chứ không phải 629). Không lưu trên byte mặc dù.
Jonathan Allan

4
Thỉnh thoảng tôi kiểm tra các câu hỏi PCG trong HNQ, và tôi thường thất vọng khi thấy ngôn ngữ chơi gôn là ba điểm hàng đầu. Hôm nay tôi đã không thất vọng. Cảm ơn bạn!
Sidney

4
@icrieverytim _ಠ chỉ là cùng một số nhưng giảm một nửa với hệ số dịch chuyển thêm một
ಠ_ಠ

49

Python 2 , 29 byte

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

Hãy thử trực tuyến!

Giải trình

Chuỗi ma thuật enklact, đã được tìm thấy bằng cách tìm kiếm cột đầu tiên với các chữ cái duy nhất.

Cột đầu tiên SOTITBMkhông hữu ích vì nó chứa các bản sao. Cái thứ hai và thứ ba cũng không hoạt động vì chúng là wvutuleeeranaatương ứng. Cột thứ tư, tuy nhiên hoạt động vì nó có tất cả các chữ cái duy nhất.

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

Hãy thử trực tuyến!

Với một món nợ cảm ơn (cho lần thử golf thứ hai liên tiếp của tôi) cho câu trả lời của Jonathan Frech - tôi đã không nghĩ sẽ sử dụng độ dài chuỗi thay vì một chữ cái phân biệt!

Mã này xuất phát từ kinh nghiệm của tôi với De Bruijn Sequences và lập trình cho cờ vua.

Trong cờ vua, bạn thường làm việc với một số nguyên 64 bit, trong đó mỗi bit chỉ ra điều gì đó đúng hoặc sai về ô vuông tương ứng trên bàn cờ, chẳng hạn như "có một mảnh trắng ở đây" hoặc "ô vuông này chứa một con tốt".

Do đó, rất hữu ích để có thể nhanh chóng chuyển đổi 2**nđể nnhanh chóng và rẻ. Trong C và C ++, cách nhanh nhất để thực hiện việc này là nhân với chuỗi De Bruijn 64 bit - tương đương với dịch chuyển theo nbit - sau đó dịch chuyển sang phải 58 (để đặt sáu bit đầu tiên cuối cùng - đảm bảo bạn ' đang sử dụng một số nguyên không dấu hoặc bạn sẽ nhận được 1 giây một nửa) và tìm kiếm số 0..63 này trong một bảng cung cấp cho bạn số tương ứng ntrong cùng một phạm vi, nhưng hiếm khi cùng một số.

Đây là loại liên quan. Tuy nhiên, thay vì thay đổi từ 2**nsang n, chúng tôi muốn thay đổi từ nmột số 3 bit khác. Vì vậy, chúng tôi ẩn các số 3 bit của mình trong một số 31 bit ma thuật (dịch chuyển 28 bit yêu cầu các bit 28-30, với việc đánh số bắt đầu từ 0.)

Tôi đã tạo ra số cần thiết bằng cách chỉ xem giá trị nào phải giảm ở đâu (thử cả 0..6 và 1..7 làm bộ đầu ra). May mắn thay, các giá trị chồng chéo (14, 16 và 17) xảy ra! Và vì tri-bit đầu tiên là 000và tiếp theo là 001, chúng ta không cần 7 bit ngoài cùng bên trái, dẫn đến ít chữ số hơn -> ít byte nguồn hơn.

Số được yêu cầu là 000xxxx001110101011xxxx100xxxx, trong đó x có thể là 1 hoặc 0 và nó không ảnh hưởng đến kết quả của các mục phụ cụ thể này - Tôi đặt chúng thành 0 chỉ để giảm thiểu số, nhưng thay đổi bất kỳ trong số 8 x cuối cùng sẽ không ảnh hưởng độ dài của mã nguồn. Đặt tất cả các xs thành 0 và tắt bắt đầu, cung cấp 1923136 ở dạng thập phân (hoặc 1D5840 ở dạng hex, nhưng sau đó bạn cần tiền tố 0x - xấu hổ!) Cuối cùng & 7 chỉ che dấu 3 bit cuối cùng, bạn cũng có thể sử dụng% 8, nhưng sau đó bạn sẽ cần dấu ngoặc đơn do các quy tắc ưu tiên toán tử của python.

tl; dr: 1923136 mã hóa từng tổ hợp ba bit từ 0 đến 6 theo đúng vị trí mà các tên sandwich này xảy ra, và sau đó là vấn đề lấy ba bit cuối cùng sau khi dịch chuyển đúng.


Khá giống với cách tiếp cận mặt nạ bit của tôi, nhưng thậm chí còn tốt hơn.
Bruno Costa

12

Thạch , 10 byte

Điều gì với tất cả các doanh nghiệp "enklact" này?

⁽ṃXị“Ð$¥»i

Một liên kết đơn âm lấy danh sách các ký tự và trả về Thứ Hai = 1 ngày trong tuần.

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm

Làm sao?

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

Làm thế nào bạn tìm thấy -7761/retinalcombo?
Emigna

3
Đã viết một vòng lặp chạy qua việc tạo ra "từ" và xem liệu chúng có tồn tại trong từ điển không. "võng mạc" là người duy nhất trong khoảng từ -32249 đến 32250 (phạm vi ⁽...)
Jonathan Allan

... một lỗi nhỏ - phạm vi ⁽..thực sự là [-31349,32250] - [- 99.999] (cũng có những số khác mà một người có thể đại diện với ba hoặc ít byte như 7!!hoặc ȷ76)
Jonathan Allan

9

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

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

Hãy thử trực tuyến!


i;char x[]="enklact";ngắn hơn i,x[]={101,110,107,108,97,99,116};.
Jonathan Frech

Đã sắp đăng bài đó lên: char*x="enklact"thậm chí còn ngắn hơn: Hãy thử trực tuyến!
scottinet

Ngoài ra, bạn có thể loại bỏ i=0.
Jonathan Frech

Phiên bản thậm chí ngắn hơn bằng cách sử dụng index: Hãy thử trực tuyến!
scottinet

@scottinet Đẹp quá! Tôi chưa bao giờ sử dụng index () trước đây. Cảm ơn
cleblanc



5

Tôi nghĩ rằng tôi sẽ đăng một vài lựa chọn thay thế khác

Javascript 38 byte

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

Giải thích: Đá mặt nạ bit?

Javascript 27 byte

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

thay thế thứ 2 là 29 byte dài bị quêna=
Bruno Costa

Tại sao a=phần cần thiết? Nhìn vào câu trả lời của Shaggy .
geokavel

1
@BrunoCosta Trên trang web này, chúng tôi không yêu cầu bạn đặt tên cho các chức năng của mình. Những cái ẩn danh hoạt động, vì vậy bạn không cần a=.
Rɪᴋᴇʀ

1
@BrunoCosta tha'ts tuyệt, nó thực sự tùy thuộc vào bạn. Bạn cũng có thể không đếm nó trong số byte tiêu đề và đưa nó vào đoạn trích để dễ kiểm tra.
Rɪᴋᴇʀ

1
@MichaelBoger Vô tình Tôi không nghĩ nó có thể bởi vì số lượng mã tối thiểu để thực hiện công việc đó Tôi tin rằng đó là thứ gì đó dọc theoa=s=>{b=s.Length;return(271474896&7<<b)>>b}
Bruno Costa

4

Thạch , 11 byte

4ị“-ƭɼoṚ0»i

Hãy thử trực tuyến!

Giải trình:

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

2
@ Mr.Xcoder trừ khi tôi sử dụng enklactatethay vì enklactcho chuỗi của mình, trong trường hợp đó, nó sẽ giảm xuống còn 11;)
Erik the Outgolfer

5
Ồ, đối với các loại rượu của Fudge, tại sao enklactate trong từ điển của Jelly?
hoàn toàn là

3
@icrieverytim Không phải, enklà một chuỗi và lactatelà một từ. EDIT: vừa được xác nhận, enklactatekhông có trong từ điển.
Erik the Outgolfer

1
@icrieverytim Tôi nghĩ nó chỉ là sữa .
Ông Xcoder

2
Aw maaan, tôi muốn tìm cách nhạo báng từ điển của Jelly ... Có lẽ lần sau. : P
hoàn toàn là

3

Japt , 12 byte

0-index, lấy đầu vào bằng chữ thường.

`kÇXsm`bUg#

Kiểm tra nó


Giải trình

Đầu vào ngầm định của chuỗi chữ thường U

`kÇXsm`

Chuỗi nén kotinsm.

bUg#

Lấy chỉ mục đầu tiên ( b) của ký tự tại index ( g) 26 ( #) trong U. (Yay, gói chỉ mục!)

Ngõ ra kết quả số nguyên.


Thay thế

Tương tự như trên (và mọi người khác!), Chỉ sử dụng các ký tự ở chỉ số 3 thay vào đó, cho phép nhập trường hợp tiêu đề.

`klact`bUg3

Kiểm tra nó


Đâu rồi những enđi? : P
hoàn toàn là

1
@icrieverytim: đó là một chuỗi nén; enđược nén đến mức không thể in được.
Xù xì

7
Tôi nghĩ rằng tôi thấy một bUgtrong mã của bạn.
shenles


3

JavaScript (ES6), 25 byte

Chỉ số 0.

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

Kiểm tra nó

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
Đây là 25 byte !
geokavel

Cảm ơn, @geokavel. Không biết tôi lấy thêm 3 byte từ đâu; thậm chí đếm f=sẽ chỉ làm cho nó 27.
Shaggy

giải pháp đơn giản và hiệu quả. +1 :)
Brian H.

@Shaggy Có thể byte thứ ba thêm của bạn là một dòng mới.
Michael Boger

3

GolfScript , 12 byte

{+}*93&(5?7%

Hãy thử trực tuyến!

Ánh xạ các đầu vào (thông qua tổng số điểm mã của chúng) 0đến 6.

Giải trình

Tìm thấy với một công cụ vũ phu đoạn mã GolfScript tôi đã viết cách đây một lúc ...

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

Đây là cách điều này biến đổi từng đầu vào thành kết quả mong muốn:

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

Sử dụng enklactphương pháp:

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

Bạn có thể giảm 2 byte bằng cách chuyển đổi này sang Google Sheets và thả")
Taylor Scott

2

Perl 6 , 22 byte

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

Hãy thử trực tuyến!


perl 2017,07 chấp nhận tr/enklact/^6/.comb[3]sẽ là 22 byte, nhưng dường như tio.run vẫn chưa có.
Massa

(tio.run chạy perl6 v2017.6)
Massa

1
Miễn là một trình thông dịch tồn tại có thể chạy phiên bản 22 byte, thì nó hợp lệ.
Xù xì


2

Husk , 10 byte

%7^5←n93ṁc

Hãy thử trực tuyến!

Một cổng khác của câu trả lời GolfScript của tôi . Tôi chắc chắn cuối cùng tôi sẽ tìm thấy một ngôn ngữ có thể tính tổng các điểm mã cho một byte ...

Husk (cập nhật sau thử thách), 9 byte

%7^5←n93Σ

Hãy thử trực tuyến!

Bây giờ, Σ không tổng điểm trực tiếp. Vì điều này đã được thêm vào mỗi yêu cầu sau khi tôi trả lời thử thách này, nên tôi sẽ không sử dụng nó làm điểm chính của mình.





1

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

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

Hãy thử trực tuyến!

Yêu cầu ba ký tự đầu tiên là chữ hoa.


Nó phải là tất cả chữ hoa, tất cả chữ thường hoặc thường.
geokavel

Gọi tất cả là chữ hoa, sau đó. Bất cứ điều gì ngoài ba nhân vật đầu tiên được bỏ qua.
Xcali

1

Java 8, 26 byte

Tín dụng cho @icrieverytim

Đưa đầu vào dưới dạng char []

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

Bạn có thể làm s->"enklact".indexOf(s[3])nếu bạn xác định rằng bạn lấy đầu vào là một mảng char.
shooqie

Được không Tôi có một vài câu trả lời có thể rút ngắn như thế
Roberto Graham

1

Haskell , 36 byte

-9 byte nhờ H.PWiz.

f s=length$fst$span(/=s!!3)"enklact"

Hãy thử trực tuyến!

Giải pháp thay thế, 45 byte

Điều này sử dụng các indexOfchức năng Data.Listnhư là elemIndex.

import Data.List
(`elemIndex`"enklact").(!!3)

Hãy thử trực tuyến!



@ H.PWiz ơi, lạm dụng gọn gàng break. Cảm ơn!
hoàn toàn là


@ H.PWiz Haha, làm thế nào tôi nhớ điều đó. XD
hoàn toàn là

1

C ++, 119 118 77 76 73 byte

-41 byte nhờ Peter Cordes
-1 byte nhờ Zacharý
-3 byte nhờ Michael Boger

Ở chỉ số chuỗi 3, ký tự cho mỗi bánh sandwich là khác nhau

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

Chơi golf với std::string, đó là điều hiển nhiên ... tôi đang nghĩ gì ...


1
std::findtrong một chuỗi ký tự (hoặc có thể a std::string) có vẻ như là cách rõ ràng để đi. Về cơ bản, ý tưởng tương tự như indexhoặc strchrcác câu trả lời C đang sử dụng, trong cấu trúc dữ liệu trong đó 0-5 được ẩn từ vị trí.
Peter Cordes

Bạn có thể xóa dòng mới giữa dòng 2 và 3.
Zacharý

Bạn không cần một biến để lưu trữ enklact. std::string("enklact").find(p[3])hoạt động tốt Điều này mang lại cho nó xuống 3 ký tự.
Michael Boger

Bạn CÓ THỂ chuyển chuỗi ký tự chuỗi cho hàm của mình (g ++ chỉ đưa ra cảnh báo) vì vậy công cụ memcpy không cần thiết.
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()));}}

Chạy trên đường


0

Golf, 13 byte

Hãy thử trực tuyến!

'enklact'\3=?

Lấy ký tự thứ 4 (mà, đối với mỗi ký tự sẽ là duy nhất) và tìm kiếm nó trong chuỗi " enklact".

Cách khác:

'nklact'\3=?)

Điều này lợi dụng thực tế là ?chức năng của Golfscript trả về -1 nếu không tìm thấy phần tử được tìm kiếm (mà vào thứ Hai, nó sẽ không). Nếu điều này được cho phép, giải pháp có thể giảm đi 1 byte.



0

K (oK) , 13 byte

Dung dịch:

"enklact"?*3_

Hãy thử trực tuyến!

Ví dụ:

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

Giải trình:

Giải thích từ phải sang trái, kéo phần tử thứ 4 từ đầu vào và trả về vị trí chỉ số 0 trong danh sách "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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.