샌드위치는 언제받을 수 있나요?


37

여기에 이미지 설명을 입력하십시오

다음 입력 중 하나가 제공됩니다.

달콤한 양파 치킨 데리야끼
오븐 구이 치킨
칠면조 가슴살
이탈리아 BMT
참치
검은 숲 햄
미트볼 마리 나라
월요일부터 가장 낮은 숫자로 시작하여 해당 거래의 요일을 나타내는 1-7 (또는 0-6)의 숫자를 출력합니다. 원하는 경우 입력은 모두 소문자 또는 대문자 일 수 있습니다 (예 : "italian bmt"). 인터넷이 허용되지 않습니다.


8
이 Kolmogorov의 복잡성을 실제로 알지 마십시오. 텍스트는 입력입니다 ... 숫자는 출력입니다.
geokavel

5
또한 일요일에 "Meatball Marinara"또는 "Meatball Marina Ra"가 표시됩니까?
Outgolfer Erik

17
나는 확신해야하는데있어 마리keming 이미지의은 ... 꽤 끔찍
totallyhuman

6
누구에게나 유용한 경우 :의 수 에 각 입력의 a수를 더한 수는 e각각 [5,4,3,2,1,3,6]입니다.
geokavel

답변:


85

파이썬 2 , 38 30 28 바이트

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

온라인으로 사용해보십시오!

불행히도 지금까지 최고의 Python 2 답변보다 1 바이트 더 깁니다. enklact-approach를 사용하지는 않습니다 .

이제 나는 모든 사람의 대답을 외치는 것보다 1 바이트 짧 습니다 !

어떻게 작동합니까?

많은 무차별 대입 후, 나는 올바른 숫자를 가진 숫자를 나타내는 표현을 찾았습니다.
주어진 문자열 길이의 특정 숫자 하나만 보는 데 3 바이트 ( %10)가 필요하다는 것을 알았습니다 . 그래서 입력 문자열의 길이를 요일에 직접 매핑하는 숫자를 추가로 검색하기 위해 다른 Python 프로그램 ( Pastebin link )을 작성했습니다.

마법의 숫자는 다음과 같습니다. 6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801(소수점 629 자리의 숫자)

보시다시피이 숫자는 [28, 20, 13, 11, 4, 16, 17]에서 [0, 1, 2, 3, 4, 5, 6] (Python 문자열은 0- 색인화 됨) :

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

내 프로그램은 또한 그들이 더 (29 대신 28의) 표현하는 바이트 걸릴하지만, 필요한 속성 수를 산출 다른 표현을 발견 19439**540, 34052**726, 39311**604, 44873**182, 67930**16478579**469. (링크 된 프로그램에서 찾은 모든 표현이며 실행에는 몇 시간이 걸렸습니다.)

28 바이트 lambda S:`7954<<850`[len(S)]
가 필요한 lambda S:`9699<<2291`[len(S)]
대체 기능 : 29 바이트 가 필요한 lambda S:`853<<4390`[len(S)+9]
대체 기능 : 30 바이트 가 필요한 대체 기능 : 31 바이트가 필요한 대체 기능 :lambda S:`1052<<3330`[len(S)+8]

어떻게 작동합니까? 그 번호는 어떻게 생성 했습니까? (30 바이트 답변)

30 바이트 대답은 lambda S:`3879**41`[len(S)%10]입니다.

입력 문자열의 길이를 보면 [28, 20, 13, 11, 4, 16, 17]기본 10의 모든 마지막 숫자가 다르므로 목록이 나타납니다 [8, 0, 3, 1, 4, 6, 7]. 따라서 그 목록에서 일주일 내내 모든 목록으로의 매핑 만 필요했습니다 [0, 1, 2, 3, 4, 5, 6].

첫 번째 접근 방식은 단순히 문자열을 사용하여 매핑을 수행 lambda S:"13*24*560"[len(S)%10]했지만 문자열에는 11 바이트 ( "13*24*560")가 필요했습니다 .
그래서 파이썬 프로그램 ( Pastebin link )을 작성하여 산술 표현식을 테스트하여 숫자가 일치하는 정수를 생성하여 프로그램을 더 골프화하기를 바랐습니다. 내가 지금까지 생각해 낸 것은 `3879**41`(10 바이트 만, 내 프로그램이 찾는 유일하고 작은 표현)입니다.

물론 시도 할 수있는 표현에는 여러 가지가 있습니다. 방금 a**b내 요구에 맞는 합리적으로 작은 결과가 있는 양식이 있다는 것이 운이 좋았습니다 .

궁금한 사람 만 있으면 3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147됩니다.

불행히도 32 바이트가 필요한 대체 표현식을 검색하는 동안 찾은 또 다른 유효한 함수 : lambda S:`7**416`[len(S)%10+290]


