Golf grafik

Aug 17 2020

Diberikan jarak dalam meter sebagai bilangan bulat \$60\le d \le 260\$, kembalikan jumlah klub yang dapat digunakan menurut bagan arbitrer berikut, di mana keduanya \$min\$dan \$max\$ inklusif:

 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

Catatan

  • Nama klub diberikan hanya untuk informasi.

  • Tentu saja, pilihan klub bergantung pada beberapa parameter lainnya. Misalnya Sand Wedge dirancang untuk melarikan diri dari bunker pasir. Tetapi untuk tujuan tantangan ini, hanya jarak yang penting.

  • Ini tidak diragukan lagi merupakan tantangan kode-golf .

Contoh

Untuk \$d=130\$, kita dapat memilih 6-iron , 7-iron , 8-iron atau 9-iron , jadi jawaban yang diharapkan adalah \$4\$.

Kasus uji

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

Atau sebagai daftar:

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

Jawaban

17 640KB Aug 17 2020 at 23:02

kode mesin x86-16, 47 42 byte

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

Daftar:

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

Fungsi callable, masukan ddalam DX, output BL.

Tidak ada kompresi (data hanya 24 22 byte dalam biner pula) hanya perbandingan tabel.

Sunting: Alat peraga besar untuk @SE - berhenti menembaki orang-orang baik untuk mengatur ulang daftar dan menghilangkan kebutuhan untuk mengimbangi dnilainya, menghemat 5 byte !

Program uji berjalan:

Versi alternatif, 50 byte

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

Ini sangat terinspirasi oleh jawaban Jonathan Allan . Ini menggunakan tabel nilai dari dmana jumlah klub transisi baik +1atau -1, dan sesuai biner angka ajaib dari 0x5556dmana 1menunjukkan perubahan positif dan 0menunjukkan perubahan negatif.

Sayangnya, ini tidak banyak membantu di sini karena pengkodean tabel asli adalah 24 byte versus 22 transisi ditambah angka ajaib 3 byte jadi sebenarnya lebih besar. Itu menyenangkan mencoba!

12 ovs Aug 17 2020 at 22:05

Python 3 , 71 byte

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

Cobalah secara online!

String byte berisi beberapa yang tidak dapat dicetak, bentuk pelolosannya adalah b'($" \x1e\x1c\x1a\x18\x16\x13\x10\x0c'dan b'4/*(%" \x1e\x1c\x1a\x17\x12'.


Python 3 , 71 byte

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

Cobalah secara online!


Python 3.8 , 90 86 byte

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

Cobalah secara online!

Kondisi terakhir juga bisa ditulis a%10<1<a/10<7,a==90dengan panjang yang sama.

7 JonathanAllan Aug 17 2020 at 20:59

Jeli , 25 byte

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

Program lengkap yang mencetak hasilnya (atau Tautan monadik yang mengembalikan daftar elemen tunggal).

Cobalah secara online! Atau lihat rangkaian pengujian .

Bagaimana?

Untuk masukan yang valid, di \$[60,260]\$kami dapat menggunakan setidaknya satu klub. Untuk ukuran yard tertentu, di \$[61,260]\$, kami dapat menggunakan klub yang sama, satu lebih banyak, atau lebih sedikit dari yang kami bisa lakukan untuk kurang dari satu yard. Kode di bawah ini mengkodekan yardage di mana jumlah klub yang tersedia naik, dan yang di mana jumlah klub yang tersedia turun dan menggunakannya untuk menghitung hasil.

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

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

Cobalah secara online!

-5 byte berkat xash

Menyandikan daftar sebagai angka dalam basis 4, merekonstruksi, kemudian menggunakan indeks interval I.untuk menghitung berapa banyak rentang masukan yang masuk.

5 DominicvanEssen Aug 17 2020 at 23:53

R , 77 76 72 byte

Edit: -4 byte berkat 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))

Cobalah secara online!

Solusi yang cukup naif, tetapi mendapatkan keuntungan dari vektorisasi otomatis R dan :operator urutannya.

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ƒ—¡«ºÉÓìą'))

Cobalah secara online!

5 streetster Aug 17 2020 at 20:29

K (oK) , 85 82 byte

Larutan:

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

Cobalah secara online!

Penjelasan:

Sangat naif; kemungkinan besar ini adalah pendekatan yang buruk. Meskipun golf bagus oleh ngn untuk menyederhanakan logika perbandingan! .

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

Tambahan:

  • -3 byte berkatngn
3 ManishKundu Aug 17 2020 at 20:45

Python 3 , 105 byte

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]

Cobalah secara online!

Penjelasan: Bruteforce sederhana untuk menyimpan daftar jawaban dan mencetak indeks yang diperlukan.

3 Neil Aug 18 2020 at 02:16

Arang , 44 byte

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

Cobalah secara online! Tautan adalah untuk verbose versi kode. Port of @ JonathanAllen jawaban. Penjelasan:

Nθ

Masukan d.

IΣE¹²⁻

Petakan ke 12 klub dan cetak jumlah hasil yang diberikan ke string untuk mengambil perbedaan antara ...

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

