ที่นั่นเธอพัด!


21

Arrr ... Ahoy ฉัน maties! คลายท่อระบายน้ำของท่า! เต็มไปทางกราบขวา! อา, รู้สึกถึงลมในเส้นผมของคุณ!

ใช่ฉันได้ยิน ... ฉันต้องการทักษะเล็ก ๆ น้อย ๆ ของผู้เล่นโค! ลูกเรือของฉันเป็นคนทันสมัยกว่าตัวเอง ... ฉันยังคงเป็นเข็มทิศของจุดที่ 'ชอบ' (ดูที่นี่สำหรับข้อมูลเพิ่มเติม Arrr ... ) ในขณะที่ทีมงานของฉันมักจะเป็นหัวหน้าของ .. ฉันอยากจะเป็นวิธีที่ง่ายในการแปลงร่างเป็น twaddle พวกเขาเรียก headin ว่าเป็นสิ่งที่ฉันเข้าใจได้ Arrr!

สิ่งที่ฉันต้องการคือ 'code tha' be takin 'การป้อนตัวเลข (ทศนิยมไม่เป็นไร) tha เช่นนั้น' 0 <= the headin' < 360และมันจะ spittin 'out th' คำตอบเป็น th 'เข็มทิศที่ใกล้ที่สุด! ฮ้า!

นี่เป็นตัวอย่าง:

> heading 0.1

North

> heading 11.25

North by East

> heading 22.7

North Northeast

> heading 44.99

Northeast

> heading 91

East

ทีนี้ถ้า 'หัว' พวกเจ้าต้องเป็น givin 'จะต้องตกอยู่ในจุดกึ่งกลางของจุดเข็มทิศสองจุดอย่า' คุณเป็นคนใจร้อน 'ฉันได้ยิน ... ฉันคาดหวังว่ารหัสนั้นจะคายออกมาBetween <point 1> and <point 2>เช่นheading 5.625จะบอกว่าBetween North and North by East สิ่งนี้จะเกิดขึ้นกับ 'สำหรับ headin' tha 'เป็นสมการ' โดยH = 5.625 + 11.25(N)ที่ H เป็น 'headin' และ N เป็นจำนวนเต็มระหว่าง 0 ถึง 31 รวม ...

ข้อ จำกัด ที่สอง '...

1) ฉันไม่อยากให้คุณใช้อาร์เรย์สำหรับข้อมูลของ storin สำหรับจุดหรือ 'headin ของ ... ท่า' จะเป็น cheatin ', ท่านครับ,' เจ้าจะได้รับ 'รสชาติของฉัน blunderbuss ... นี่มี t 'ถูกคำนวณ jus' เหมือนวันที่ 'เก่า! ฮ้า!

2) รหัสที่สั้นที่สุดชนะมิฉะนั้นฉันจะเป็นผู้กำหนดเป้าหมายให้คุณเถอะ ... Arrr!


10
50 '(Apostrophe) ในคำถามเดียว ถอดหมวกออก! : D
Wasi

ใช้วัตถุในจาวาสคริปต์ที่มีการโกงปุ่มตัวเลขหรือไม่? ฉันหมายถึง yaarrr! ไม่ว่าจะเป็น cheatin ', ya landlubber?
Tim Seguine

1
นี่ควรเป็น "N เป็นจำนวนเต็มระหว่าง 0 ถึง 31 โดยรวมหรือไม่"
nwellnhof

@nwellnhof คุณพูดถูก! อัปเดต ... :)
WallyWest

1
ฉันคิดว่าคุณควรเปิดตัวรหัสกอล์ฟโดยมีเป้าหมายคือการแปลคำถามของคุณเป็นภาษาอังกฤษที่ถูกต้องตามหลักสรีระศาสตร์!
sergiol

คำตอบ:


6

Perl 5.10 โดยใช้การทดแทน, 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

เพิ่มบรรทัดใหม่สี่บรรทัดเพื่อให้สามารถอ่านได้

แก้ไข:แข็งแรงเล่นกอล์ฟอีก 2 popไบต์ใช้ ขอบคุณ @Dom Hastings

