Dereceleri pusulanın 32 noktasından birine dönüştürün


13

32 noktalı pusula, en azından söylemek gerekirse ilginçtir.

görüntü

Denelson83 (Kendi çalışması) [ GFDL veya CC-BY-SA-3.0 ], Wikimedia Commons aracılığıyla

Zorluğunuz derece ölçüsü almak ve bunu 32 noktalı pusula üzerinde bir yöne dönüştürmektir.

Her yön öncekinden 11,25 (360/32) derecedir. Örneğin, N (kuzey) 0 derece, NbE (kuzey doğu) 11.25 derece, NNE (kuzey-kuzeydoğu) 22.5 derecedir, vb.

Yol tariflerini nasıl alacağınıza gelince,

  • 0 derece N, 90 derece E, 180 derece S ve 270 derece W'dir.

    • Bunlara kardinal yönler denir.
  • Kardinal yönler arasındaki yarı noktalar basitçe birleştirilmiş arasındaki kardinal yönlerdir. N veya S her zaman önce gelir ve W veya E her zaman ikinci olur.

    • Bunlara sıralı yönler denir.
  • Kardinal ve ordinal yönler arasındaki yarım noktalar, aralarında bir "-" işareti olacak şekilde, bir araya getirildikleri yönlerdir. Önce kardinal yönler, ikinci sırada.

    • Bunlara ikincil-kartlar arası yönler denir.
  • İkincil-kartlar arası yönler ve diğer yönler arasındaki yarım noktalar, en yakın oldukları kardinal yönün (tabii ki doğrudan yanlarındakiler hariç) diğer yönleridir.

    • Bunlara ne denildiği hakkında hiçbir fikrim yok: P

Tüm bu açıklama beyninizi benim kadar incitirse, bu tabloya başvurabilirsiniz:

1   North               N
2   North by east       NbE
3   North-northeast     NNE
4   Northeast by north  NEbN
5   Northeast           NE
6   Northeast by east   NEbE
7   East-northeast      ENE
8   East by north       EbN
9   East                E
10  East by south       EbS
11  East-southeast      ESE
12  Southeast by east   SEbE
13  Southeast           SE
14  Southeast by south  SEbS
15  South-southeast     SSE
16  South by east       SbE
17  South               S
18  South by west       SbW
19  South-southwest     SSW
20  Southwest by south  SWbS
21  Southwest           SW
22  Southwest by west   SWbW
23  West-southwest      WSW
24  West by south       WbS
25  West                W
26  West by north       WbN
27  West-northwest      WNW
28  Northwest by west   NWbW
29  Northwest           NW
30  Northwest by north  NWbN
31  North-northwest     NNW
32  North by west       NbW

İşte daha ayrıntılı bir grafik ve pusulanın noktalarının muhtemelen daha iyi açıklaması.

Zorluğunuz derece cinsinden girdi almak ve kısaltmasıyla karşılık gelen pusula yönünün tam adını çıkarmaktır.

Test senaryoları:

Input  Output
0      North N
23.97  North-northeast NNE
33.7   Northeast by north NEbN
73.12  East-northeast ENE
73.13  East by north EbN
219    Southwest by south SWbS
275    West W
276    West by north WbN
287    West-northwest WNW

Test durumlarında olduğu gibi, tüm büyük harf kullanımı korunmalıdır. En fazla ondalık basamak sayısı 2'dir. Tüm giriş sayıları 0'dan büyük veya ona eşit ve 360'tan küçük olacaktır. Ondalık basamak varsa, her iki tarafta da rakamlar olacaktır ( .1veya işlemek zorunda değilsiniz 1.).

Bu , bu nedenle bayttaki en kısa kod kazanır.


@WallyWest Hmm, bu dizilere izin verir, farklı büyük harf kullanımı vardır ve "arasında" yoktur, ama bunu fark etmedim (muhtemelen ... ilginç başlık nedeniyle: P). Yeterince farklı kılmak için neler yapabileceğimi göreceğim ...
Kapı tokmağı

