Golf bir golf haritası

Aug 17 2020

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

17 640KB Aug 17 2020 at 23:02

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ş dolarak 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 ddeğ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 dnerede kulüpleri geçişleri ya sayısı +1veya -1, ve buna karşılık gelen ikili sihirli sayı arasında 0x5556dbir yerde 1olumlu bir değişiklik gösterir ve 0olumsuz 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!

12 ovs Aug 17 2020 at 22:05

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==90aynı uzunlukta yazılabilir .

7 JonathanAllan Aug 17 2020 at 20:59

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"
6 Jonah Aug 17 2020 at 20:56

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 .

5 DominicvanEssen Aug 17 2020 at 23:53

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.

5 DanielH. Aug 17 2020 at 20:44

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!

5 streetster Aug 17 2020 at 20:29

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 sayesindengn
3 ManishKundu Aug 17 2020 at 20:45

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.

3 Neil Aug 18 2020 at 02:16

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↔”ι

... dile karşılaştırıldığında 59ilave 5kat sıkıştırılmış dize önek dijital toplamı 43322222224ve ...

›θ⁺⁹⁰×⁵Σ…”)⊟+.D↥”ι

... dile karşılaştırıldığında 90ilave 5kat 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 dbunları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 -1daha büyük mesafeler için puanlanarak hepsiyle karşılaştırılmıştır. pozisyonlar ve nihai toplam yazdırılır.

3 flornquake Aug 19 2020 at 07:08

Python 3 , 62 60 bayt

lambda d:sum(b//25<=b%25+23-d/5<=7for b in b'BUNSWYQ+-}')+1

Çevrimiçi deneyin!

\x18Dizenin sonunda görünmez (Stack Exchange'de) bir karakter var.

2 Arnauld Aug 18 2020 at 21:10

Ç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!

2 DomHastings Aug 19 2020 at 18:55

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!

1 rtpax Aug 17 2020 at 23:18

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"ÈĄ´ëªÒ È–¹Œª‚ x–nŒ_‚Ps<Z";*i;c+=d/ *i++&*i++/d);d=c;}

Çevrimiçi deneyin!

1 Noname Aug 18 2020 at 08:04

Io , 89 bayt

method(a," \"$("asList select(i,v,v at(0)<=a/5and a/5<=" \"%(*/4"at(i))size)

Çevrimiçi deneyin!

1 Mukundan314 Aug 18 2020 at 10:55

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
1 Matsyir Aug 18 2020 at 01:04

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;
}
1 SomoKRoceS Aug 18 2020 at 05:05

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(dgirişi ile çift çıkarır içindeki ilk, bu (aralık değerleri, pozitif olacaktır) ürünü, daha sonra geçerli negativeolan (ve değerini kullanarak negatif olmayan olup olmadığını kontrol d.

Çevrimiçi deneyin!

1 SE-stopfiringthegoodguys Aug 21 2020 at 03:10

> <> , 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.

1 CarterSande Aug 24 2020 at 15:46

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.

MBaas Aug 20 2020 at 17:31

APL, 52 45 50 bayt:

{+⌿1=(↓12 2⍴⎕ucs'Èą´ìªÓ Éº«¡xn_Pt<[')∘.⍸⍵}

Çevrimiçi deneyin!