Golf eine Golfkarte

Aug 17 2020

Bei einer Entfernung in Metern als Ganzzahl \$60\le d \le 260\$, geben Sie die Anzahl der Clubs zurück, die gemäß der folgenden willkürlichen Tabelle verwendet werden dürfen, wobei beide \$min\$und \$max\$ sind inklusive:

 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

Anmerkungen

  • Die Clubnamen dienen nur zur Information.

  • Natürlich hängt die Wahl des Clubs von mehreren anderen Parametern ab. Zum Beispiel soll der Sandkeil aus einem Sandbunker entkommen. Für diese Herausforderung ist jedoch nur die Entfernung von Bedeutung.

  • Dies ist zweifellos eine Code-Golf- Herausforderung.

Beispiel

Für \$d=130\$können wir 6-Eisen , 7-Eisen , 8-Eisen oder 9-Eisen wählen , also lautet die erwartete Antwort \$4\$.

Testfälle

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

Oder als Listen:

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

Antworten

17 640KB Aug 17 2020 at 23:02

x86-16 Maschinencode, 47 42 Bytes

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

Listing:

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

Aufrufbare Funktion, Eingabe din DX, Ausgabe in BL.

Keine Komprimierung (die Daten sind nur 24 22 Bytes in Binärform) nur ein Tabellenvergleich.

Bearbeiten: Riesige Requisiten an @SE - hören Sie auf, die Guten zu entlassen, um die Liste neu zu ordnen und die Notwendigkeit zu beseitigen, den dWert zu versetzen , und sparen Sie 5 Bytes !

Testprogramm läuft:

Alternative Version, 50 Bytes

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

Dies ist stark von Jonathan Allans Antwort inspiriert . Dies verwendet eine Wertetabelle, in der ddie Anzahl der Clubs entweder +1oder übergeht -1, und eine entsprechende binäre magische Zahl, in der 0x5556da 1eine positive Änderung und 0eine negative Änderung anzeigt.

Leider hilft dies hier nicht viel, da die Codierung der Originaltabelle 24 Byte gegenüber den 22 Übergängen plus der magischen 3-Byte- Zahl beträgt, sodass sie wirklich größer ist. Es hat Spaß gemacht, es zu versuchen!

12 ovs Aug 17 2020 at 22:05

Python 3 , 71 Bytes

lambda n:sum(a<=n/5<=b for a,b in zip(b'($" ',b'4/*(%" '))

Probieren Sie es online aus!

Die Byte-Strings enthalten einige nicht druckbare Dateien, ihre maskierte Form ist b'($" \x1e\x1c\x1a\x18\x16\x13\x10\x0c'und b'4/*(%" \x1e\x1c\x1a\x17\x12'.


Python 3 , 71 Bytes

lambda n:sum(b>n-a*5>-1for a,b in zip(b'($" ',b'=8))$$$'))

Probieren Sie es online aus!


Python 3.8 , 90 86 Bytes

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}])

Probieren Sie es online aus!

Die letzte Bedingung kann auch a%10<1<a/10<7,a==90in gleicher Länge geschrieben werden.

7 JonathanAllan Aug 17 2020 at 20:59

Gelee , 25 Bytes

“Ḳœẹ“rɓ?’ḃ5×5“ZO‘;"Ä⁸>§I‘

Ein vollständiges Programm, das das Ergebnis druckt (oder ein monadischer Link, der eine Liste mit einzelnen Elementen zurückgibt).

Probieren Sie es online aus! Oder sehen Sie sich die Testsuite an .

Wie?

Für jede gültige Eingabe in \$[60,260]\$Wir können mindestens einen Verein verwenden. Für jede gegebene Laufleistung in \$[61,260]\$können wir entweder den gleichen, einen mehr oder einen weniger Club verwenden, als wir es für einen Yard weniger hätten tun können. Der folgende Code codiert die Laufleistungen, bei denen die Anzahl der verfügbaren Clubs steigt, und die Werte, bei denen die Anzahl der verfügbaren Clubs sinkt, und berechnet daraus das Ergebnis.

“Ḳœẹ“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 Bytes

1#.1=(59 90+/\@,|:5*2+4#.inv 2424834 3408207)I."1]

Probieren Sie es online aus!

-5 Bytes dank xash

Codiert Listen als Zahlen in Basis 4, rekonstruiert sie und verwendet dann den Intervallindex, um I.zu zählen, in wie viele Bereiche die Eingabe fällt.