3
@WallyWest Burada, kısaltmanın da çıktısını almalısınız. Diğer tüm farklılıklarla birlikte, bu bir dup olmayan yapmak için yeterli olmalıdır. (oh, ayrıca bu çizgi de var)
Kapı Tokmağı

@WallyWest Önceki sorunuza "R" de yanıt yok ("C" de bile yoktu!) Bu sefer biraz göreceğimizi umuyoruz, gemi arkadaşları!
Level River St

-360 ila 360 derece (negatif saat yönünün tersine anlamına gelir) ve bir bonus olsaydı daha eğlenceli olurdu !.
Mukul Kumar

Zorluk arayan insanlar için kolay çözüm, bir arama tablosu açısı <-> adı kullanarak, giriş açısından mesafenin minimum olduğu olası çıktıları bulmaktır.
Rivenfall

Yanıtlar:


4

Perl, 250 236 231 188 187

Düzenleme: Simetri istismar bazı bayt (@bazzargh çözümde gördüğüm gibi)

+ Edit: Ve bazı kötü hileler ...

+ Düzenle : Başladığım yere geri dön (listeyle çalışıyor, dize değil) ve daha fazla simetri = 1 bayt kapalı ve çok daha çirkin.

$_=((@_=(1,@_=qw(1b3 1-13 13b1 13 13b3 3-13 3b1),3,map{y/1/2/r}reverse@_)),map{y/312/421/r}@_)[int<>/11.25+.5];print ucfirst s/\w/(' by ',north,south,east,west)[$&]/ger,' ',y/1-4-/NSEW/dr

Oldukça baskılı:

$_=(
    (@_=
        (
            1,
            @_=qw(1b3 1-13 13b1 13 13b3 3-13 3b1),
            3,
            map{y/1/2/r}reverse@_
        )
    ),map{y/312/421/r}@_
)[int<>/11.25+.5];

print ucfirst s/\w/(' by ',north,south,east,west)[$&]/ger,' ',y/1-4-/NSEW/dr

rDeğiştirici nedeniyle 5.014 gerekir .


Kodunuzda bir yazım hatası var: ekşi güney olmalıdır ( s / b /
RononDex

Bu ilk 3 normal ifadeyi y / NS / SN /; 10 karakter için
bazzargh

@bazzargh, evet ve sadece bu değil ;-)
user2846289

6

JavaScript 470 453 438 434 432 421 404

s=String;s.prototype.a=s.prototype.replace;var a=prompt()/11.25,a=a+0.5|0,b,k,c=a,d=c%8,c=c/8|0,e=["north","east","south","west"],f,g,h;f=e[c];g=e[(c+1)%4];h=f==e[0]|f==e[2]?f+g:g+f;b="1;1 by 2;1-C;C by 1;C;C by 2;2-C;2 by 1".split(";")[d].a(1,f).a(2,g).a("C",h);k=b.a(/north/g,"N").a(/east/g,"E").a(/south/g,"S").a(/west/g,"W").a(/by/g,"b").a(/[\s-]/g,"");b=b[0].toUpperCase()+b.slice(1);alert(b+" "+k)

Bu kodu konsolunuza kopyalayıp yürütebilirsiniz. Derece girmenizi ister ve sonucualert();

Ungolfed Javascript şu adreste bulunabilir: http://jsfiddle.net/AezL3/11


+1 Güzel ama dikkatli olun: "Test senaryolarında olduğu gibi tüm büyük harflerin korunması gerekir."

@BenH Kapitalizasyon kontrolünde hangi test durumu başarısız oluyor? Bunun için teşekkürler, btw. Bu yazdığım web arayüzü için kullanışlı geldi.
Steven Lu

