Тар она дует!


21

Arrr ... Привет, мне, маменьки! Разверните грот! Полный на правый борт! Ах, почувствуй ветер в своих волосах!

Да, мои сердечные ... Мне нужно немного твоих навыков! Моя команда гораздо более модернизирована, чем я сам ... Я все еще предпочитаю "точки" компаса (см. Здесь для получения дополнительной информации, Arrr ...), в то время как моя команда всегда использует головную боль .. Я бы хотел легкий способ превратить эту болтовню, которую они называют хедин, в то, что я смогу понять, Аррр!

То, что мне нужно, - это код, который «вводит» ввод числа (десятичные дроби в порядке), такого как «», 0 <= the headin' < 360и он должен выплевывать «ответ» как ближайшую точку компаса! Arrr!

Вот несколько примеров:

> 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 это произойдет только для заголовка, который удовлетворяет уравнению, H = 5.625 + 11.25(N)где H - это заголовок, а N - целое число от 0 до 31 включительно ...

Два ограничения ...

1) Я не хочу, чтобы вы использовали массивы для хранения ваших данных для очков или для хедин ... «Будь обманщиком», сэр, и вы почувствуете вкус моей промахи ... Это не рассчитывайся, как в старые добрые времена! Arrr!

2) Самый короткий код выигрывает, или я буду делать то, что ты идешь ... План!


10
50 '(Апостроф) в одном вопросе. Снимаю шляпу : D
Васи

Обманывает ли использование объекта в javascript с цифровыми клавишами? Я имею в виду yaarrr! быть обманщиком, ты ландлубер?
Тим Сегин

1
Разве это не должно быть «N - целое число от 0 до 31 включительно»?
nwellnhof

@nwellnhof Ты прав! Обновлено ... :)
WallyWest

1
Я думаю, что вы должны запустить Code Golf, где цель состоит в том, чтобы перевести ваш вопрос на орфографически правильный английский!
sergiol

Ответы:


6

Perl 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

Четыре новых строки добавлены для удобства чтения.

Изменить: Golfed еще 2 байта, используя pop. Спасибо @Dom Гастингс

Изменить: на 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)));

    }
}

edit Если я уменьшу приведенный выше код и сделаю его по-настоящему уродливым, это станет так:

Java, 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
+1 заaaarrrgs
Данко Дурбич

3
Я уверен, что это не помогло мне с правилом «кратчайшего кода выигрывает», но так как я все равно использую Java ...
Джин Брукстра

Я восхищаюсь подходом, хотя вы используете Arrays.asListкоманду, простите меня за мое незнание Java, но разве это не использование массива хранения? Или это хитрый способ представить массив в виде списка? ;)
WallyWest

@Jeen, вы можете показать мне, что вы могли бы получить, если бы вы действительно гудели и сократили там код?
WallyWest

2
@ Eliseod'Annunzio по массиву, я думал, что вы только хотели сказать, что я не могу использовать его для хранения отображения между именами и интервалами заголовков. Этот массив (список) хранит только фактические имена. Но если это выходит за рамки правил, я думаю, что switchвместо этого можно было бы использовать оператор (с несколькими дополнительными символами, к сожалению). Ох и сокращенная версия того же кода добавлена. Я подумаю о дальнейшем сокращении, фактически изменив его работу.
Джин Брокстра

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

Perl 5.10, 262 257 254

Несколько похоже на одно из решений 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

Четыре новых строки добавлены для удобства чтения.

Изменить: на три байта меньше благодаря @Dom Hastings


Эй, @nwellnhof, выглядит довольно всеобъемлющим! Вы можете сохранить еще несколько символов, удалив ;в конце sub pи переключиться shiftна pop.
Дом Гастингс

@nwellhoff Я не знал, что Perl может принимать строки без кавычек? (re: строка 1)
WallyWest

1
@ Eliseod'Annunzio Perl принимает строки без кавычек в нестрогом режиме, если они не конфликтуют с именами функций или зарезервированными словами.
nwellnhof
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.