5 DominicvanEssen Aug 17 2020 at 23:53

R , 77 76 72 Bytes

Edit: -4 Bytes dank Robin Ryder

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))

Probieren Sie es online aus!

Ziemlich naiv Lösung, sondern profitiert von R ‚s automatische Vektorisierung und seine :Sequenz - Operator.

5 DanielH. Aug 17 2020 at 20:44

Python 3 , 180 155 153 97 88 Bytes

lambda n:sum(a<=chr(n)<b for a,b in zip('<P_nx‚Œ– ª´È','[tƒ—¡«ºÉÓìą'))

Probieren Sie es online aus!

5 streetster Aug 17 2020 at 20:29

K (oK) , 85 82 Bytes

Lösung:

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

Probieren Sie es online aus!

Erläuterung:

Ausgesprochen naiv; sehr wahrscheinlich, dass dies ein schlechter Ansatz ist. Obwohl schönes Golf von ngn, um die Vergleichslogik zu vereinfachen! .

{+/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

Extra:

  • -3 Bytes dankngn
3 ManishKundu Aug 17 2020 at 20:45

Python 3 , 105 Bytes

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]

Probieren Sie es online aus!

Erläuterung: Eine einfache Bruteforce zum Speichern der Antwortliste und zum Drucken des erforderlichen Index.

3 Neil Aug 18 2020 at 02:16

Holzkohle , 44 Bytes

NθIΣE¹²⁻›θ⁺⁵⁹×⁵Σ…”)⊞⊟‹G↔”ι›θ⁺⁹⁰×⁵Σ…”)⊟+.D↥”ι

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Port der Antwort von @ JonathanAllen. Erläuterung:

Nθ

Eingabe d.

IΣE¹²⁻

Ordnen Sie die 12 Clubs zu und drucken Sie die Summe der Ergebnisse aus, um die Unterschiede zwischen ...

›θ⁺⁵⁹×⁵Σ…”)⊞⊟‹G↔”ι

... dverglichen mit 59der zu 5Zeiten hinzugefügten digitalen Summe des Präfixes der komprimierten Zeichenfolge 43322222224und ...

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

... dverglichen mit 90der zu 5Zeiten hinzugefügten digitalen Summe des Präfixes der komprimierten Zeichenfolge 53222233235.

Vorherige 48-Byte-Antwort:

NθIΣEI⪪”)¶∧!✂η}⌊⍘⪫⪫⊕#<e⌊W[qY9¤…”²∧›θ⁻×⁵ι﹪κ²⊖⊗﹪κ²

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung: Die End- und Startdistanzen der 12 Clubs werden aus einer komprimierten Folge von Ganzzahlen von 12 bis 52 aufgeteilt, die mit 5 multipliziert werden. Sie dwerden mit allen verglichen, wobei 1größere oder gleiche Distanzen in ungeraden Positionen und -1größere Distanzen in geraden Positionen erzielt werden Positionen und die endgültige Summe wird gedruckt.

3 flornquake Aug 19 2020 at 07:08

Python 3 , 62 60 Bytes

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

Probieren Sie es online aus!

Am \x18Ende der Zeichenfolge befindet sich ein unsichtbares Zeichen (bei Stack Exchange) .

2 Arnauld Aug 18 2020 at 21:10

Ich denke, es ist möglich, bei den meisten Nicht-Esolangs aggressivere Kompressionsverhältnisse zu erzielen.

Als kleinen Anreiz sind hier meine eigenen Partituren in Python und Node.

Ich werde beide Codefragmente unten veröffentlichen, sobald eine kürzere oder gleich lange Antwort in einer der beiden Sprachen oder am Freitag, den 21. August 2020, um 14.00 Uhr UTC veröffentlicht (oder aktualisiert) wird, falls bis dahin keine solche Antwort veröffentlicht wird.

BEARBEITEN (2020-08-19): Herzlichen Glückwunsch an @flornquake , der als erster eine Python-Antwort unter 70 Bytes veröffentlicht hat.


Python 3.8 (Vorabversion) , 70 Bytes