Bu arada, bu 355 derece ile 360 ​​derece arasında ölüyor. Düzeltme kolaydır. Sadece calcPoint(32)0'ın yaptığı şeyi yapın, böylece bunu %32veya benzerlerini yapabilirsiniz.
Steven Lu

@StevenLu Ne demek istediğini anlamam biraz zaman aldı, ama bu çizgi var name = calcPoint(input % 32);hile yapıyor
Orwellophile

4

Haskell 415 372 347 330 317 304 301C

@ VadimR'ler (ve simetri geri döndü!) Kullanım: h 219çıkışları"Southwest by south SWbS"

d"N"="north"
d"S"="south"
d"E"="east"
d"W"="west"
d"b"=" by "
d"-"="-"
d(x:y)=d[x]++d y
e(x:y)=x:tail(d$x:y)
k 'N'='S'
k 'S'='N'
k 'E'='W'
k x=x
r="N NbE N-NE NEbN NE NEbE E-NE EbN E EbS E-SE SEbE SE SEbS S-SE SbE "
p=words$r++(map k r)
g x=p!!mod(round$x/11.25)32
h x=e(g x)++(filter(/='-')$' ':g x)

3 karakter daha gitti, teşekkürler @shiona.


drop 1kuyruk ile aynıdır. Ayrıca yanılmıyorsam e l@(x:_)=x:tail$d lhala bir tane daha tıraş etmek için yapabilirsiniz .
shiona

Bunu özlediğime inanamıyorum. Teşekkürler!
bazzargh

0

Python 3.8 , 482 438 424 bayt