1
그 번호는 어떻게 생성 했습니까? : o
완전히 인간적인

10
@icrieverytim 무차별 대입.
Jonathan Frech

-9114**28더 작은 정수 *도 작동합니다 (* 음수이기 때문에 절대 용어가 아니라 629가 아닌 111 자리). 그래도 바이트를 절약하지 않습니다.
Jonathan Allan

4
가끔씩 HNQ에서 PCG 질문을 확인하고 골프 언어가 3 위를 차지한다는 사실에 실망합니다. 오늘 나는 실망하지 않았다. 감사합니다!
시드니

4
@icrieverytim ಠ_ಠ 같은 숫자이지만 쉬프트 팩터가 하나 더 반으로 줄어 듭니다 ಠ_ಠ : P
HyperNeutrino

49

파이썬 2 , 29 바이트

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

온라인으로 사용해보십시오!

설명

마법의 문자열 enklact은 고유 문자가있는 첫 번째 열을 찾아서 발견되었습니다.

첫 번째 열은 SOTITBM중복이 포함되어 있기 때문에 유용하지 않습니다. 그들이 있기 때문에 두 번째와 세 번째 사람은 일을 안 wvutule하고 eeranaa각각. 그러나 네 번째 열은 모든 고유 문자가 있으므로 작동합니다.

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

파이썬 , 26 바이트

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

온라인으로 사용해보십시오!

Jonathan Frech 의 답변에 대한 감사의 빚으로 (두 번째 직선 코드 골프 시도) -구별되는 문자 대신 문자열 길이를 사용 하려고 생각하지 않았습니다!

이 코드는 De Bruijn Sequences 와 체스 프로그래밍 경험에서 비롯된 것입니다 .

체스에서는 여러 개의 64 비트 정수로 작업하는 경우가 많습니다. 여기서 각 비트는 체스 판의 해당 사각형에 대해 "여기에 흰색 조각이 있습니다"또는 "이 사각형에 폰이 있습니다"와 같은 것이 사실인지 거짓인지 나타냅니다.

신속하게 변환 할 수하는 것이 유용 2**nn신속하고 저렴. C 및 C ++에서이를 수행하는 가장 빠른 방법은 64 비트 De Bruijn 시퀀스 ( n비트 단위 시프트와 동일)를 곱한 다음 오른쪽 시프트 58 (처음 6 비트를 마지막으로 배치)입니다. 부호없는 int를 다시 사용하거나 시간의 절반을 얻습니다)와 n같은 범위에 있지만 거의 같은 숫자 를 제공하는 표 에서이 0..63 숫자를 찾으십시오 .

이것은 관련이 있습니다. 대신에서 변화의 2**nn, 그러나, 우리는에서 변경하려는 n다른 3 비트 번호. 따라서 우리는 3 비트 숫자를 마술 31 비트 숫자로 숨 깁니다 (28 비트 이동에는 28-30 비트가 필요하며 번호는 0부터 시작합니다).

나는 어떤 값이 어디에 있어야하는지 (출력 세트로 0..6과 1..7을 시도하여) 필요한 수를 생성했습니다. 다행히도 겹치는 값 (14, 16 및 17)이 해결되었습니다! 그리고 첫 번째 3 비트가 000이고 다음이 3이므로 001, 가장 왼쪽에있는 7 비트가 필요하지 않기 때문에 더 적은 자릿수-> 더 적은 바이트의 소스가됩니다.

필요한 숫자는입니다 000xxxx001110101011xxxx100xxxx. 여기서 x는 1 또는 0 일 수 있으며 이러한 특정 하위 항목의 결과에는 영향을 미치지 않습니다. 숫자를 최소화하기 위해 0으로 설정했지만 마지막 8 개의 x를 변경해도 영향을 미치지 않습니다. 소스 코드의 길이 모든 x를 0으로 설정하고 시작을 떠나면 1923136은 10 진수 (또는 1D5840은 16 진수이지만 0x 접두사가 필요합니다-부끄러움이 필요합니다!) 끝의 & 7은 마지막 3 비트를 마스킹합니다. % 8을 사용하지만 파이썬의 연산자 우선 순위 규칙으로 인해 괄호가 필요합니다.

tl; dr : 1923136은이 샌드위치 이름이 제자리에 놓이는 정확한 지점에 0에서 6까지의 각 3 비트 조합을 인코딩 한 다음, 오른쪽 이동 후 마지막 3 비트를 가져가는 문제입니다.


내 비트 마스크 접근 방식과 매우 유사하지만 더 좋습니다.
Bruno Costa

12

젤리 , 10 바이트

이 "enklact"사업은 무엇입니까?

⁽ṃXị“Ð$¥»i

문자 목록을 가져와 월요일 = 1 요일을 반환하는 모나드 링크입니다.

