Golf grafik
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
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 d
dalam 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 d
nilainya, 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 d
mana jumlah klub transisi baik +1
atau -1
, dan sesuai biner angka ajaib dari 0x5556d
mana 1
menunjukkan perubahan positif dan 0
menunjukkan 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!
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==90
dengan panjang yang sama.
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"
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.
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.
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!
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 berkat
ngn
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.
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↔”ι
... d
dibandingkan dengan 59
penambahan 5
kali jumlah digital awalan dari string yang dikompresi 43322222224
, dan ...
›θ⁺⁹⁰×⁵Σ…”)⊟+.D↥”ι
... d
dibandingkan dengan kali 90
ditambahkan 5
jumlah 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. d
dibandingkan dengan semuanya, skor 1
untuk jarak yang lebih besar atau sama di posisi ganjil dan -1
untuk jarak yang lebih jauh di genap posisi dan total akhir dicetak.
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) \x18
di akhir string.
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!
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!
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"ÈĄ´ëªÒ ȹª xn_Ps<Z";*i;c+=d/ *i++&*i++/d);d=c;}
Cobalah secara online!
Io , 89 byte
method(a," \"$("asList select(i,v,v at(0)<=a/5and a/5<=" \"%(*/4"at(i))size)
Cobalah secara online!
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
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;
}
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(d
dalam peta, yang akan kurangi pasangan dengan input, produk itu (keluar dari nilai-nilai berbagai akan positif), kemudian menerapkan negative
dengan (
dan memeriksa apakah nilai non-negatif menggunakan d
.
Cobalah secara online!
> <> , 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.
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.
APL, 52 45 50 byte:
{+⌿1=(↓12 2⍴⎕ucs'Èą´ìªÓ ɺ«¡xn_Pt<[')∘.⍸⍵}
Cobalah secara online!