lambda h:' '.join([b(h),a(a(a(b(h)),1),d={' by ':'b','-':''})])
L=str.lower
c={'North':'N','East':'E','South':'S','West':'W'}
a=lambda t,l=0,d=c:[*(t:=t.replace([i,L(i)][l],d[i])for i in[*d])][-1]
b=lambda h,k=[*c]:a('W|W by x|W-z|Z by w|Z|Z by x|X-z|X by w'.split('|')[int((q:=h*4/45+.5)%8)],d={'W':(W:=[*k][(v:=int(q//8)%4)]),'X':(X:=[*k][(v+1)%4]),'w':(w:=L(W)),'x':(x:=L(X)),'Z':(Z:=[W+x,X+w][W in'EastWest']),'z':L(Z)})

Çevrimiçi deneyin!

Tony Goodwin'in cevabının bazı golf oynadıktan sonra aldım ; TIO bağlantısının bir yorum için çok uzun olması nedeniyle kendi cevabında yayınladı. Eğer cevabını yukarıdakilere güncellemeyi seçerse, bu cevabı sileceğim.

Tam bir program yerine bir işlevi bir çözüm olarak göndermenin kabul edilebilir olduğunu varsayıyorum. Değilse, burada 426 bayt tam bir programdır.

Kısaltmak için hala çok şey yapılabilir b.

Düzenleme: Görkemli deniz aygırı 44 bayt kapalı golf. Hala bgolf ediliyor gibi hissetmiyorum.

Edit2:keys() ve yerine kullanmak yerine dikleri açarak başka bir 14 tıraş items().


-1

Python, 2103 1647 1103 1034 924 889 848 bayt

Çok geç, biliyorum. Meydan okuma için teşekkürler, Pi ile rüzgar yönü için bir manyetometre kuruyorum ve hava tahmini algoritmalarına beslemek için bunun gibi 16 pusula çözümü istedim. Tüm kodum Python'da, bu yüzden zaten Python'da yayınlanan javascript çözümünün sürümü, ancak j değişkeninin 32, 16 veya 8 noktasını belirtebileceğiniz ekstra bir bükülme ile ofseti değiştirdim nokta sayısına bağlı olarak, ondan önceki ifadede degHead. Sorunun vaka gereksinimlerini karşıladığımdan emin olmak için değiştirilmiş bir yeniden adlandırma alogoritması kullandım (ve kelimeleri bozmadan yeniden adlandırabileceğim değişkenler kullandım!).

Biliyorum, bu kazanmayacak, çünkü Python daha garip ve ben de.

Kısa versiyon:

  def a(t,d,l):
    for i,j in d.items():
      if l:
        i=i.lower()
      t=t.replace(i,j)
    return t
  def b(h,q):
    p=32
    r=360
    h=(h+(r/q/2))/(r/p)
    j=int(int(int(h %8)%8/(p/q))*p/q)
    h=int(h/8)%4
    k=c.keys()
    u=['W','W by x','W-z','Z by w','Z','Z by x','X-z','X by w']
    d={}
    d['W']=list(k)[h]
    d['w']=d['W'].lower()
    d['X']=list(k)[(h+1)%4]
    d['x']=d['X'].lower()
    if(d['W']=='North' or d['W']=='South'):
      d['Z']=d['W']+d['x']
    else:
      d['Z']=d['X']+d['w']
    d['z']=d['Z'].lower()
    return a(u[j],d,0)
  def g(n):
    n=a(n,c,0)
    n=a(n,c,1)
    d={'by':'b',' ':'','-':''}
    return a(n,d,0)
  def v(m):
    while True:
      try:
        return float(input(m))
      except ValueError:
        print("?")
  c={'North':'N','East':'E','South':'S','West':'W'}
  while True:
    h=v("?")
    n=b(h,32)
    print(h,n,g(n))

Sürümü temizle

            import math
            import sys

            def calcPoint(degHead, points):
                maxPoints=32
                if points not in(8,16,32):
                    sys.exit("not a good question")
                degHead=(degHead+(360/points/2))/(360/maxPoints)
                j =int(int( int(degHead  % 8)%8/(maxPoints/points))*maxPoints/points)
                degHead = int(degHead / 8) % 4
                cardinal = ['North', 'East', 'South', 'West']
                pointDesc = ['W', 'W by x', 'W-z', 'Z by w', 'Z', 'Z by x', 'X-z', 'X by w']#vars not compass points
                W = cardinal[degHead]
                X = cardinal[(degHead + 1) % 4]
                w=W.lower()
                x=X.lower()
                if (W == cardinal[0] or W == cardinal[2]) :
                    Z =W + x
                else:
                    Z =X + w
                z=Z.lower()
                return pointDesc[j].replace('W', W).replace('X', X).replace('w', w).replace('x', x).replace('Z', Z).replace('z', z);

            def getShortName(name): 
                return name.replace('North', 'N').replace('East', 'E').replace('South', 'S').replace('West', 'W').replace('north', 'N').replace('east', 'E').replace('south', 'S').replace('west', 'W').replace('by', 'b').replace(' ', '').replace('-', '')

            def input_number(msg, err_msg=None):
                while True:
                    try:
                        return float(input(msg))
                    except ValueError:
                        sys.exit("not a number")

            while True:
                headingCalib=input_number("input a number: ")
                print (headingCalib, end=' ')
                name = calcPoint(headingCalib,32) #degrees heading, points of compass 8,16 or 32)
                print (name, end=' ')
                shortName = getShortName(name)
                print (shortName)

4

Adil nokta - Şimdi golf girişiminde bulundum.
tony goodwin

Gönderiminizde neden bu kadar çok girinti var? Cevabınızın bir parçası gibi görünmüyor, bu yüzden amacını görmüyorum. Ayrıca, tüm ekstra boşlukları kaldırarak, değişken adlarını ve bildirimlerini kısaltarak ve gereksiz değişkenleri tamamen kaldırarak bunu çok daha fazla golf oynayabilirsiniz
Jo King

Teşekkürler Jo, sürümü tekrar güncelledim. Hepsini aldım mı?
tony goodwin

kardinaller için bir sözlüğü çok daha iyi kullandı. Şimdi fikirler dışında. Umarım yeterlidir?
tony goodwin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.