Thar ela sopra!


21

Arrr ... Ahoy, me maties! Abra a vela grande! Cheio a estibordo! Ah, sinta o vento em seus cabelos!

Certo, meu coração ... Estou precisando de um pouco de suas habilidades em codin! Minha equipe é um pouco mais modernizada do que eu ... Eu ainda prefiro os pontos da bússola (veja aqui para mais informações, Arrr ...), enquanto minha equipe está sempre usando a cabeça .. Eu quero uma maneira fácil de converter essa dupla que eles chamam de cabeça no que eu sou capaz de entender, Arrr!

O que eu preciso é de um código que esteja recebendo a entrada de um número (decimais são aceitáveis), tal que seja 0 <= the headin' < 360e cuspi a resposta como o ponto mais próximo da bússola! Arrr!

Aqui estão alguns exemplos:

> heading 0.1

North

> heading 11.25

North by East

> heading 22.7

North Northeast

> heading 44.99

Northeast

> heading 91

East

Agora, se você está dando de tal maneira que caia exatamente no meio de dois pontos da bússola, não fique preocupada, meu coração ... Eu estou esperando que o código cuspa Between <point 1> and <point 2>, por exemplo heading 5.625, dirá que Between North and North by East isso só está acontecendo para um cabeçalho que satisfaça a equação em H = 5.625 + 11.25(N)que H seja o cabeçalho e N seja um número inteiro entre 0 e 31, inclusive ...

Duas restrições ...

1) Eu não quero que você use matrizes para armazenar seus dados para os pontos ou cabeçalhos ... Isso está enganando, senhor, e você está sentindo um gostinho de mim trapaceiro ... Isso tem Seja calculado, apenas como nos velhos tempos! Arrr!

2) O código mais curto vence, ou eu vou fazer você andar na prancha ... Arrr!


10
50 '(apóstrofo) em uma única pergunta. Tiremos o chapéu! : D
Wasi

Está usando um objeto em javascript com teclas numéricas trapaceando? Quero dizer yaarrr! seja trapaceiro, ya landlubber?
Tim Seguine

11
Não deveria ser "N um número inteiro entre 0 e 31 inclusive"?
Nwellnhof

@nwellnhof Você está certo! Atualizado ... :)
WallyWest

11
Eu acho que você deve lançar um código de golfe em que o objetivo é traduzir sua pergunta para o inglês ortograficamente correto!
sergiol 4/17

Respostas:


6

Perl 5.10 usando substituição, 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

Quatro novas linhas adicionadas para facilitar a leitura.

Edit: Golfed mais 2 bytes usando pop. Obrigado @Dom Hastings

Editar: 2 bytes a menos usandoqw()


22

Eu estou gastando muito tempo nessa caça ao tesouro aqui, mas aqui está uma solução em 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)));

    }
}

edit Se eu minimizar o código acima e torná-lo realmente feio, ele se tornará o seguinte:

Java, 770 caracteres

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

3
Tenho certeza de que não me ajudou na regra "mais curtos vitórias de código", mas desde que eu estou usando Java de qualquer maneira ...
Jeen Broekstra

Admiro a abordagem, embora você esteja usando o Arrays.asListcomando, me perdoe aqui pela minha ignorância em Java, mas isso não é usar uma matriz de armazenamento? Ou essa é uma maneira sorrateira de introduzir a matriz na forma de uma lista? ;)
WallyWest

@Jeen, você pode me mostrar o que conseguiria se realmente se acalmasse e reduzisse o código lá?
Wally West

2
@ Eliseod'Annunzio escreveu a matriz, pensei que você queria apenas dizer que não poderia usá-la para armazenar um mapeamento entre nomes e intervalos de cabeçalho. Essa matriz (lista) armazena apenas os nomes reais. Mas se isso estiver além das regras, imagino que poderia ser alterado para usar uma switchdeclaração (com alguns caracteres extras, infelizmente). Ah e versão condensada do mesmo código adicionado. Vou pensar em diminuir ainda mais a situação, alterando realmente como funciona.
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)

Isso usa letras maiúsculas de acordo com a página da Wikipedia e deve funcionar para qualquer número.


11
Arrr, que ser um uso inteligente de uma função lá ...
Wally West

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

Obrigado @Jeen


Fico um pouco confuso aqui @AsksAnyway, qual é a utilidade de uma seqüência de caracteres? ... Arrr ...
WallyWest

Ele "calcula" os nomes dos pontos da bússola. É uma maneira de reduzir o tamanho do código.
AsksAnyway

2

Perl 5,10, 262 257 254

Um pouco semelhante a uma das soluções 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

Quatro novas linhas adicionadas para facilitar a leitura.

Edit: Três bytes a menos, graças a @Dom Hastings


Hey @nwellnhof, parece bastante abrangente! Você pode salvar mais alguns caracteres, removendo ;o final sub pe alternando shiftpara pop.
Dom Hastings

@nwellhoff Eu não sabia que Perl podia aceitar strings sem eles estarem entre aspas? (re: linha 1)
WallyWest

11
@ Eliseod'Annunzio Perl aceita strings sem aspas no modo não estrito, se não colidirem com nomes de funções ou palavras reservadas.
Nwellnhof
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.