Thar cô thổi!


21

Arrr ... Ahoy đó, tôi maties! Unurl tha 'mainsail! Đầy đủ đến mạn phải! Ah, cảm thấy gió trong tóc!

Phải, tôi thật lòng ... Tôi cần một chút kỹ năng của người viết mã! Phi hành đoàn của tôi là một người hiện đại hơn so với chính mình ... Tôi vẫn thích các điểm của la bàn (xem ở đây để biết thêm thông tin, Arrr ...) trong khi phi hành đoàn của tôi luôn sử dụng 'đầu tàu' .. Tôi muốn 'một cách dễ dàng để chuyển đổi' cái dây quấn này họ gọi là một cái đầu 'thành những gì tôi có thể hiểu được, Arrr!

Điều tôi cần là 'mã tha' là đầu vào của một số (số thập phân không sao) như vậy ' 0 <= the headin' < 360và nó được đưa ra câu trả lời như là điểm la bàn gần nhất! Arrr!

Dưới đây là một số ví dụ:

> heading 0.1

North

> heading 11.25

North by East

> heading 22.7

North Northeast

> heading 44.99

Northeast

> heading 91

East

Bây giờ, nếu 'headin' ye be givin 'hãy để nó rơi chính xác vào giữa' hai điểm la bàn, đừng 'băn khoăn', tôi xin lỗi ... Tôi đang mong chờ mã này sẽ nhổ ra Between <point 1> and <point 2>, ví dụ như heading 5.625sẽ nói Between North and North by East Điều này chỉ xảy ra trong một tiêu đề 'tha' được thỏa mãn 'phương trình H = 5.625 + 11.25(N)trong đó H là th' headin 'và N là một số nguyên nằm trong khoảng từ 0 đến 31 ...

Hai hạn chế tho '...

1) Tôi không muốn sử dụng các mảng để lưu trữ dữ liệu của mình cho các điểm hoặc 'đầu của họ ... Tha' hãy lừa dối ', thưa ngài, một' anh em sẽ nhận được 'một hương vị của tôi blunderbuss ... t 'được tính, jus' như th 'ngày xưa! Arrr!

2) Mã ngắn nhất sẽ thắng, hoặc tôi sẽ là makin 'ye walk th' plank ... Arrr!


10
50 '(Apostrophe) trong một câu hỏi duy nhất. Ngả mũ! : D
Wasi

Là sử dụng một đối tượng trong javascript với các phím số gian lận? Ý tôi là yaarrr! có phải là gian lận ', ya địa chủ?
Tim Seguine

1
Đây có phải là "N là một số nguyên nằm trong khoảng từ 0 đến 31" không?
nwellnhof

@nwellnhof Bạn nói đúng! Đã cập nhật ... :)
WallyWest

1
Tôi nghĩ bạn nên khởi động một mã golf trong đó mục tiêu là dịch câu hỏi của bạn sang tiếng Anh chính xác!
sergiol

Câu trả lời:


6

Perl 5.10 sử dụng thay thế, 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

Bốn dòng mới được thêm vào để dễ đọc.

Chỉnh sửa: Chơi thêm 2 byte bằng cách sử dụng pop. Cảm ơn @Dom Hastings

Chỉnh sửa: sử dụng ít hơn 2 byteqw()


22

Tôi đang dành quá nhiều thời gian cho việc săn tìm kho báu ở đây, nhưng đây là một giải pháp trong 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)));

    }
}

chỉnh sửa Nếu tôi giảm thiểu mã trên và làm cho nó thực sự xấu, nó sẽ trở thành thế này:

Java, 770 ký tự

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 choaaarrrgs
Danko Durbić

3
Tôi chắc chắn rằng điều đó đã không giúp tôi về quy tắc "chiến thắng mã ngắn nhất", nhưng vì dù sao tôi cũng đang sử dụng Java ...
Jeen Broekstra

Tôi ngưỡng mộ cách tiếp cận, mặc dù bạn đang sử dụng Arrays.asListlệnh, tha thứ cho tôi ở đây vì sự thiếu hiểu biết về Java của tôi, nhưng đó không phải là sử dụng một mảng lưu trữ sao? Hay đây là một cách lén lút giới thiệu mảng dưới dạng danh sách? ;)
WallyWest

@Jeen, bạn có thể chỉ cho tôi xem bạn có thể nhận được nếu bạn thực sự hạ thấp và giảm mã 'ở đó không?
WallyWest

2
@ Eliseod'Annunzio viết lại mảng, tôi nghĩ bạn chỉ có nghĩa là tôi không thể sử dụng nó để lưu trữ ánh xạ giữa các tên và khoảng tiêu đề. Mảng này (danh sách) chỉ lưu trữ tên thực tế. Nhưng nếu điều đó nằm ngoài quy tắc, tôi tưởng tượng nó có thể được thay đổi để sử dụng một switchcâu lệnh thay thế (không may có thêm một vài ký tự). Oh và phiên bản cô đọng của cùng một mã được thêm vào. Tôi sẽ suy nghĩ về việc giảm bớt nó bằng cách thực sự thay đổi cách thức hoạt động của nó.
Jeen Broekstra

6

Con trăn, 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)

Điều này sử dụng viết hoa theo trang wikipedia và sẽ hoạt động cho bất kỳ số nào.


1
Arrr, đó là một cách sử dụng thông minh của một chức năng ở đó ...
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))]

Cảm ơn @Jeen


Tôi có một chút bối rối ở đây @AsksAnyway, cái gì là 'sử dụng tha' có leviathan của một chuỗi? ... Arrr ...
WallyWest

Nó "tính toán" tên của các điểm la bàn. Đó là một cách để giảm kích thước mã.
AsksAnyway

2

Perl 5.10, 262 257 254

Khá giống với một trong những giải pháp 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

Bốn dòng mới được thêm vào để dễ đọc.

Chỉnh sửa: Ít hơn ba byte nhờ @Dom Hastings


Này @nwellnhof, Trông khá toàn diện! Bạn có thể lưu thêm một vài ký tự, loại bỏ ;phần cuối sub pvà chuyển shiftsang pop.
Dom Hastings

@nwellhoff Tôi không biết Perl có thể chấp nhận chuỗi mà không có dấu ngoặc kép không? (re: dòng 1)
WallyWest

1
@ Eliseod'Annunzio Perl chấp nhận chuỗi không có dấu ngoặc kép ở chế độ không nghiêm ngặt nếu chúng không xung đột với tên hàm hoặc từ dành riêng.
nwellnhof
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.