lambda d,n=12:sum((n:=n+x//8-4)<=d/5<=n+x%8+6for x in b' A980001225F')

Probieren Sie es online aus!


JavaScript (Node.js) , 74 Byte

d=>Buffer(' A980001225F').map(x=>t-=d/5<(n+=x-32>>3)|d/5>n+x%8+6,n=t=12)|t

Probieren Sie es online aus!

2 DomHastings Aug 19 2020 at 18:55

Perl 5 , 70 Bytes

Das erste Byte in der Zeichenfolge wird \x##zum einfachen Testen in Notation hinzugefügt , ist jedoch ein Literalbyte.

$_=grep"@F">=($k+=(ord>>4)*5)&"@F"<=$k+(15&ord)*5,"\xc6G76&&&'((+L"=~/./g

Speichert die Details für jeden Verein (geteilt durch 5) als Byte, wobei die ersten vier Bits die Differenz zwischen dem Beginn des vorherigen Bereichs und dem Beginn dieses Bereichs sind und die zweiten vier Bits die Differenz zwischen dem Beginn dieses Bereichs und das Ende.

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

Probieren Sie es online aus!

1 rtpax Aug 17 2020 at 23:18

C (GCC) , 83 75 Bytes

(Nicht alle Zeichen werden beim Stapeltausch korrekt angezeigt, aber in TIO korrekt.)

*i;c;f(d){c=0;for(i=L"ÈĄ´ëªÒ È–¹Œª‚ x–nŒ_‚Ps<Z";*i;c+=d/ *i++&*i++/d);d=c;}

Probieren Sie es online aus!

1 Noname Aug 18 2020 at 08:04

Io , 89 Bytes

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

Probieren Sie es online aus!

1 Mukundan314 Aug 18 2020 at 10:55

Pyth , 36 Bytes

s/RC-QTrV"2FUdnx‚Œ– ª¾""Qjyƒ—¡°¿Éâû

Probieren Sie es online aus!

Erläuterung

              "...   # 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 Byte

-10 Bytes: -9 auf Bereiche angewendet und nach der Division eingegeben, anstatt nur durch 10 zu teilen (inspiriert von anderen Antworten, verstanden, warum es sich gelohnt hat, nachdem ich meinen Bereich / 10 Zahlen beobachtet habe)

-15 Bytes dank Arnauld's Verbesserungen

-5 Bytes dank Shaggys weiteren Verbesserungen

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

Probieren Sie es online aus!

Ziemlich naive Lösung, aber ich war nicht zufrieden damit, komplexere Methoden zu versuchen, die in anderen Antworten verwendet wurden (ganz zu schweigen davon, dass ich nicht sicher bin, ob sie in JS überhaupt möglich / lohnenswert sind, Golf zu spielen!). Ich nehme jedoch gerne Ratschläge / Verbesserungen entgegen.

Nicht minimiert und erklärt (etwas veraltet, erklärt aber immer noch den Gesamtprozess):

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 Bytes

38 Bytes

"ÈĄ´ëªÒ È–¹Œª‚ x–nŒ_‚Ps<Z"Ç2ôε.SOÄ2‹}O

Ich kann schlecht komprimieren :( Das Beste, was ich mir vorstellen kann, ist, jede Zahl in ein ASCII-Zeichen umzuwandeln.

Erläuterung:

"ÈĄ´ëªÒ È–¹Œª‚ 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 :)

Probieren Sie es online aus!

36 Bytes (danke an @ovs)

"ÈĄ´ëªÒ È¹ª xn_Ps<Z"Ç2ôε-P(d}O

Verwenden Sie die -P(dInside Map, die das Paar von der Eingabe subtrahiert, produzieren Sie sie (Werte außerhalb des Bereichs sind positiv), wenden Sie sie dann negativean (und prüfen Sie, ob der Wert nicht negativ ist d.

Probieren Sie es online aus!

1 SE-stopfiringthegoodguys Aug 21 2020 at 03:10

> <> , 51 Bytes

"Çɳº©«Ÿ¡•—‹ƒwÓmt^ìO["1&{:})${:}(*&+&55*0l3)?.&n;

(enthält 7 nicht druckbare)

Probieren Sie es online aus!

Da es für jeden Eingang mindestens 1 Club gibt, können die Bereiche neu angeordnet werden, um einen Bereich zu entfernen. Dies hat den zusätzlichen Vorteil, dass der Teil "260" entfernt wird, der sich gerade außerhalb des Bereichs eines Bytes befindet.

1 CarterSande Aug 24 2020 at 15:46

Desmos , 106 Bytes:

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\})

Grafik online anzeigen

Löschen f(d)=und subtrahieren Sie 5 Bytes, wenn Sie mit der Verwendung eines Schiebereglers als Eingabe cool sind.

MBaas Aug 20 2020 at 17:31

APL, 52 45 50 Bytes:

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

Probieren Sie es online aus!