다음 입력 중 하나가 제공됩니다.
달콤한 양파 치킨 데리야끼 오븐 구이 치킨 칠면조 가슴살 이탈리아 BMT 참치 검은 숲 햄 미트볼 마리 나라월요일부터 가장 낮은 숫자로 시작하여 해당 거래의 요일을 나타내는 1-7 (또는 0-6)의 숫자를 출력합니다. 원하는 경우 입력은 모두 소문자 또는 대문자 일 수 있습니다 (예 : "italian bmt"). 인터넷이 허용되지 않습니다.
a
수를 더한 수는 e
각각 [5,4,3,2,1,3,6]입니다.
다음 입력 중 하나가 제공됩니다.
달콤한 양파 치킨 데리야끼 오븐 구이 치킨 칠면조 가슴살 이탈리아 BMT 참치 검은 숲 햄 미트볼 마리 나라월요일부터 가장 낮은 숫자로 시작하여 해당 거래의 요일을 나타내는 1-7 (또는 0-6)의 숫자를 출력합니다. 원하는 경우 입력은 모두 소문자 또는 대문자 일 수 있습니다 (예 : "italian bmt"). 인터넷이 허용되지 않습니다.
a
수를 더한 수는 e
각각 [5,4,3,2,1,3,6]입니다.
답변:
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**164
와 78579**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 바이트 대답은 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]
-9114**28
더 작은 정수 *도 작동합니다 (* 음수이기 때문에 절대 용어가 아니라 629가 아닌 111 자리). 그래도 바이트를 절약하지 않습니다.
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
lambda S:1923136>>len(S)&7
Jonathan Frech 의 답변에 대한 감사의 빚으로 (두 번째 직선 코드 골프 시도) -구별되는 문자 대신 문자열 길이를 사용 하려고 생각하지 않았습니다!
이 코드는 De Bruijn Sequences 와 체스 프로그래밍 경험에서 비롯된 것입니다 .
체스에서는 여러 개의 64 비트 정수로 작업하는 경우가 많습니다. 여기서 각 비트는 체스 판의 해당 사각형에 대해 "여기에 흰색 조각이 있습니다"또는 "이 사각형에 폰이 있습니다"와 같은 것이 사실인지 거짓인지 나타냅니다.
신속하게 변환 할 수하는 것이 유용 2**n
에 n
신속하고 저렴. C 및 C ++에서이를 수행하는 가장 빠른 방법은 64 비트 De Bruijn 시퀀스 ( n
비트 단위 시프트와 동일)를 곱한 다음 오른쪽 시프트 58 (처음 6 비트를 마지막으로 배치)입니다. 부호없는 int를 다시 사용하거나 시간의 절반을 얻습니다)와 n
같은 범위에 있지만 거의 같은 숫자 를 제공하는 표 에서이 0..63 숫자를 찾으십시오 .
이것은 관련이 있습니다. 대신에서 변화의 2**n
에 n
, 그러나, 우리는에서 변경하려는 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 비트를 가져가는 문제입니다.
이 "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
콤보를 어떻게 찾았 습니까?
⁽..
.
⁽..
실제로 [-31349,32250] - [- 99999] (하나 세 이하와 같은 바이트로 나타낼 수있는 다른 수도있다 7!!
나 ȷ76
)
i;char x[]="enklact";
보다 짧습니다 i,x[]={101,110,107,108,97,99,116};
.
char*x="enklact"
예정 : 더 짧습니다 : 온라인으로 사용해보십시오!
i=0
.
index
: 온라인으로 사용해보십시오!
O5OHlO7KI6vjYm)
온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .
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
다른 대안을 게시하겠다고 생각했습니다.
a=s=>(271474896&7<<s.Length)>>s.Length
설명 : 비트 마스크 록?
s=>"240350671"[s.length%10]
a=
a=
부품이 필요한가요? 봐 얽히고 설킨의 대답 .
a=
.
a=s=>{b=s.Length;return(271474896&7<<b)>>b}
enklactate
대신에 사용하지 않으면 enklact
11로
enk
문자열이 아니며 lactate
단어입니다. 편집 : 방금 확인 enklactate
했으며 사전에 없습니다.
인덱스가 0이며 소문자로 입력됩니다.
`kÇXsm`bUg#
소문자 문자열의 암시 적 입력 U
`kÇXsm`
압축 된 문자열 kotinsm
입니다.
bUg#
의 b
index ( g
) 26 ( #
)에 있는 문자 의 첫 번째 인덱스 ( )를 가져옵니다 U
. (예, 인덱스 래핑!)
정수 결과의 암시 적 출력.
위의 (및 다른 모든 사람들과 동일) 색인 3의 문자를 대신 사용하여 제목 대소 문자를 입력하십시오.
`klact`bUg3
en
? : P
en
인쇄 할 수없는 것으로 압축됩니다.
bUg
당신의 코드 에서을 본 것 같아요 .
"enklact"
->’enkl†¼’
’enkl†¼’
->.•ΛΓ2º•
인덱스가 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>
f=
27 일 뿐이다.
{+}*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
enklact
방법을 사용하여 :
=FIND(MID(A1,4,1),"enklact")
")
l1b93&(5#7%
내 GolfScript 답변 포트입니다 . 입력을 명시 적으로 읽는 데 1 바이트가 소요되지만 코드 포인트를 합산 할 때 2를 절약합니다.
%7^5←n93ṁc
내 GolfScript 답변 의 또 다른 포트입니다 . 결국에는 단일 바이트의 코드 포인트를 합할 수있는 언어를 찾을 것이라고 확신합니다 ...
%7^5←n93Σ
이제 Σ
않습니다 직접 합 코드 포인트를. 이 질문에 답한 후에 요청마다 추가되었으므로 기본 점수로 사용하지는 않겠습니다.
x"enklact"@w3
대안 :
x."atÖÅû"@w3
3
다음 값 중 하나로 대체 될 수 있습니다. [3, 4, 11, 13, 21, 24, 25, 26]
@icrieverytim에 신용
문자를 입력으로 받는다 []
s->"enklact".indexOf(s[3])
s->"enklact".indexOf(s[3])
입력을 char 배열로 받도록 지정하면 수행 할 수 있습니다 .
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
쳤다는 것은 명백했습니다.
std::find
문자열 리터럴 (또는 아마도 std::string
)은 명백한 방법처럼 보입니다. 기본적으로 동일한 개념 index
또는 strchr
0-5의 위치에서 암시되는 위치 C 답변 그 데이터 구조에 사용된다.
std::string("enklact").find(p[3])
잘 작동합니다. 이것은 3자를 내립니다.
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()));}}
'enklact'\3=?
네 번째 문자 (각각 고유 한 문자)를 가져 와서 문자열 " enklact
" 에서 찾습니다 .
또는
'nklact'\3=?)
이것은 ?
검색 한 요소를 찾을 수없는 경우 (월요일에는 표시되지 않음) Golfscript의 함수가 -1을 반환 한다는 사실을 이용 합니다. 이것이 허용되면 솔루션을 1 바이트 줄일 수 있습니다.
해결책:
"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