온라인으로 사용해보십시오! 또는 시험 스위트를 참조하십시오

어떻게?

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

-7761/retinal콤보를 어떻게 찾았 습니까?
Emigna

3
"단어"를 작성하고 사전에 존재하는지 확인하는 루프를 작성했습니다. "retinal"은 -32249와 32250 사이의 유일한 것입니다 ⁽...
Jonathan Allan

... 약간의 실수 -의 범위는 ⁽..실제로 [-31349,32250] - [- 99999] (하나 세 이하와 같은 바이트로 나타낼 수있는 다른 수도있다 7!!ȷ76)
조나단 앨런

9

C (gcc) , 72 71 56 46 41 39 바이트

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

온라인으로 사용해보십시오!


i;char x[]="enklact";보다 짧습니다 i,x[]={101,110,107,108,97,99,116};.
Jonathan Frech

게시 char*x="enklact"예정 : 더 짧습니다 : 온라인으로 사용해보십시오!
scottinet

또한를 제거 할 수 있습니다 i=0.
Jonathan Frech

더 짧은 버전 사용 index: 온라인으로 사용해보십시오!
scottinet

@scottinet 니스! 전에는 index ()를 사용한 적이 없습니다. 감사합니다
cleblanc



5

다른 대안을 게시하겠다고 생각했습니다.

자바 스크립트 38 바이트

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

설명 : 비트 마스크 록?

자바 스크립트 27 바이트

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

두 번째 대안은 29 바이트 길이입니다a=
Bruno Costa

a=부품이 필요한가요? 봐 얽히고 설킨의 대답 .
geokavel

1
@BrunoCosta이 사이트에서는 함수 이름을 지정할 필요가 없습니다. 익명의 사람들이 작동하므로을 (를) 필요로하지 않습니다 a=.
Rɪᴋᴇʀ

1
@BrunoCosta는 멋지다, 그것은 당신에게 달려 있습니다. 헤더 바이트 수로 계산할 수 없으며 쉽게 테스트 할 수 있도록 스 니펫에 포함시킬 수 있습니다.
Rɪᴋᴇʀ

1
@MichaelBoger Unfofrtantly 나는 그 일을 만들기 위해 최소한의 코드가 필요하다고 생각하지 않습니다.a=s=>{b=s.Length;return(271474896&7<<b)>>b}
Bruno Costa

4

젤리 , 11 바이트

4ị“-ƭɼoṚ0»i

온라인으로 사용해보십시오!

설명:

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

2
@ Mr.Xcoder 문자열 enklactate대신에 사용하지 않으면 enklact11로
줄어 듭니다

5
오, 퍼지 때문에 왜 젤리의 사전에 enklactate 가 있습니까?
완전히 인간적인

3
@icrieverytim enk문자열이 아니며 lactate단어입니다. 편집 : 방금 확인 enklactate했으며 사전에 없습니다.
Erik the Outgolfer

1
@icrieverytim 그냥 젖산 인 것 같아요 .
Mr. Xcoder

2
Aw maaan, Jelly의 사전을 조롱하는 방법을 찾고 싶었습니다. 다음 번에. : P
완전히 인간적인

3

Japt , 12 바이트

인덱스가 0이며 소문자로 입력됩니다.

`kÇXsm`bUg#

그것을 테스트


설명

소문자 문자열의 암시 적 입력 U

`kÇXsm`

압축 된 문자열 kotinsm입니다.

bUg#

bindex ( g) 26 ( #)에 있는 문자 의 첫 번째 인덱스 ( )를 가져옵니다 U. (예, 인덱스 래핑!)

정수 결과의 암시 적 출력.


대안

위의 (및 다른 모든 사람들과 동일) 색인 3의 문자를 대신 사용하여 제목 대소 문자를 입력하십시오.

`klact`bUg3

그것을 테스트


어디 갔어 en? : P
완전히 인간적인

1
@icrieverytim : 압축 된 문자열입니다. en인쇄 할 수없는 것으로 압축됩니다.
얽히고 설킨

7
나는 bUg당신의 코드 에서을 본 것 같아요 .
shenles

3

05AB1E , 11 바이트

Outgolfer Erik에게 1 바이트를, Magic Octopus Urn 덕분에 1 바이트를 절약했습니다.

.•ΛΓ2º•I3èk

온라인으로 사용해보십시오!


"enklact"->’enkl†¼’
Outgolfer Erik

’enkl†¼’->.•ΛΓ2º•
Magic Octopus Urn

@MagicOctopusUrn 오 감사합니다
씨 Xcoder


@MagicOctopusUrn 보관소에 보관하겠습니다, 감사합니다 : P
Mr. Xcoder

3

자바 스크립트 (ES6), 25 바이트

인덱스가 0입니다.

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

그것을 테스트

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>



감사합니다, @geokavel. 여분의 3 바이트를 어디서 얻었는지 모르겠다. 세어도 f=27 일 뿐이다.
얽히고 설킨

간단하고 효과적인 솔루션. +1 :)
Brian H.

