Dia meledak!

21

Arrr ... Ahoy di sana, aku maties! Unfurl tha 'mainsail! Penuh ke kanan! Ah, rasakan angin di rambutmu!

Benar, saya sayang ... Saya membutuhkan sedikit keahlian Anda! Kru saya adalah orang yang lebih dimodernisasi daripada diri saya sendiri ... Saya masih lebih suka poin kompas (lihat di sini untuk info lebih lanjut, Arr ...) sementara saya kru selalu menggunakan headin '.. Aku ingin cara yang mudah untuk mengubah omong kosong ini yang mereka sebut headin 'menjadi apa yang aku bisa mengerti, Arrr!

Apa yang saya butuhkan adalah kode yang 'diambil' input dari angka (desimal baik-baik saja) seperti itu ' 0 <= the headin' < 360dan itu dikeluarkan jawaban' sebagai titik kompas terdekat! Arrr!

Berikut ini beberapa contoh:

> heading 0.1

North

> heading 11.25

North by East

> heading 22.7

North Northeast

> heading 44.99

Northeast

> heading 91

East

Sekarang, jika Anda tidak akan menjadi seperti itu jatuh tepat di tengah-tengah dua titik kompas, jangan khawatir, saya sungguh-sungguh ... Saya berharap kode untuk memuntahkan Between <point 1> and <point 2>, mis. heading 5.625akan mengatakan Between North and North by East ini hanya terjadi untuk headin 'tha' menjadi memuaskan dalam persamaan di H = 5.625 + 11.25(N)mana H menjadi 'headin' dan N menjadi bilangan bulat antara 0 dan 31 termasuk ...

Dua batasan ...

1) Saya tidak ingin Anda menggunakan array untuk menyimpan data Anda untuk poin atau judul ... Itu menipu, Pak, dan Anda bisa merasakan saya blunderbuss ... Ini memiliki t 'dihitung, jus' seperti dulu! Arrr!

2) Kode terpendek menang, atau aku akan membuat papan kamu berjalan ... Arrr!

WallyWest
sumber
10
50 '(Apostrof) dalam satu pertanyaan. Hormat! : D
Wasi
Apakah menggunakan objek dalam javascript dengan kecurangan tombol angka? Maksud saya yaarrr! apakah itu curang, ya perampok?
Tim Seguine
1
Bukankah ini seharusnya "N menjadi bilangan bulat antara 0 dan 31 inklusif"?
nwellnhof
@nwellnhof Anda benar! Diperbarui ... :)
WallyWest
1
Saya pikir Anda harus meluncurkan kode golf di mana tujuannya adalah untuk menerjemahkan pertanyaan Anda ke bahasa Inggris yang benar secara ortografis!
sergiol

Jawaban:

6

Perl 5.10 menggunakan substitusi, 231 228 226 224

@c=(north,east,south,west);
@q=qw(P PbR P-Q QbP Q QbR R-Q RbP);
sub p{$j=$_[0]>>3&3;$_=$q[7&pop];s/P/$c[$j]/;s/Q/$c[$j+1&2]$c[$j|1]/;s/R/$c[$j+1&3]/;s/b/ by /;ucfirst}
$a=<>/11.25+.5;
say$a==int$a&&'Between '.p($a-1).' and ',p$a

Empat baris baru ditambahkan untuk dibaca.

Sunting: Golf 2 byte lebih banyak menggunakan pop. Terima kasih @ Tom Hastings

Sunting: 2 byte lebih sedikit menggunakanqw()

nwellnhof
sumber
22

Saya menghabiskan terlalu banyak waktu untuk berburu harta karun di sini, tapi inilah solusi di Jawa :

public class Aaaaarrrr {

    public static void main(String[] aaarrrgs) {

        float heading = Float.parseFloat(aaarrrgs[0]);

        final List<String> points = Arrays.asList("North",
                "North by east", "North-northeast", "Northeast by north",
                "Northeast", "Northeast by east", "East-northeast",
                "East by north", "East", "East by south", "East-southeast",
                "Southeast by east", "Southeast", "Southeast by south",
                "South-southeast", "South by east", "South", "South by west",
                "South-southwest", "Southwest by south", "Southwest",
                "Southwest by west", "West-southwest", "West by south", "West",
                "West by north", "West-northwest", "Northwest by west",
                "Northwest", "Northwest by north", "North-northwest",
                "North by west");


        float cp = heading / 360.0f * 32.0f;
        if (cp % 1 == 0.5f)
             System.out.print("Between " + points.get((int)Math.floor(cp)) + " and ");

         System.out.println(points.get(Math.round(cp)));

    }
}

sunting Jika saya meminimalkan kode di atas dan menjadikannya benar-benar jelek, ini akan menjadi ini:

Jawa, 770 karakter

