Thar lei soffia!


21

Arrr ... Ahoy, amici! Svolgi la randa! Pieno a dritta! Ah, senti il ​​vento tra i tuoi capelli!

Bene, amici, ho bisogno di un po 'delle tue abilità di codifica! Il mio equipaggio è un po 'più modernizzato di me stesso ... Continuo a preferire i punti della bussola (vedi qui per maggiori informazioni, Arrr ...) mentre il mio equipaggio è sempre in testa. Sto cercando un modo semplice per convertire questo twaddle che chiamano headin 'in quello che posso capire, Arrr!

Ciò di cui ho bisogno è il codice che deve essere inserito in un numero (i decimali vanno bene) tale 0 <= the headin' < 360e che sputa la risposta come il punto più vicino alla bussola! Arrr!

Ecco alcuni esempi:

> heading 0.1

North

> heading 11.25

North by East

> heading 22.7

North Northeast

> heading 44.99

Northeast

> heading 91

East

Ora, se in testa stai dando in modo tale che cada esattamente nel mezzo di due punti cardinali, non agitarti, io cordiale ... mi aspetto che il codice sputi Between <point 1> and <point 2>, ad esempio heading 5.625, dirà che Between North and North by East ciò accade solo per un headin 'che deve soddisfare l'equazione in H = 5.625 + 11.25(N)cui H è il' headin 'e N è un numero intero compreso tra 0 e 31 compresi ...

Due restrizioni anche se ...

1) Non voglio che tu usi array per archiviare i tuoi dati per i punti o l'headin's ... Dovresti barare, signore, e avrai un assaggio del mio errore ... Questo ha essere calcolati, proprio come ai vecchi tempi! Arrr!

2) Il codice più corto vince, o ti farò camminare sulla tavola ... Arrr!


10
50 '(apostrofo) in una sola domanda. Giù i cappelli! : D
Wasi,

L'uso di un oggetto in JavaScript con i tasti numerici tradisce? Intendo yaarrr! sia un imbroglione, padrone di casa?
Tim Seguine,

1
Non dovrebbe essere "N un numero intero compreso tra 0 e 31 inclusi"?
nwellnhof,

@nwellnhof Hai ragione! Aggiornato ... :)
WallyWest

1
Penso che dovresti lanciare un codice golf in cui l'obiettivo è tradurre la tua domanda in inglese ortogonalmente corretto!
sergiol

Risposte:


6

Perl 5.10 con sostituzione, 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

Quattro nuove righe aggiunte per la leggibilità.

Modifica: Golfato altri 2 byte usando pop. Grazie @Dom Hastings

Modifica: 2 byte in meno utilizzandoqw()


22

Trascorro troppo tempo in questa caccia al tesoro, ma ecco una soluzione in 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)));

    }
}

modifica Se minimizzo il codice sopra e lo faccio diventare davvero brutto diventerebbe questo:

Java, 770 caratteri

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 peraaarrrgs
Danko Durbić il

3
Sono sicuro che non mi ha aiutato con la regola "vince il codice più corto", ma dato che sto usando Java comunque ...
Jeen Broekstra,

Ammiro l'approccio, anche se stai usando il Arrays.asListcomando, scusami qui per la mia ignoranza di Java, ma non è quello utilizzando un array di archiviazione? O è un modo subdolo per introdurre l'array sotto forma di un elenco? ;)
WallyWest

@Giovanni, puoi mostrarmi cosa potresti ottenere se suonassi davvero il clacson e riducessi il codice lì?
WallyWest,

2
@Eliseod'Annunzio ha scritto l'array, pensavo intendessi solo che non potevo usarlo per memorizzare una mappatura tra nomi e intervalli di intestazione. Questo array (elenco) memorizza solo i nomi effettivi. Ma se questo va oltre le regole, immagino che potrebbe essere cambiato per usare switchinvece un'istruzione (con alcuni caratteri extra, sfortunatamente). Oh e versione ridotta dello stesso codice aggiunto. Ci penserò su come ridurlo ulteriormente cambiando effettivamente il modo in cui funziona.
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)

Questo utilizza le maiuscole come nella pagina di Wikipedia e dovrebbe funzionare per qualsiasi numero.


1
Arrr, sarebbe un uso intelligente di una funzione lì ...
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))]

Grazie @Giovanni


Sono un po 'confuso qui @AsksAnyway, a che serve laggiù una stringa? ... Arrr ...
WallyWest,

"Calcola" i nomi dei punti cardinali. È un modo per ridurre la dimensione del codice.
Chiede comunque il

2

Perl 5.10, 262 257 254

Un po 'simile a una delle soluzioni 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

Quattro nuove righe aggiunte per la leggibilità.

Modifica: tre byte in meno grazie a @Dom Hastings


Ehi @nwellnhof, sembra abbastanza completo! È possibile salvare alcuni altri caratteri, rimuovendo ;alla fine di sub pe passare shifta pop.
Dom Hastings,

@nwellhoff Non sapevo che Perl potesse accettare le stringhe senza che fossero tra virgolette? (ri: linea 1)
WallyWest

1
@ Eliseod'Annunzio Perl accetta stringhe senza virgolette in modalità non rigorosa se non si scontrano con nomi di funzioni o parole riservate.
nwellnhof,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.