그녀가 불면!


21

아 아아아 아아아! 메인 세일을 펼치십시오! 우현으로 가득! 아, 머리에 바람을 느껴봐!

맞아요, 저의 왕자님 ... 저는 약간의 코인 기술이 필요합니다! 나 승무원은 아직도 preferrin '일'일의 포인트 '나침반 (볼 수 ... 더 meself보다 현대화 LI'L 있습니다 여기에 ... 대한 공격, 추가 정보를 원하시면) 나 승무원은 항상저기서 동안'은 headin '을 .. 나는이 트위들을 그들이 이해할 수있는 것으로 바꾸는 쉬운 방법을 원합니다.

내가 필요로하는 것은 코드와 같은 숫자를 입력하는 것입니다 (십진수는 괜찮습니다) 0 <= the headin' < 360그리고 가장 가까운 나침반 포인트로 대답을 뱉어냅니다! 아아!

다음은 몇 가지 예입니다.

> heading 0.1

North

> heading 11.25

North by East

> heading 22.7

North Northeast

> heading 44.99

Northeast

> heading 91

East

자, '두려운 마음이 있다면, 두 나침반 점의 중간에 정확하게 떨어지도록, 예쁘게 내 마음에 들지 마라. Between <point 1> and <point 2>예를 heading 5.625말할 것이다 Between North and North by East 이것은 단지 '위한 headin'나온다 될 그쪽 식 'satisfyin 수' H = 5.625 + 11.25(N)H는 '번째 headin'하고 N은 0에서 31까지의 정수가 될 ...

두 가지 제한 사항 ...

1) 나는 당신이 요점이나 머리글에 대한 데이터를 저장하기 위해 배열을 사용하고 싶지 않습니다. 예전처럼 계산됩니다! 아아!

2) 가장 짧은 코드가이기거나 판자를 걷게 될 것입니다 ... Arrr!


10
'단일 질문에서 50 (아포스트로피). 오프 모자! : D
Wasi

숫자 키를 사용하여 Javascript에서 객체를 사용하고 있습니까? yaarrr을 의미합니다! 이게 질식 일까?
Tim Seguine

1
"N은 0에서 31 사이의 정수"가 아니어야합니까?
nwellnhof

@nwellnhof 당신이 맞아요! 업데이트 됨 : :)
WallyWest

1
질문을 직교 적으로 올바른 영어로 번역하는 것이 목표 인 코드 골프를 시작해야한다고 생각합니다.
sergiol

답변:


6

교체를 사용하여 펄 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

가독성을 위해 4 개의 줄 바꿈이 추가되었습니다.

편집 :을 사용하여 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)));

    }
}

편집 나는 위의 코드를 최소화하고 진짜 못생긴는이 될 것이라고 한 경우 :

자바, 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
–1aaarrrgs
Danko Durbić

3
"가장 짧은 코드 승"규칙에 도움이되지는 않았지만 어쨌든 Java를 사용하고 있기 때문에 ...
Jeen Broekstra

나는 당신이 Arrays.asList명령을 사용하고 있지만 Java 무지에 대해 나를 용서하지만 스토리지 배열을 사용하지 않습니까? 아니면 이것이 목록 형태로 배열을 소개하는 비열한 방법입니까? ;)
WallyWest

@Jeen, 만약 당신이 정말로 다운을해서 코드를 줄이면 얻을 수있는 것을 보여줄 수 있습니까?
WallyWest

2
@ Eliseod'Annunzio는 배열을 사용하여 이름과 제목 간격 사이의 매핑을 저장하는 데 사용할 수 없다는 것을 의미한다고 생각했습니다. 이 배열 (목록)은 실제 이름 만 저장합니다. 그러나 그것이 규칙을 벗어나면, switch대신 불행히도 몇 개의 추가 문자 를 사용하여 명령문 을 사용하도록 변경할 수 있다고 생각합니다 . 아, 같은 코드의 압축 버전이 추가되었습니다. 실제로 작동 방식을 변경하여 더 혼란스럽게 생각할 것입니다.
Jeen Broekstra

6

파이썬, 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

아하 파이썬, 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에서 약간 혼란 스럽습니다. 문자열을 사용하는 것이 무엇입니까? ... Arrr ...
WallyWest

나침반 점의 이름을 "계산"합니다. 코드 크기를 줄이는 방법입니다.
AsksAnyway

2

펄 5.10, 262 257 254

파이썬 솔루션 중 하나와 비슷합니다.

$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

가독성을 위해 4 개의 줄 바꿈이 추가되었습니다.

편집 : @Dom Hastings 덕분에 3 바이트 감소


안녕하세요 @nwellnhof, 매우 포괄적으로 보입니다! ;끝 부분 에서을 제거하고 로 sub p전환 shift하여 문자를 몇 개 더 저장할 수 있습니다 pop.
Dom Hastings

@nwellhoff 나는 Perl이 따옴표로 묶지 않고 문자열을 받아 들일 수 있다는 것을 몰랐다. (re : line 1)
WallyWest

1
@ Eliseod'Annunzio Perl은 함수 이름이나 예약어와 충돌하지 않으면 엄격하지 않은 모드에서 따옴표없이 문자열을 허용합니다.
nwellnhof
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.