Golf bir golf haritası
Tam sayı olarak metre cinsinden bir mesafe verildiğinde \$60\le d \le 260\$, aşağıdaki gelişigüzel tabloya göre kullanılabilecek kulüp sayısını döndürün, burada her ikisi de \$min\$ve \$max\$ kapsayıcıdır:
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
Notlar
Kulüp isimleri sadece bilgi amaçlı verilmiştir.
Tabii ki, kulübün seçimi diğer birçok parametreye bağlıdır. Örneğin, Kum Kaması bir kum sığınağından kaçmak için tasarlanmıştır. Ancak bu meydan okumanın amaçları için yalnızca mesafe önemlidir.
Bu şüphesiz bir kod-golf mücadelesidir.
Misal
için \$d=130\$, 6-demir , 7-demir , 8-demir veya 9-demir seçebiliriz , dolayısıyla beklenen cevap \$4\$.
Test durumları
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
Veya liste olarak:
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
Yanıtlar
x86-16 makine kodu, 47 42 bayt
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 ..........
İlan:
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
Çağrılabilir işlevi, giriş d
olarak DX
, çıktı olarak BL
.
Sıkıştırma yok (veriler yalnızca 24 İkili olarak 22 bayt) sadece bir tablo karşılaştırması.
Düzenleme: @SE'ye büyük destek - iyi adamları listeyi yeniden düzenlemek için kovmayı bırakın ve d
değeri dengeleme ihtiyacını ortadan kaldırın , 5 bayt tasarruf edin !
Test programı şu şekilde çalışır:


Alternatif sürüm, 50 bayt
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
Bu, Jonathan Allan'ın cevabından büyük ölçüde esinlenmiştir . Bu, bir değerler tablosu kullanır d
nerede kulüpleri geçişleri ya sayısı +1
veya -1
, ve buna karşılık gelen ikili sihirli sayı arasında 0x5556d
bir yerde 1
olumlu bir değişiklik gösterir ve 0
olumsuz değişiklik gösterir.
Ne yazık ki, bu çok yardımcı olmuyor, çünkü orijinal tabloyu kodlamak 24 bayt ve 22 geçiş artı 3 bayt sihirli sayı olduğundan gerçekten daha büyük. Yine de denemek eğlenceliydi!
Python 3 , 71 bayt
lambda n:sum(a<=n/5<=b for a,b in zip(b'($" ',b'4/*(%" '))
Çevrimiçi deneyin!
Bayt dizeleri bazı yazdırılamazlar içerir, bunların çıkış karakterleri b'($" \x1e\x1c\x1a\x18\x16\x13\x10\x0c'
ve şeklindedir b'4/*(%" \x1e\x1c\x1a\x17\x12'
.
Python 3 , 71 bayt
lambda n:sum(b>n-a*5>-1for a,b in zip(b'($" ',b'=8))$$$'))
Çevrimiçi deneyin!
Python 3,8 , 90 86 bayt
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}])
Çevrimiçi deneyin!
Son durum da a%10<1<a/10<7,a==90
aynı uzunlukta yazılabilir .
Jöle , 25 bayt
“Ḳœẹ“rɓ?’ḃ5×5“ZO‘;"Ä⁸>§I‘
Sonucu yazdıran tam bir program (veya tek elemanlı bir liste döndüren monadik bir Bağlantı).
Çevrimiçi deneyin! Veya test süitine bakın .
Nasıl?
Herhangi bir geçerli giriş için, \ içinde$[60,260]\$en az bir kulüp kullanabiliyoruz. Herhangi bir yarda için \ cinsinden$[61,260]\$Bir yarda daha azına yapabileceğimizden aynı, bir fazla veya bir eksi sopayı kullanabiliriz. Aşağıdaki kod, mevcut sopaların sayısının arttığı ve mevcut sopaların sayısının düştüğü mesafeleri kodlar ve sonucu hesaplamak için bunu kullanır.
“Ḳœẹ“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 bayt
1#.1=(59 90+/\@,|:5*2+4#.inv 2424834 3408207)I."1]
Çevrimiçi deneyin!
Xash sayesinde -5 bayt
Listeleri 4 tabanındaki sayılar olarak kodlar, yeniden yapılandırır, ardından I.
girdinin kaç aralıkta yer aldığını saymak için aralık indeksini kullanır .
R , 77 76 72 bayt
Düzenleme: Robin Ryder sayesinde -4 bayt
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))
Çevrimiçi deneyin!
Oldukça saf bir çözüm, ancak R'nin otomatik vektörleştirmesinden ve :
sıra operatöründen yararlanıyor.
Python 3 , 180 155 153 97 88 bayt
lambda n:sum(a<=chr(n)<b for a,b in zip('<P_nx ª´È','[t¡«ºÉÓìą'))
Çevrimiçi deneyin!
K (oK) , 85 82 bayt
Çözüm:
{+/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*
Çevrimiçi deneyin!
Açıklama:
Kesinlikle saf; Büyük ihtimalle bu kötü bir yaklaşımdır. Karşılaştırma mantığını basitleştirmek için ngn tarafından güzel golf olmasına rağmen! .
{+/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
Ekstra:
- -3 bayt sayesinde
ngn
Python 3 , 105 bayt
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]
Çevrimiçi deneyin!
Açıklama: Cevapların listesini saklamak ve gerekli dizini yazdırmak için basit bir bruteforce.
Kömür , 44 bayt
NθIΣE¹²⁻›θ⁺⁵⁹×⁵Σ…”)⊞⊟‹G↔”ι›θ⁺⁹⁰×⁵Σ…”)⊟+.D↥”ι
Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı sürümüne yöneliktir. Port of @ JonathanAllen'ın cevabı. Açıklama:
Nθ
Giriş d
.
IΣE¹²⁻
12 kulübün haritasını çıkarın ve aralarındaki farkları alarak diziye atılan sonuçların toplamını yazdırın ...
›θ⁺⁵⁹×⁵Σ…”)⊞⊟‹G↔”ι
... d
ile karşılaştırıldığında 59
ilave 5
kat sıkıştırılmış dize önek dijital toplamı 43322222224
ve ...
›θ⁺⁹⁰×⁵Σ…”)⊟+.D↥”ι
... d
ile karşılaştırıldığında 90
ilave 5
kat sıkıştırılmış dize önek dijital toplamı 53222233235
.
Önceki 48 baytlık yanıt:
NθIΣEI⪪”)¶∧!✂η}⌊⍘⪫⪫⊕#<e⌊W[qY9¤…”²∧›θ⁻×⁵ι﹪κ²⊖⊗﹪κ²
Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı sürümüne yöneliktir. Açıklama: 12 sopanın bitiş ve başlama mesafeleri, 12 ile 52 arasındaki sıkıştırılmış bir tamsayı dizisinden ayrılmıştır ve d
bunların tümü 5 ile çarpılmıştır 1
, tek pozisyonlarda daha büyük veya eşit mesafeler için ve çift pozisyonlarda -1
daha büyük mesafeler için puanlanarak hepsiyle karşılaştırılmıştır. pozisyonlar ve nihai toplam yazdırılır.
Python 3 ,
62
60 bayt
lambda d:sum(b//25<=b%25+23-d/5<=7for b in b'BUNSWYQ+-}')+1
Çevrimiçi deneyin!
\x18
Dizenin sonunda görünmez (Stack Exchange'de) bir karakter var.
Çoğu esolang olmayanlarda daha agresif sıkıştırma oranları elde etmenin mümkün olduğunu düşünüyorum.
Küçük bir teşvik olarak, işte Python ve Node'daki kendi puanlarım.
Her iki dilde de daha kısa veya eşit uzunlukta bir cevap yayınlanır yayınlanmaz (veya güncellendiğinde) veya o zamana kadar böyle bir cevabın yayınlanmaması ihtimaline karşın 21 Ağustos 2020 Cuma günü saat 14: 00'da iki kod parçasını aşağıda açıklayacağım.
DÜZENLEME (2020-08-19): Benimkine benzer bir fikir kullanarak, 70 baytın altında bir Python cevabı gönderen ilk kişi olmak için @ flornquake'i tebrikler , ancak bunu toplam 62 bayt için bir adım daha ileri götürüyor !
Python 3.8 (ön sürüm) , 70 bayt
lambda d,n=12:sum((n:=n+x//8-4)<=d/5<=n+x%8+6for x in b' A980001225F')
Çevrimiçi deneyin!
JavaScript (Node.js) , 74 bayt
d=>Buffer(' A980001225F').map(x=>t-=d/5<(n+=x-32>>3)|d/5>n+x%8+6,n=t=12)|t
Çevrimiçi deneyin!
Perl 5 , 70 bayt
Dizedeki ilk bayt, \x##
kolay test için gösterimde eklenir , ancak gerçek bir bayttır.
$_=grep"@F">=($k+=(ord>>4)*5)&"@F"<=$k+(15&ord)*5,"\xc6G76&&&'((+L"=~/./g
Her kulüp için ayrıntıları (5'e bölünmüş) bir bayt olarak saklar; burada ilk dört bit, bir önceki aralığın başlangıcından ve bunun başlangıcından farktır ve ikinci dört bit, bu aralığın başlangıcı ve son.
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
Çevrimiçi deneyin!
C (gcc) , 83 75 bayt
(yığın değişiminde tüm karakterler doğru görünmez, ancak TIO'da doğrudur)
*i;c;f(d){c=0;for(i=L"ÈĄ´ëªÒ ȹª xn_Ps<Z";*i;c+=d/ *i++&*i++/d);d=c;}
Çevrimiçi deneyin!
Io , 89 bayt
method(a," \"$("asList select(i,v,v at(0)<=a/5and a/5<=" \"%(*/4"at(i))size)
Çevrimiçi deneyin!
Pyth , 36 bayt
s/RC-QTrV"2FUdnx ª¾""Qjy¡°¿Éâû
Çevrimiçi deneyin!
Açıklama
"... # 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
JavaScript (V8) , 142 132 117 113 bayt
-10 bayt: 10'a bölmek yerine aralıklara ve bölümden sonra girişe uygulanan -9
Arnauld'un iyileştirmeleri sayesinde -15 bayt
Shaggy'nin diğer iyileştirmeleri sayesinde -5 bayt
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
Çevrimiçi deneyin!
Oldukça saf bir çözüm, ancak diğer yanıtlarda kullanılan daha karmaşık yöntemleri denemekte rahat değildim (JS'de mümkün / golf oynamaya değer olup olmadıklarından emin değilim!). Yine de, memnuniyetle tavsiye / iyileştirmeler alacağım.
Küçültülmemiş ve açıklanmış (biraz modası geçmiş ancak yine de genel süreci açıklıyor):
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 bayt
38 Bayt
"ÈĄ´ëªÒ È–¹Œª‚ x–nŒ_‚Ps<Z"Ç2ôε.SOÄ2‹}O
Sıkıştırmakta kötüyüm :( Düşünebildiğim en iyi şey, her sayıyı bir ASCII karakterine dönüştürmektir.
Açıklama:
"ÈĄ´ëªÒ È–¹Œª‚ 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 :)
Çevrimiçi deneyin!
36 Bayt (@ovs sayesinde)
"ÈĄ´ëªÒ ȹª xn_Ps<Z"Ç2ôε-P(d}O
Kullanma -P(d
girişi ile çift çıkarır içindeki ilk, bu (aralık değerleri, pozitif olacaktır) ürünü, daha sonra geçerli negative
olan (
ve değerini kullanarak negatif olmayan olup olmadığını kontrol d
.
Çevrimiçi deneyin!
> <> , 51 bayt
"Çɳº©«Ÿ¡•—‹ƒwÓmt^ìO["1&{:})${:}(*&+&55*0l3)?.&n;
(7 yazdırılamaz içerir)
Çevrimiçi deneyin!
Her giriş için en az 1 kulüp olduğundan, aralıklar bir aralıktan kurtulmak için yeniden düzenlenebilir, bu da bir bayt aralığının hemen hemen dışında olan "260" bölümünü kaldırmanın ek faydasına sahiptir.
Desmos , 106 bayt:
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\})
Çevrimiçi grafiği görüntüleyin
f(d)=
Giriş olarak bir kaydırıcı kullanmak hoşunuza gidiyorsa 5 baytı silin ve çıkarın.
APL, 52 45 50 bayt:
{+⌿1=(↓12 2⍴⎕ucs'Èą´ìªÓ ɺ«¡xn_Pt<[')∘.⍸⍵}
Çevrimiçi deneyin!