골프 골프 차트
미터 단위로 정수로 주어진 거리 \$60\le d \le 260\$여기서 다음 두 임의의 차트에 따라 사용될 수있는 클럽의 수를 반환 \$min\$및 \$max\$ 포함 :
club | min | max
----------------+-----+-----
Driver | 200 | 260
3-wood | 180 | 235
5-wood | 170 | 210
3-iron | 160 | 200
4-iron | 150 | 185
5-iron | 140 | 170
6-iron | 130 | 160
7-iron | 120 | 150
8-iron | 110 | 140
9-iron | 95 | 130
Pitching Wedge | 80 | 115
Sand Wedge | 60 | 90
메모
클럽 이름은 정보 용으로 만 제공됩니다.
물론 클럽의 선택은 몇 가지 다른 매개 변수에 따라 달라집니다. 예를 들어 Sand Wedge 는 모래 벙커에서 탈출하도록 설계되었습니다. 그러나이 도전의 목적을 위해서는 거리 만이 중요합니다.
이것은 의심 할 여지없이 코드 골프 도전입니다.
예
대한 \$d=130\$, 6 번 아이언 , 7 번 아이언 , 8 번 아이언 또는 9 번 아이언을 선택할 수 있으므로 예상되는 대답은 \$4\$.
테스트 케이스
Input Output
60 1
79 1
80 2
93 1
105 2
110 3
116 2
129 3
130 4
200 4
201 3
235 2
260 1
또는 목록으로 :
Input : 60, 79, 80, 93, 105, 110, 116, 129, 130, 200, 201, 235, 260
Output: 1, 1, 2, 1, 2, 3, 2, 3, 4, 4, 3, 2, 1
답변
x86-16 기계 코드, 47 42 바이트
00000000: be14 01b3 01b1 0bad 3ad0 7205 3ad4 7701 ........:.r.:.w.
00000010: 43e2 f4c3 505a 5feb 6e73 78d2 8282 8c8c C...PZ_.nsx.....
00000020: 9696 a0a0 aaaa b4b9 c8c8 ..........
목록 :
BE 0114 MOV SI, OFFSET CHART ; SI point to distance chart
B3 01 MOV BL, 1 ; start counter at 1
B1 0B MOV CL, 11 ; loop 11 clubs
SCORE_LOOP:
AD LODSW ; load AL = min, AH = max
3A D0 CMP DL, AL ; is d less than min?
72 05 JB DONE ; if so, continue
3A D4 CMP DL, AH ; is d greater than max?
77 01 JA DONE ; if so, continue
43 INC BX ; otherwise increment counter
DONE:
E2 F4 LOOP SCORE_LOOP ; loop through end of chart
C3 RET ; return to caller
CHART DB 80,90,95,235,110,115,120,210,130,130,140,140
DB 150,150,160,160,170,170,180,185,200,200
호출 함수 입력 d
에서 DX
출력에서 BL
.
압축하지 않음 (데이터는 24 어쨌든 바이너리로 22 바이트) 테이블 비교.
편집 : @SE에 대한 거대한 소품 - 목록을 다시 정렬하고 d
값 을 오프셋 할 필요가 없어 5 바이트를 절약 하기 위해 좋은 사람 을 발사하지 마십시오 !
테스트 프로그램 실행 :
대체 버전, 50 바이트
BB 0501 MOV BX, 0501H ; init counter to 1 in BL and
BF 556D MOV DI, 0556DH ; magic number to 0x5556D in BH:DI
BE 011C MOV SI, OFFSET CHART ; SI point to transition table
B1 16 MOV CL, 22 ; loop 22 transitions
SCORE_LOOP:
AC LODSB ; load AL = next transition
3A C2 CMP AL, DL ; is d less than?
77 0B JA EXIT ; if not, end
D0 EF SHR BH, 1 ; cascade bit shift high word into CF
D1 DF RCR DI, 1 ; bit shift lsb into CF
43 INC BX ; increment counter
72 02 JC NEXT ; if CF was a 1, continue to next
4B DEC BX ; otherwise subtract 2
4B DEC BX
NEXT:
E2 F0 LOOP SCORE_LOOP ; keep looping
EXIT:
C3 RET
CHART DB 80,91,95,110,116,120,130,131,140,141,150,151,160,161,170,171,180,186,200,201,211,236
이것은 Jonathan Allan의 답변에서 크게 영감을 받았습니다 . 이 값의 표를 사용하는 d
곳 클럽 천이 하나의 숫자 +1
나 -1
하고 대응 이진 마법 번호 의 0x5556d
A는 여기서 1
양의 변화를 나타내고, 0
음의 변화를 나타낸다.
안타깝게도 원래 테이블 인코딩은 24 바이트 와 22 개의 전환에 3 바이트 매직 넘버를 더한 것이므로 실제로는 더 큽니다. 그래도 시도하는 것은 재미있었습니다!
Python 3 , 71 바이트
lambda n:sum(a<=n/5<=b for a,b in zip(b'($" ',b'4/*(%" '))
온라인으로 시도하십시오!
바이트 문자열에는 인쇄 할 수없는 일부가 포함되어 있으며 이스케이프 된 형식은 b'($" \x1e\x1c\x1a\x18\x16\x13\x10\x0c'
및 b'4/*(%" \x1e\x1c\x1a\x17\x12'
입니다.
Python 3 , 71 바이트
lambda n:sum(b>n-a*5>-1for a,b in zip(b'($" ',b'=8))$$$'))
온라인으로 시도하십시오!
Python 3.8 , 90 86 바이트
lambda x:-~sum([79<x<91,94<x<236,-1<(a:=x-110)<6,9<a<101,69<a<76,a/10in{2,3,4,5,6,9}])
온라인으로 시도하십시오!
마지막 조건은 a%10<1<a/10<7,a==90
동일한 길이 로 작성할 수도 있습니다 .
젤리 , 25 바이트
“Ḳœẹ“rɓ?’ḃ5×5“ZO‘;"Ä⁸>§I‘
결과를 인쇄하는 전체 프로그램 (또는 단일 요소 목록을 반환하는 모나 딕 링크).
온라인으로 시도하십시오! 또는 테스트 스위트를 참조하십시오.
어떻게?
유효한 입력의 경우 \$[60,260]\$우리는 적어도 하나의 클럽을 사용할 수 있습니다. 주어진 야드에 대해 \$[61,260]\$, 우리는 1 야드 이하로 할 수 있었던 것보다 같은 클럽을 하나 더 사용하거나 하나 더 적게 사용할 수 있습니다. 아래 코드는 사용 가능한 클럽 수가 증가하는 야드와 사용 가능한 클럽 수가 감소하는 야드를 인코딩하여 결과를 계산하는 데 사용합니다.
“Ḳœẹ“rɓ?’ḃ5×5“ZO‘;"Ä⁸>§I‘ - Main Link: integer, Y e.g. 129
“Ḳœẹ“rɓ?’ - list of (two) base-250 integers = [11132965,7226564]
ḃ5 - convert to bijective base five -> [[5,3,2,2,2,2,3,3,2,5],[3,3,2,2,2,2,2,2,2,4]]
×5 - multiply by five -> [[25,15,10,10,10,10,15,15,10,25],[15,15,10,10,10,10,10,10,10,20]]
“ZO‘ - list of code-page indices = [90,79]
" - zip with:
; - concatenation -> [[90,25,15,10,10,10,10,15,15,10,25],[79,15,15,10,10,10,10,10,10,10,20]]
Ä - Cumulative values -> [[90,115,130,140,150,160,170,185,200,210,235],[79,94,109,119,129,139,149,159,169,179,199]]
⁸> - is Y greater than (those)? -> [[1,1,0,0,0,0,0,0,0,0,0],[1,1,1,1,0,0,0,0,0,0,0]]
§ - sums -> [2,4]
I - deltas -> [2]
‘ - increment -> [3]
- implicit print -> "3"
J , 63 58 55 50 바이트
1#.1=(59 90+/\@,|:5*2+4#.inv 2424834 3408207)I."1]
온라인으로 시도하십시오!
xash 덕분에 -5 바이트
목록을 기본 4의 숫자로 인코딩하고 재구성 한 다음 간격 인덱스 I.
를 사용 하여 입력이 속하는 범위 수를 계산합니다.
R , 77 76 72 바이트
편집 : Robin Ryder 덕분에 -4 바이트
sum((d=scan()/10-9)>=c(11,9:2,.5,-1,d)&d<=c(d,14.5,12,11,9.5,8:4,2.5,0))
온라인으로 시도하십시오!
순진한 솔루션이지만 R 의 자동 벡터화 및 :
시퀀스 연산자 의 이점을 얻습니다 .
파이썬 (3) , 180 (155) 153 97 88 바이트
lambda n:sum(a<=chr(n)<b for a,b in zip('<P_nx ª´È','[t¡«ºÉÓìą'))
온라인으로 시도하십시오!
K (oK) , 85 82 바이트
해결책:
{+/z=x|y&z}.(-3 -1 .5 2 3 4 5 6 7 8 9 11;0 2.5 4 5 6 7 8 9.5 11 12 14.5 17),-9+.1*
온라인으로 시도하십시오!
설명:
확실히 순진하다. 이것은 잘못된 접근 방식 일 가능성이 높습니다. 비교 논리를 단순화하기 위해 NGN에 의한 멋진 골프! .
{+/z=x|y&z}.(-3 -1 .5 2 3 4 5 6 7 8 9 11;0 2.5 4 5 6 7 8 9.5 11 12 14.5 17),-9+.1* / the solution
.1* / multiply input by 0.1
-9+ / subtract 9 from input
, / append to
(-3 -1 .5 2 3 4 5 6 7 8 9 11;0 2.5 4 5 6 7 8 9.5 11 12 14.5 17) / club stats
{ }. / call lambda with multiple args
y&z / min of input and min distance
x| / max compared to max distance
z= / is input the same?
+/ / sum up
특별한:
- -3 바이트 덕분에
ngn
Python 3 , 105 바이트
lambda n,a=[1],b=[2],c=[3],d=[4]:(a*20+b*11+a*4+b*15+c*6+b*4+c+(c*9+d)*6+d*5+c*14+d+c*10+b*25+a*25)[n-60]
온라인으로 시도하십시오!
설명 : 답변 목록을 저장하고 필요한 색인을 인쇄하는 간단한 무차별 대입.
목탄 , 44 바이트
NθIΣE¹²⁻›θ⁺⁵⁹×⁵Σ…”)⊞⊟‹G↔”ι›θ⁺⁹⁰×⁵Σ…”)⊟+.D↥”ι
온라인으로 시도하십시오! 링크는 자세한 코드 버전입니다. @JonathanAllen의 답변 포트. 설명:
Nθ
입력 d
.
IΣE¹²⁻
12 개 클럽에 대한지도를 작성하고 결과의 합계를 인쇄하여 다음과 같은 차이점을 취합니다.
›θ⁺⁵⁹×⁵Σ…”)⊞⊟‹G↔”ι
... 압축 된 문자열의 접두사의 디지털 합계 를 곱한 d
것과 비교하여 ...59
5
43322222224
›θ⁺⁹⁰×⁵Σ…”)⊟+.D↥”ι
... 압축 된 문자열의 접두사 디지털 합계 를 곱한 d
것과 비교 합니다 .90
5
53222233235
이전 48 바이트 답변 :
NθIΣEI⪪”)¶∧!✂η}⌊⍘⪫⪫⊕#<e⌊W[qY9¤…”²∧›θ⁻×⁵ι﹪κ²⊖⊗﹪κ²
온라인으로 시도하십시오! 링크는 자세한 코드 버전입니다. 설명 : 12 개 클럽의 종료 및 시작 거리는 12에서 52까지의 정수로 구성된 압축 문자열에서 5를 곱한 값으로 나뉩니다. d
모두와 비교하여 1
홀수 위치에서 더 크거나 같은 거리, 짝수 -1
에서 더 먼 거리에 대해 점수 를 매 깁니다. 위치 및 최종 합계가 인쇄됩니다.
Python 3 ,
62
60 바이트
lambda d:sum(b//25<=b%25+23-d/5<=7for b in b'BUNSWYQ+-}')+1
온라인으로 시도하십시오!
\x18
문자열 끝에 보이지 않는 (Stack Exchange에서) 문자가 있습니다.
대부분의 non-esolang에서보다 공격적인 압축비를 달성 할 수 있다고 생각합니다.
약간의 인센티브로 Python과 Node.js에 대한 내 점수가 있습니다.
짧거나 똑같이 긴 답변이 두 언어로 게시 (또는 업데이트)되는 즉시 또는 2020 년 8 월 21 일 금요일 오후 2시 (UTC)에 해당 답변이 게시되지 않을 가능성이없는 경우 아래 두 코드 스 니펫을 모두 공개 할 것입니다.
편집 (2020-08-19) : 저 와 비슷한 아이디어를 사용하여 70 바이트 미만 의 Python 답변을 처음 게시 한 @flornquake 에게 축하를 보냅니다 .
Python 3.8 (사전 출시) , 70 바이트
lambda d,n=12:sum((n:=n+x//8-4)<=d/5<=n+x%8+6for x in b' A980001225F')
온라인으로 시도하십시오!
JavaScript (Node.js) , 74 바이트
d=>Buffer(' A980001225F').map(x=>t-=d/5<(n+=x-32>>3)|d/5>n+x%8+6,n=t=12)|t
온라인으로 시도하십시오!
Perl 5 , 70 바이트
문자열의 첫 번째 바이트는 \x##
쉬운 테스트를 위해 표기법 으로 추가 되지만 리터럴 바이트입니다.
$_=grep"@F">=($k+=(ord>>4)*5)&"@F"<=$k+(15&ord)*5,"\xc6G76&&&'((+L"=~/./g
각 클럽의 세부 정보 (5로 나눈 값)를 바이트로 저장합니다. 여기서 처음 4 비트는 이전 범위의 시작과이 범위의 시작과의 차이이고, 두 번째 4 비트는이 범위의 시작과 끝.
start end => / 5 => binary #
--------------------------------------------
60 90 => 12 6 => 11000110 # counter starts at 0
80 115 => 4 7 => 00100100 # counter is 12 from before so we only need an extra 4
95 130 => 3 7 => 00110111
110 140 => 3 6 => 00110110
온라인으로 시도하십시오!
C (gcc) , 83 75 바이트
(모든 문자가 스택 교환에서 올바르게 표시되는 것은 아니지만 TIO에서는 정확함)
*i;c;f(d){c=0;for(i=L"ÈĄ´ëªÒ ȹª xn_Ps<Z";*i;c+=d/ *i++&*i++/d);d=c;}
온라인으로 시도하십시오!
Io , 89 바이트
method(a," \"$("asList select(i,v,v at(0)<=a/5and a/5<=" \"%(*/4"at(i))size)
온라인으로 시도하십시오!
Pyth , 36 바이트
s/RC-QTrV"2FUdnx ª¾""Qjy¡°¿Éâû
온라인으로 시도하십시오!
설명
"... # String literal with end of ranges minus 10 as characters
"..." # String literal with start of ranges minus 10 as characters
rV # Generate the ranges
/R # Count occurrences of
C-QT # input minus 10 converted to a characters (based on ascii value)
# in each of the ranges
s # sum
자바 스크립트 (V8) , 142 (132) 117 113 바이트
-10 바이트 : 10으로 나누는 대신 범위 및 입력에 -9 적용 (다른 답변에서 영감을 얻음, 내 범위 / 10 숫자를 관찰 한 후 왜 가치가 있는지 이해했습니다)
Arnauld의 개선 덕분에 -15 바이트
Shaggy의 추가 개선 덕분에 -5 바이트
d=>[11,17,9,14.5,8,12,7,11,6,9.5,...'58473625',.5,4,-1,2.5,-3,t=0].map((e,i,r)=>t+=++i%2&d>=e&d<=r[i],d=d/10-9)|t
온라인으로 시도하십시오!
꽤 순진한 솔루션이지만 다른 답변에서 사용되는 더 복잡한 방법을 시도하는 것이 불편했습니다 (JS에서 골프를 할 가치가 있는지 확실하지 않습니다!). 그래도 조언 / 개선을 기꺼이 받아 들일 것입니다.
미분화 및 설명 (약간 구식이지만 여전히 전체 프로세스를 설명 함) :
f = (distance) => {
// divide input by 10 and subtract 9 since the hardcoded ranges are shorter when those operations are done.
distance = distance / 10 - 9
// hardcoded ranges divided by 10 then subtracted 9 to save bytes (probably can be done better).
// Will be used in pairs, only processing even indexes and using i & i+1
//ranges = [20,26,18,23.5,17,21,16,20,15,18.5,14,17,13,16,12,15,11,14,9.5,13,8,11.5,6,9] // /10
//ranges = [14,20,12,17.5,11,15,10,14,9,12.5,8,11,7,10,6,9,5,8,3.5,7,2,5.5,0,3] // /10 -6
ranges = [11,17,9,14.5,8,12,7,11,6,9.5,5,8,4,7,3,6,2,5,0.5,4,-1,2.5,-3,0] // /10 -9 (winner! inspired by other answers)
// .map used as .reduce
ranges.map((e, i)=> { // e: current element, i: current index
totalValidClubs += ( // increment total 'valid' counter if within range
i%2 == 1 ? 0 : // skip odd indexes, will use i & i+1 on even indexes only
distance>=e && distance<=ranges[i+1] ? 1 : 0) // if even index and distance is between ranges[i] & [i+1] (inclusive), increment by 1.
}, totalValidClubs=0); // initialize valid club counter as 0
return totalValidClubs;
}
05AB1E , 38 36 바이트
38 바이트
"ÈĄ´ëªÒ È–¹Œª‚ x–nŒ_‚Ps<Z"Ç2ôε.SOÄ2‹}O
나는 압축에 좋지 않다 :( 내가 생각할 수있는 최선의 방법은 각 숫자를 ASCII 문자로 변환하는 것입니다.
설명:
"ÈĄ´ëªÒ È–¹Œª‚ x–nŒ_‚Ps<Z"Ç2ôε.SOÄ2‹}O
"ÈĄ´ëªÒ È–¹Œª‚ x–nŒ_‚Ps<Z" Ranges of clubs as ASCII chars
Ç Convert to values
2ô Split into chunks of two
ε } Map on pairs
.S -1 if lower than input, 1 if greater, 0 it equal
O Sum the result of the pair
Ä Absolute value
2‹ Is it lower than 2? (The only cases the absolute value is 2 are when the input is out of range)
O Now we have list of 0 and 1 for each range. Sum it up :)
온라인으로 시도하십시오!
36 바이트 (@ovs 덕분에)
"ÈĄ´ëªÒ ȹª xn_Ps<Z"Ç2ôε-P(d}O
사용 -P(d
된 입력 쌍을 감산한다 내부지도, 그것은 (범위 값 중에서 긍정적 것) 생성물을 다음 적용 negative
하여 (
상기 값을 이용하여 음수인지 확인 d
.
온라인으로 시도하십시오!
> <> , 51 바이트
"Çɳº©«Ÿ¡•—‹ƒwÓmt^ìO["1&{:})${:}(*&+&55*0l3)?.&n;
(7 개의 인쇄 할 수없는 항목 포함)
온라인으로 시도하십시오!
모든 입력에 대해 최소한 하나의 클럽이 있기 때문에 범위를 다시 정렬하여 하나의 범위를 제거 할 수 있습니다. 이는 바이트 범위를 거의 벗어난 "260"부분을 제거하는 추가 이점이 있습니다.
Desmos , 106 바이트 :
f(d)=total(\left\{join([18...11],[9.5,8,6,20])*10<=d<=[47,42,40,37,34,32,30,28,26,23,18,52]*5:1,0\right\})
온라인으로 그래프보기
f(d)=
슬라이더를 입력으로 사용하는 것이 멋지다면 5 바이트를 삭제 하고 빼 십시오 .
APL, 52 45 50 바이트 :
{+⌿1=(↓12 2⍴⎕ucs'Èą´ìªÓ ɺ«¡xn_Pt<[')∘.⍸⍵}
온라인으로 시도하십시오!