import java.util.*;class A{public static void main(String[] r){List<String> l=Arrays.asList("North","North by east","North-northeast","Northeast by north","Northeast","Northeast by east","East-northeast","East by north","East","East by south","East-southeast","Southeast by east","Southeast","Southeast by south","South-southeast","South by east","South","South by west","South-southwest","Southwest by south","Southwest","Southwest by west","West-southwest","West by south", "West","West by north","West-northwest","Northwest by west","Northwest","Northwest by north","North-northwest","North by west");float c=Float.parseFloat(r[0])/360.0f*32.0f;if (c%1==0.5f) System.out.print("Between "+l.get((int)Math.floor(c))+" and ");System.out.println(l.get(Math.round(c)));}}
Jeen Broekstra
sumber
24
+1 untukaaarrrgs
Danko Durbić
3
Saya yakin itu tidak membantu saya pada aturan "menang kode terpendek", tetapi karena saya tetap menggunakan Java ...
Jeen Broekstra
Saya mengagumi pendekatannya, meskipun Anda menggunakan Arrays.asListperintah, maafkan saya di sini karena ketidaktahuan Java saya, tetapi bukankah itu menggunakan array penyimpanan? Atau apakah ini cara licik untuk memperkenalkan array dalam bentuk daftar? ;)
WallyWest
@Jeen, bisakah kamu menunjukkan padaku apa yang bisa kamu dapatkan jika kamu benar-benar membunyikan klakson dan mengurangi kode di sana?
WallyWest
2
@ Eliseod'Annunzio wrt array, saya pikir Anda hanya berarti saya tidak bisa menggunakannya untuk menyimpan pemetaan antara nama dan interval heading. Array ini (daftar) hanya menyimpan nama sebenarnya. Tetapi jika itu di luar aturan, saya membayangkan itu bisa diubah untuk menggunakan switchpernyataan sebagai gantinya (dengan beberapa karakter tambahan, sayangnya). Oh dan versi kental kode yang sama ditambahkan. Saya akan memikirkan lebih lanjut tentang meremehkannya dengan benar-benar mengubah cara kerjanya.
Jeen Broekstra
6

Python, 264

n='north'
e='east'
s='south'
w='west'
b=' by '
def f(H):x,y,z=(n,e,s,w,e,s,w,n,n+e,s+e,s+w,n+w)[int(H%360/90)::4];return(x,x+b+y,x+'-'+z,z+b+x,z,z+b+y,y+'-'+z,y+b+x)[int(H%90*4/45)].capitalize()
h=input()+5.625
print h%11.25and f(h)or'Between '+f(h-1)+' and '+f(h)

Ini menggunakan huruf besar sesuai halaman wikipedia dan harus berfungsi untuk nomor apa pun.

grc
sumber
1
Arrr, itu adalah penggunaan fungsi yang cerdas di sana ...
WallyWest
4

Arrr Python, 336

A,R,r=int,input()/360.*32,' by #South#north#West#East#south#North#west#east#-#/#Between#and'.split('#')
a=''.join(r[A(c,16)]for c in'6A608A6928A6802A68A6808A4928A402A4A405A4958A1808A18A1805A1958A108A1A107A1957A1705A17A1707A3957A305A3A302A3927A6707A67A6702A6927A607').split('/')
if R%1==.5:print r[11],a[A(R)],r[12],
print a[A(round(R))]

Terima kasih @Jeen

AsksAnyway
sumber
Saya sedikit bingung di sini @ AsksAnyway, apa gunanya 'ada leviathan dari sebuah string? ...
Atur
Itu "menghitung" nama-nama titik kompas. Ini cara mengurangi ukuran kode.
AsksAnyway
2

Perl 5.10, 262 257 254

Agak mirip dengan salah satu solusi Python:

$n=north;$e=east;$s=south;$w=west;
@d=($n,$n.$e,$e,$s.$e,$s,$s.$w,$w,$n.$w,$n);
sub p{$j=pop;$i=$j>>2;ucfirst(($d[$i],"$d[$i] by $d[$i+2&~1]","$d[$i+1&~1]-$d[$i|1]","$d[$i+1] by $d[$i&~1]")[$j&3])}
$a=<>/11.25+.5;
say$a==int$a&&'Between '.p($a-1).' and ',p$a

Empat baris baru ditambahkan untuk dibaca.

Sunting: Tiga byte lebih sedikit berkat @Dom Hastings

nwellnhof
sumber
Hey @nwellnhof, Terlihat cukup komprehensif! Anda dapat menyimpan beberapa karakter lagi, menghapus ;di akhir sub pdan beralih shiftke pop.
Dom Hastings
@nwellhoff, aku tidak tahu Perl bisa menerima string tanpa tanda kutip? (re: line 1)
WallyWest
1
@ Eliseod'Annunzio Perl menerima string tanpa tanda kutip dalam mode non-ketat jika mereka tidak berbenturan dengan nama fungsi atau kata yang dipesan.
nwellnhof