그녀가 불면!


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.