Тхар вона дме!


21

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

Правильно, мої сердечки ... Мені потрібно трохи навичок кодирування! Мені екіпаж - це більш модернізований, ніж я сам ... Я все ще віддаю перевагу "точок" компаса (див. Тут для отримання додаткової інформації, 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 Це може бути лише для головного "tha" бути задоволенням рівняння, H = 5.625 + 11.25(N)де H бути th "headin", а N - ціле число від 0 до 31 включно ...

Два обмеження через ...

1) Мені не хочеться використовувати масиви для зберігання своїх даних для точок або голівки ... Та "будьте обманщики", сер, "ви отримуєте" смак мене дурних шин ... Це має t "обчислюйся, jus" як і "старі дні! Arrr!

2) Найкоротший код виграє, інакше я зроблю дошку ... Вир!


10
50 '(Апостроф) в одному запитанні. Знімаю капелюх! : D
Васі

Чи використовується об’єкт у javascript із читуванням цифрових клавіш? Я маю на увазі yaarrr! будь це обман, я земляка?
Тім Сегуїн

1
Чи не повинно це бути "N бути цілим числом від 0 до 31 включно"?
nwellnhof

@nwellnhof Ви маєте рацію! Оновлено ... :)
WallyWest

1
Я думаю, вам слід запустити гольф з кодом, де мета - перекласти своє питання на ортографічно правильну англійську!
серхіол

Відповіді:


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

Додано чотири нових рядки для читабельності.

Редагувати: Використовується ще 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)));

    }
}

редагувати Якщо я мінімізую вищезазначений код і роблю його по-справжньому потворним, це стане таким:

Ява, 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 ...
Jeen Broekstra

Я захоплююсь підходом, хоча ви використовуєте Arrays.asListкоманду, вибачте мене за моє незнання Java, але чи не це використовується масив пам’яті? Або це підлий спосіб введення масиву у вигляді списку? ;)
WallyWest

@ Джин, чи можеш ти показати мені, що ти можеш отримати, якщо ти справді збиваєшся та зменшиш код?
WallyWest

2
@ Eliseod'Annunzio wrt масив, я подумав, що ти маєш на увазі лише те, що я не можу використовувати його для зберігання відображення між іменами та інтервалами заголовків. Цей масив (список) зберігає лише фактичні імена. Але якщо це виходить за рамки правил, я думаю, що це може бути змінено, щоб використовувати 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

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.