แก้ไข:ใช้น้อยกว่า 2 ไบต์qw()


22

ฉันใช้เวลาไปกับการล่าขุมทรัพย์ที่นี่มากเกินไป แต่นี่เป็นวิธีแก้ปัญหาในJava :

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

    }
}

แก้ไขถ้าฉันย่อโค้ดข้างต้นและทำให้มันน่าเกลียดจริงมันจะกลายเป็น:

Java, 770 ตัวอักษร

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 สำหรับaaarrrgs
Danko Durbić

3
ฉันแน่ใจว่าไม่ได้ช่วยฉันในกฎ "รหัสที่สั้นที่สุดชนะ" แต่เนื่องจากฉันใช้ Java ต่อไป ...
Jeen Broekstra

ฉันชื่นชมวิธีการแม้ว่าคุณจะใช้Arrays.asListคำสั่งให้อภัยฉันที่นี่สำหรับความไม่รู้ Java ของฉัน แต่นั่นไม่ได้ใช้อาร์เรย์จัดเก็บข้อมูลหรือไม่ หรือนี่เป็นวิธีลับ ๆ ล่อๆในการแนะนำอาร์เรย์ในรูปแบบของรายการหรือไม่ ;)
WallyWest

@ Jeen, คุณสามารถแสดงให้ฉันเห็นว่าคุณจะได้รับถ้าคุณรู้สึกเป็นเกียรติจริง ๆ และลดรหัสที่นั่น
WallyWest

2
@ Eliseod'Annunzio เขียนอาเรย์ฉันคิดว่าคุณหมายถึงฉันไม่สามารถใช้มันเพื่อจัดเก็บการแมประหว่างชื่อและช่วงหัวเรื่อง อาร์เรย์นี้ (รายการ) เก็บเฉพาะชื่อจริงเท่านั้น แต่ถ้ามันอยู่นอกเหนือกฎฉันคิดว่ามันอาจเปลี่ยนเป็นswitchคำสั่งแทน (ด้วยตัวอักษรพิเศษบางตัวน่าเสียดาย) โอ้และรหัสเดียวกันเพิ่มเวอร์ชันย่อ ฉันจะมีความคิดเกี่ยวกับการต่อยอดลงโดยการเปลี่ยนวิธีการทำงานจริง
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)

วิธีนี้ใช้ตัวพิมพ์ใหญ่ตามหน้าวิกิพีเดียและควรใช้กับหมายเลขใดก็ได้


1
Arrr, นั่นเป็นการใช้งานฟังก์ชั่นที่ชาญฉลาดที่นั่น ...
WallyWest

4

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

ขอบคุณ @Jeen


ฉันสับสนเล็กน้อยที่นี่ @ AsksAnyway, 'การใช้ tha' มีอะไรบ้างเลวีอาธานของสตริง? ... Arrr ...
WallyWest

มัน "คำนวณ" ชื่อของจุดเข็มทิศ เป็นวิธีลดขนาดรหัส
AsksAnyway

2

Perl 5.10, 262 257 254

ค่อนข้างคล้ายกับหนึ่งในโซลูชัน 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

เพิ่มบรรทัดใหม่สี่บรรทัดเพื่อให้สามารถอ่านได้

แก้ไข:น้อยกว่าสามไบต์ด้วย @Dom Hastings


เฮ้ @nwellnhof ดูครอบคลุมทีเดียว! คุณสามารถบันทึกตัวอักษรอีกไม่กี่เอา;ในตอนท้ายของsub pและสวิทช์ไปshift pop
Dom Hastings

@nwellhoff ฉันไม่ทราบว่า Perl สามารถยอมรับสตริงโดยไม่ต้องอยู่ในเครื่องหมายคำพูด? (อีกครั้ง: บรรทัดที่ 1)
WallyWest

1
@ Eliseod'Annunzio Perl ยอมรับสตริงโดยไม่ต้องใส่เครื่องหมายอัญประกาศในโหมดที่ไม่เข้มงวดหากไม่ขัดแย้งกับชื่อฟังก์ชันหรือคำที่สงวนไว้
nwellnhof
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.