O darbeler!


21

Arrr ... Ahoy, ben maties! Ana yelkeni aç! Sancak dolu! Ah, saçlarının rüzgarı hisset!

Doğru, kalplerim ... biraz kodlama becerisine ihtiyacım var! Mürettebat ben kendimden daha modernleşmiş bir lise ... Ben hala mürettebat sürekli çalışıyorken, ben hala 'pusulanın' puanlarını tercih ediyorum ( daha fazla bilgi için buraya bakın , Arrr ...). Anlayabildiğim şeye bir başlık olarak adlandırdıkları bu çeki dönüştürmek için kolay bir yol istiyorum Arrr!

İhtiyacım olan şey, bu şekilde bir rakamın girişini almaktır (ondalık sayılar iyidir) böyle bir tha ' 0 <= the headin' < 360ve en yakın pusula noktası olarak' cevabını 'dökmek! Arrr!

İşte bazı örnekler:

> heading 0.1

North

> heading 11.25

North by East

> heading 22.7

North Northeast

> heading 44.99

Northeast

> heading 91

East

Şimdi, eğer 'başlıyorsanız' tam olarak iki pusula noktasının ortasına düşecek şekilde olursanız, korkak olmayın, ben kalplerim ... kodun tükürmesini bekliyorum. Between <point 1> and <point 2>, örneğin şunu heading 5.625söyleyeceğim: Between North and North by East Bu sadece H = 5.625 + 11.25(N)H'nin 'baş' olduğu ve N'nin 0 ile 31 arasında bir tam sayı olduğu denklemini sağladığı için ...

İki kısıtlama ...

1) Puan verilerini sıraya koymak için dizileri kullanmamı ya da 'headin'in' hile yapmasını istemiyorum, efendim, bir 'tadamı alıyorum' hesaplanmaz, eski günlerdeki gibi jus! Arrr!

2) En kısa kod kazanır, yoksa tahtaya doğru yürürsün ... Arrr!


10
'Tek bir soruda 50 (Kesme işareti). Şapka çıkart! : D
Wasi

Javascript'te sayısal anahtarlar hile yapan bir nesne mi kullanıyor? Yaarrr demek istiyorum! aldatıyor musun, kara mekiği?
Tim Seguine

1
Bu "N, 0 ile 31 arasında bir tam sayı olamaz" değil mi?
nwellnhof

@nwellnhof Haklısın! Güncelleme ... :)
WallyWest

1
Sanırım amacın sorunuzu ortografik olarak İngilizceye düzeltmek için bir golf sahası başlatmalısınız!
sergiol,

Yanıtlar:


6

Oyuncu değişikliği kullanılarak 5.10, Perl, 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

Okunabilirlik için dört yeni satır eklendi.

Düzenleme: Golf 2 byte kullanarak daha fazla pop. Thanks @Dom Hastings

Düzenleme: 2 bayt daha az kullanarakqw()


22

Buradaki hazine avı için çok fazla zaman harcıyorum ama Java'da bir çözüm :

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

    }
}

düzenleme Eğer yukarıdaki kodu küçültürsem ve çirkin yaparsam, bu şöyle olur:

Java, 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)));}}

24
+1 içinaaarrrgs
Danko Durbić

3
Eminim ki "en kısa kod kazanır" kuralı konusunda bana yardımcı olmadı, ama yine de Java kullandığımdan beri ...
Jeen Broekstra

Bu yaklaşımı takdir ediyorum, Arrays.asListkomutu kullanıyor olsanız da , Java cehaletim için beni burada affedin, ama bu bir depolama dizisi kullanmıyor mu? Yoksa bu, diziyi bir liste biçiminde tanıtmanın gizli bir yolu mu? ;)
WallyWest

@Jeen, eğer beni gerçekten korur ve kodunu düşürürsün, ne alabileceğini gösterebilir misin?
WallyWest,

2
@ Eliseod'Annunzio dizisi ile, sadece isimler ve başlık aralıkları arasında bir eşleştirme yapmak için kullanamayacağımı kastettiğini düşündüm. Bu dizi (liste) sadece gerçek isimleri saklar. Ancak bu kuralların ötesindeyse, switchbunun yerine bir ifade kullanmanın değiştirilebileceğini hayal ediyorum (maalesef birkaç ekstra karakterle). Oh ve aynı kodun yoğunlaştırılmış versiyonu eklendi. Nasıl çalıştığını değiştirerek onu biraz daha kısaltacağımı düşüneceğim.
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)

Bu, vikipe sayfasına göre büyük harf kullanır ve herhangi bir sayı için çalışmalıdır.


1
Arrr, oradaki bir işlevin akıllıca kullanılması ...
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))]

Teşekkürler @Jeen


Kafam biraz karıştığında @AsksAnyway, orada bir dize leviathan 'tha kullanımı' ne olabilir? ...
Arrr

Pusula noktalarının adlarını "hesaplar". Kod boyutunu azaltmanın bir yolu.
AsksAnyway

2

Perl 5,10, 262 257 254

Python çözümlerinden birine biraz benzer:

$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

Okunabilirlik için dört yeni satır eklendi.

Düzenleme: @Dom Hastings sayesinde üç bayt daha az


Hey @nwellnhof, oldukça kapsamlı görünüyor! Sen kaldırarak, bir kaç karakter kaydedebilirsiniz ;sonunda sub pve anahtar shiftiçin pop.
Dom Hastings

@nwellhoff Perl'in tırnak işaretleri olmadan dizeleri kabul edebileceğini bilmiyordum? (re: satır 1)
WallyWest

1
@ Eliseod'Annunzio Perl, işlev isimleri veya ayrılmış sözcüklerle çakışmazsa, katı olmayan modda tırnak işaretleri olmadan dizeleri kabul eder.
nwellnhof
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.