... ddibandingkan dengan 59penambahan 5kali jumlah digital awalan dari string yang dikompresi 43322222224, dan ...

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

... ddibandingkan dengan kali 90ditambahkan 5jumlah digital dari awalan string yang dikompresi 53222233235.

Jawaban 48-byte sebelumnya:

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

Cobalah secara online! Tautan adalah untuk verbose versi kode. Penjelasan: Jarak akhir dan awal dari 12 klub dipisahkan dari rangkaian bilangan bulat yang dikompresi dari 12 menjadi 52 yang dikalikan dengan 5. ddibandingkan dengan semuanya, skor 1untuk jarak yang lebih besar atau sama di posisi ganjil dan -1untuk jarak yang lebih jauh di genap posisi dan total akhir dicetak.

3 flornquake Aug 19 2020 at 07:08

Python 3 , 62 60 byte

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

Cobalah secara online!

Ada karakter yang tidak terlihat (di Stack Exchange) \x18di akhir string.

2 Arnauld Aug 18 2020 at 21:10

Saya pikir mungkin saja untuk mencapai rasio kompresi yang lebih agresif di sebagian besar non-esolangs.

Sebagai sedikit insentif, berikut skor saya sendiri di Python dan Node.

Saya akan mengungkap kedua potongan kode di bawah ini segera setelah jawaban yang lebih pendek atau sama panjangnya diposting (atau diperbarui) dalam salah satu bahasa, atau pada pukul 14:00 UTC pada hari Jumat 21 Agustus 2020 seandainya tidak ada jawaban seperti itu yang dipublikasikan pada saat itu.

EDIT (2020-08-19): Selamat kepada @flornquake karena menjadi yang pertama memposting jawaban Python di bawah 70 byte, menggunakan ide yang mirip dengan milik saya tetapi mendorongnya selangkah lebih maju dengan total 62 byte!


Python 3.8 (pra-rilis) , 70 byte

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

Cobalah secara online!


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

Cobalah secara online!

2 DomHastings Aug 19 2020 at 18:55

Perl 5 , 70 byte

Byte pertama dalam string ditambahkan dalam \x##notasi untuk memudahkan pengujian, tetapi merupakan byte literal.

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

Menyimpan detail untuk setiap klub (dibagi 5) sebagai byte di mana empat bit pertama adalah perbedaan dari awal rentang sebelumnya dan awal yang ini, dan empat bit kedua adalah perbedaan antara awal rentang ini dan tamat.

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

Cobalah secara online!

1 rtpax Aug 17 2020 at 23:18

C (gcc) , 83 75 byte

(tidak semua karakter ditampilkan dengan benar di stack exchange, tetapi benar di TIO)

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

Cobalah secara online!

1 Noname Aug 18 2020 at 08:04

Io , 89 byte

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

Cobalah secara online!

1 Mukundan314 Aug 18 2020 at 10:55

Pyth , 36 byte

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

Cobalah secara online!

Penjelasan

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

-10 byte: diterapkan -9 untuk rentang dan masukan setelah pembagian daripada hanya membagi dengan 10 (terinspirasi oleh jawaban lain, mengerti mengapa itu sepadan setelah mengamati kisaran / 10 angka saya)

-15 byte berkat peningkatan Arnauld

-5 byte berkat peningkatan lebih lanjut Shaggy

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

Cobalah secara online!

Solusi yang cukup naif tetapi saya tidak nyaman mencoba metode yang lebih kompleks yang digunakan dalam jawaban lain (belum lagi saya tidak yakin apakah mereka mungkin / layak bermain golf di JS!). Saya akan dengan senang hati menerima saran / perbaikan.

Tidak diminimalkan & dijelaskan (sedikit ketinggalan zaman tetapi masih menjelaskan proses keseluruhan):

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 byte

38 Byte

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

Saya buruk dalam mengompresi :( Yang terbaik yang dapat saya pikirkan adalah mengonversi setiap angka menjadi karakter ASCII.

Penjelasan:

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

Cobalah secara online!

36 Bytes (terima kasih kepada @ovs)

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

Menggunakan -P(ddalam peta, yang akan kurangi pasangan dengan input, produk itu (keluar dari nilai-nilai berbagai akan positif), kemudian menerapkan negativedengan (dan memeriksa apakah nilai non-negatif menggunakan d.

Cobalah secara online!

1 SE-stopfiringthegoodguys Aug 21 2020 at 03:10

> <> , 51 byte

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

(berisi 7 tak tercetak)

Cobalah secara online!

Karena setidaknya ada 1 klub untuk setiap input, seseorang dapat mengatur ulang rentang untuk menyingkirkan satu rentang, yang memiliki manfaat tambahan untuk menghilangkan bagian "260" yang hanya sedikit di luar rentang byte.

1 CarterSande Aug 24 2020 at 15:46

Desmos , 106 byte:

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

Lihat grafik online

Hapus f(d)=dan kurangi 5 byte jika Anda keren dengan menggunakan slider sebagai input.

MBaas Aug 20 2020 at 17:31

APL, 52 45 50 byte:

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

Cobalah secara online!