@Shaggy 어쩌면 세 번째 여분의 바이트는 후행 줄 바꿈 일 것입니다.
Michael Boger

3

GolfScript , 12 바이트

{+}*93&(5?7%

온라인으로 사용해보십시오!

입력을 코드 포인트의 합계를 통해로 매핑 0합니다 6.

설명

내가 얼마 전에 쓴 GolfScript 스 니펫 무차별 대입 도구로 발견되었습니다 ...

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

다음은 각 입력을 원하는 결과로 변환하는 방법입니다.

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

엑셀, 28 바이트

enklact방법을 사용하여 :

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

이 코드를 Google 스프레드 시트로 변환하고")
Taylor Scott



2

껍질 , 10 바이트

%7^5←n93ṁc

온라인으로 사용해보십시오!

내 GolfScript 답변 의 또 다른 포트입니다 . 결국에는 단일 바이트의 코드 포인트를 합할 수있는 언어를 찾을 것이라고 확신합니다 ...

껍질 (도전 후 업데이트), 9 바이트

%7^5←n93Σ

온라인으로 사용해보십시오!

이제 Σ 않습니다 직접 합 코드 포인트를. 이 질문에 답한 후에 요청마다 추가되었으므로 기본 점수로 사용하지는 않겠습니다.





1

Perl 5 , 43 + 1 ( -p) = 44 바이트

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

온라인으로 사용해보십시오!

입력의 처음 세 문자는 대문자 여야합니다.


모두 대문자, 모두 소문자 또는 일반이어야합니다.
geokavel

모두 대문자로 부르십시오. 처음 3자를 초과하는 것은 무시됩니다.
Xcali

1

자바 8, 26 바이트

@icrieverytim에 신용

문자를 입력으로 받는다 []

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

s->"enklact".indexOf(s[3])입력을 char 배열로 받도록 지정하면 수행 할 수 있습니다 .
shooqie

괜찮아? 이렇게 단축 될 수있는 몇 가지 답변이 있습니다
Roberto Graham

1

하스켈 , 36 바이트

H.PWiz 덕분에 -9 바이트

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

온라인으로 사용해보십시오!

대체 솔루션, 45 바이트

indexOf함수를 Data.List로 사용합니다 elemIndex.

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

온라인으로 사용해보십시오!



@ H.PWiz 아, 깔끔한 남용 break. 감사!
완전히 인간적인


@ H.PWiz Haha, 어떻게 그리워? XD
완전히 인간적인

1

C ++, 119 (118) 77 76 73 바이트

Peter Cordes 덕분에 -41 바이트,
Zacharý 덕분에 -1 바이트
Michael Boger 덕분에 -3 바이트

문자열 인덱스 3에서 모든 샌드위치의 문자가 다릅니다

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

로 골프를 std::string쳤다는 것은 명백했습니다.


1
std::find문자열 리터럴 (또는 아마도 std::string)은 명백한 방법처럼 보입니다. 기본적으로 동일한 개념 index또는 strchr0-5의 위치에서 암시되는 위치 C 답변 그 데이터 구조에 사용된다.
Peter Cordes

2 행과 3 행 사이의 줄 바꿈을 제거 할 수 있습니다.
Zacharý

enklact를 저장하기 위해 변수가 필요하지 않습니다. std::string("enklact").find(p[3])잘 작동합니다. 이것은 3자를 내립니다.
Michael Boger

문자열 리터럴을 함수에 전달할 수 있으므로 (g ++은 경고 만 발생) memcpy는 필요하지 않습니다.
Michael Boger

0

C # (. NET 코어) , 289 바이트

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

온라인으로 실행


0

골프 스크립트, 13 바이트

온라인으로 사용해보십시오!

'enklact'\3=?

네 번째 문자 (각각 고유 한 문자)를 가져 와서 문자열 " enklact" 에서 찾습니다 .

또는

'nklact'\3=?)

이것은 ?검색 한 요소를 찾을 수없는 경우 (월요일에는 표시되지 않음) Golfscript의 함수가 -1을 반환 한다는 사실을 이용 합니다. 이것이 허용되면 솔루션을 1 바이트 줄일 수 있습니다.



0

K (oK) , 13 바이트

해결책:

"enklact"?*3_

온라인으로 사용해보십시오!

예 :

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

설명:

오른쪽에서 왼쪽으로 해석되면 입력에서 4 번째 요소를 꺼내 "enklact"목록에서 0 인덱스 위치를 반환하십시오.

"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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.