कम्पास के अंक को डिग्री में बदलें


18

मैं स्वतंत्र रूप से इस चुनौती के साथ आया था, लेकिन यह डोरकनब द्वारा इस चुनौती का उलटा हुआ । जैसा कि मैं वास्तव में उसकी कल्पना को पसंद करता हूं, मैंने अपने स्वयं के स्पष्टीकरण को पकाने के बजाय इसके बड़े हिस्सों को चोरी करने का फैसला किया।

चुनौती

कम्पास पर 32 बिंदुओं में से एक के संक्षिप्त नाम को देखते हुए, संबंधित डिग्री प्रिंट करें। यदि आप 32 बिंदुओं के स्पष्टीकरण में रुचि नहीं रखते हैं, तो नीचे दी गई तालिका में आगे बढ़ने के लिए स्वतंत्र महसूस करें।

यहाँ पूर्ण कम्पास है:

छवि

विकिमीडिया कॉमन्स के माध्यम से डेनसेलोन 83 (स्वयं का काम) [ GFDL या CC-BY-SA-3.0 ]

प्रत्येक दिशा पिछले की तुलना में 11.25 (360/32) डिग्री दूर है। उदाहरण के लिए, एन (उत्तर) 0 डिग्री है, एनबीई (पूर्व से उत्तर) 11.25 डिग्री है, एनएनई (उत्तर-उत्तर पूर्व) 22.5 डिग्री है, आदि।

विस्तार से, नाम इस प्रकार हैं:

  • 0 डिग्री एन है, 90 डिग्री ई है, 180 डिग्री एस है, और 270 डिग्री डब्ल्यू है। इन्हें कार्डिनल दिशाएं कहा जाता है।
  • कार्डिनल दिशाओं के बीच आधे रास्ते केवल कार्डिनल दिशाओं के बीच होते हैं जो वे समवर्ती होते हैं। एन या एस हमेशा पहले जाते हैं, और डब्ल्यू या ई हमेशा दूसरे होते हैं। इन्हें क्रमिक दिशाएँ कहा जाता है। ऑर्डिनल और कार्डिनल दिशाएं मिलकर प्रधान हवाएँ बनाती हैं।
  • प्रमुख हवाओं के बीच आधे रास्ते वे दिशा-निर्देश हैं जिनके बीच वे समवर्ती हैं। कार्डिनल दिशाएं पहले, क्रमिक दूसरे पर जाती हैं। इन्हें आधी हवा कहा जाता है।
  • प्रिंसिपल और आधी हवाओं के बीच आधे बिंदु "प्रिंसिपल विंड से दूर निकटतम कार्डिनल दिशा" द्वारा आसन्न प्रिंसिपल विंड हैं। यह एक के साथ चिह्नित है b। इन्हें तिमाही हवाएं कहा जाता है।

यह निम्न चार्ट में परिणाम करता है:

#   Degrees  Abbrv.  Name
1   0        N       North
2   11.25    NbE     North by east
3   22.5     NNE     North-northeast
4   33.75    NEbN    Northeast by north
5   45       NE      Northeast
6   56.25    NEbE    Northeast by east
7   67.5     ENE     East-northeast
8   78.75    EbN     East by north
9   90       E       East
10  101.25   EbS     East by south
11  112.5    ESE     East-southeast
12  123.75   SEbE    Southeast by east
13  135      SE      Southeast
14  146.25   SEbS    Southeast by south
15  157.5    SSE     South-southeast
16  168.75   SbE     South by east
17  180      S       South
18  191.25   SbW     South by west
19  202.5    SSW     South-southwest
20  213.75   SWbS    Southwest by south
21  225      SW      Southwest
22  236.25   SWbW    Southwest by west
23  247.5    WSW     West-southwest
24  258.75   WbS     West by south
25  270      W       West
26  281.25   WbN     West by north
27  292.5    WNW     West-northwest
28  303.75   NWbW    Northwest by west
29  315      NW      Northwest
30  326.25   NWbN    Northwest by north
31  337.5    NNW     North-northwest
32  348.75   NbW     North by west

यहां कम्पास के बिंदुओं का अधिक विस्तृत चार्ट और संभवतः बेहतर विवरण दिया गया है।

आपका कार्य तीसरे कॉलम से 32 संक्षिप्तीकरणों में से एक इनपुट के रूप में लेना है और दूसरे कॉलम में संबंधित डिग्री को आउटपुट करना है।

आप मान सकते हैं कि इनपुट हमेशा उन 32 स्ट्रिंग्स में से एक होगा (और आप वैकल्पिक रूप से लेकिन लगातार एकल अनुगामी न्यूलाइन की उम्मीद कर सकते हैं)। आउटपुट को भी ऊपर सूचीबद्ध के समान ही दिया जाना चाहिए, हालांकि अनुगामी शून्य की अनुमति है। आप वैकल्पिक रूप से एक एकल अनुगामी न्यूलाइन का उत्पादन कर सकते हैं।

आप STDIN (या निकटतम विकल्प), कमांड-लाइन तर्क या फ़ंक्शन तर्क के माध्यम से इनपुट ले रहे हैं और STDOUT (या निकटतम विकल्प), फ़ंक्शन रिटर्न मान या फ़ंक्शन (आउट) पैरामीटर के माध्यम से परिणाम लिख सकते हैं।

यह कोड गोल्फ है, इसलिए सबसे छोटा उत्तर (बाइट्स में) जीतता है।

जवाबों:


2

पायथ, 47 बाइट्स

c*45x"NuMD¢¼Ew
XSj.{§/gWbZ¹°"C%CzC\½4

हेक्सडंप, अप्रमाणित वर्णों के कारण:

0000000: 632a 3435 7822 4e86 754d 0344 a2bc 4504  c*45x"N.uM.D..E.
0000010: 770a 9518 1c58 536a 2e7b a77f 2f67 5762  w....XSj.{../gWb
0000020: 5ab9 15b0 8798 2243 2543 7a43 5cbd 34    Z....."C%CzC\.4

दोहन ​​परीक्षण

आधिकारिक कमांड लाइन कंपाइलर में एक बग के कारण, यह कोड केवल ऑनलाइन कंपाइलर, ऊपर लिंक या -cऑफ़लाइन कंपाइलर के झंडे के माध्यम से काम करता है । (सवाल पूछे जाने के बाद बग को ठीक किया गया था।)

यह समाधान @ डेनिस के सीजम उत्तर के समान है, हैशिंग की प्रक्रिया का उपयोग करते हुए, 32 बाइट लुकअप स्ट्रिंग में परिणाम को देखते हुए, और फिर 11.25 से गुणा किया जाता है।

मेरे द्वारा उपयोग किया गया हैश फ़ंक्शन इनपुट को एक स्ट्रिंग में परिवर्तित कर रहा है जैसे कि यह एक आधार 256 पूर्णांक था , जिसके Cपरिणामस्वरूप मोडुलो लिया जाता Cहै ½, जो 189 है, लेकिन बेहतर पार्सिंग के कारण एक बाइट बचाता है, और उस स्ट्रिंग को Cफिर से स्ट्रिंग में परिवर्तित करता है। ।

11.25 से गुणा करना 45 से गुणा करके पूरा किया जाता है, फिर 4 से विभाजित होता है, जो एक बाइट को बचाता है।


9

रूबी, ११y १०६

12 बाइट्स के लिए मार्टिन बर्टनर को धन्यवाद बचाया।

यह वर्तमान में एक ही लंबाई की परवाह किए बिना कि यह एक समारोह या एक कार्यक्रम है।

भेड़ का बच्चा समारोह

->s{n=4
d=0,0
s.chars{|e|c="SWNE".index e
c ?d[c%2]+=c/2*2*n-n :n=1}
(Complex(*d).arg*5.1).round%32*11.25}

कार्यक्रम

n=4
d=0,0
gets.chars{|e|c="SWNE".index e
c ?d[c%2]+=c/2*2*n-n :n=1}
p (Complex(*d).arg*5.1).round%32*11.25

यह अंक के माध्यम से एक कार्टेशियन वॉक है। वर्ण NSEWx और y से 4 जोड़ते हैं या घटाते हैं और इसमें संग्रहीत निर्देशांक d[]। एक के बाद b(के अलावा अन्य या किसी प्रतीक NSEWका सामना करना पड़ा है), यह 1 करने के लिए कम है।

X और y डेटा को तब कोणीय तर्क निकालने के लिए एक जटिल संख्या के रूप में माना जाता है। इसे 16 / PI = से गुणा किया जाता है 5.1। हालांकि दृष्टिकोण में कुछ ज्यामितीय त्रुटियां हैं, इस कोण को गोल करना सही संख्या देने के लिए पर्याप्त है -15..+16। मोडुलो का उपयोग इसे ठीक करने के लिए किया जाता है 0..31(रूबी में %हमेशा सकारात्मक वापसी होती है।) अंत में परिणाम 11.25 से गुणा किया जाता है।


1
गोलाई से क्या चतुर विचार! आप निकटतम ऑर्थोगोनल दिशा के सापेक्ष लिए गए कोण के बजाय कोण के आर्कन को प्राप्त करते हैं, लेकिन यह काफी करीब निकलता है।
xnor

@xnor बिना गोलाई के मुझे NbE 14.05 (+2.8), NNE 26.60 (+4.1), NEBE 51.41 (-4.84) ​​मिलता है, इसलिए मेरे पास कुछ मान थे, nलेकिन मुझे उन्हें ध्यान से चुनना था।
लेवल रिवर सेंट

6

जावास्क्रिप्ट (ईएस 6), 153 बाइट्स

बस गेंद को एक साधारण से लुढ़कना चाहता था।

x=>'N NbE NNE NEbN NE NEbE ENE EbN E EbS ESE SEbE SE SEbS SSE SbE S SbW SSW SWbS SW SWbW WSW WbS W WbN WNW NWbW NW NWbN NNW NbW'.split` `.indexOf(x)*45/4

विशेष रूप से अभिनव नहीं है, लेकिन यह काम करता है, और शायद कुछ युक्तियां हैं जो इससे प्राप्त की जा सकती हैं। चिंता न करें, मैं दूसरी (उम्मीद से बेहतर) तकनीक के बारे में सोचूंगा।


1
शायद आप स्ट्रिंग को संपीड़ित कर सकते हैं?
mbomb007

1
आश्चर्यजनक रूप से, यह अभी भी पायथन में मेरे (प्रस्तुत नहीं) समाधान से कम है, जो एल्गोरिथम दृष्टिकोण का उपयोग करता है।
pawel.boczarski

2

सीजेएम, 49 बाइट्स

0000000: 72 34 62 32 35 33 25 63 22 4e bf 6f f1 80 e8 dc 38  r4b253%c"N.o....8
0000011: 45 3d f0 2e 94 3c d3 12 53 24 e5 5f a6 63 28 60 57  E=...<..S$._.c(`W
0000022: 5b 14 20 92 17 81 d1 22 23 31 31 2e 32 35 2a        [. ...."#11.25*

ऊपर एक हेक्सडंप है, जिसके साथ उलटा हो सकता है xxd -r -c 17 -g 1

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

यह काम किस प्रकार करता है

r      e# Read a token from STDIN.
4b     e# Convert the string (array of code points) from base 4 to integer.
253%   e# Take the result modulo 253.
c      e# Cast to character.
"…"    e# Push a 32 byte lookup table.
#      e# Find the index of the character.
11.25* e# Multiply the index by 11.25.

1

जावा, 653 (वर्ण)

मुझे पता है कि जावा जीत नहीं सकता, लेकिन मुझे वैसे भी प्रयास करना पसंद है।

class C{float c=1/8f;int n=0;float a;public C(String s){if(s.contains("W"))n=4;switch(s.length()){case 1:p(d(s));case 2:p(e(s));case 3:if(s.contains("b"))f(s,1);g(s);}f(s,2);}int v(char x){switch(x){case 'N':return n;case 'E':return 1;case 'S':return 2;}return 3;}int d(String s){return v(s.charAt(0));}float e(String s){return (v(s.charAt(0))+v(s.charAt(1)))/2f;}void f(String s,int i){if(i<2)a=v(s.charAt(0));else a=e(s.substring(0,i));if(v(s.charAt(1+i))<a)c=-c;p(a+c);}void g(String s){p((d(s.substring(0,1))+e(s.substring(1)))/2f);}void p(float x){System.out.printf("%.2f",x*90);System.exit(0);}public static void main(String[]r){C c=new C(r[0]);}}

यह कमांडलाइन से इनपुट लेता है और कंसोल को आउटपुट करता है। Ungolfed संस्करण:

class Compass
{
    float c = 1/8f;
    int n = 0;
    float a;

    public Compass( String s )
    {
        if( s.contains( "W" ) )
        {
            n = 4;
        }
        switch( s.length() )
        {
            case 1:
                print( parse1( s ) );
            case 2:
                print( parse2( s ) );
            case 3:
                if( s.contains( "b" ) )
                {
                    parse3b4( s , 1 );
                }
                parse3( s );
        }
        parse3b4( s , 2 );
    }

    int getValue( char x )
    {       
        switch( x )
        {           
            case 'N':
                return n;
            case 'E':
                return 1;
            case 'S':
                return 2;           
        }
        return 3;
    }

    int parse1( String s )
    {
        return getValue( s.charAt( 0 ) );
    }

    float parse2( String s )
    {
        return ( getValue( s.charAt( 0 ) ) + getValue( s.charAt( 1 ) ) ) / 2f;
    }

    void parse3b4( String s , int i )
    {
        if( i < 2 ) a = getValue( s.charAt( 0 ) );
        else a = parse2( s.substring( 0 , i ) );
        if( getValue( s.charAt( 1 + i ) ) < a )
        {
            c = -c;
        }
        print( a + c );
    }

    void parse3( String s )
    {
        print( ( parse1( s.substring( 0 , 1 ) ) + parse2( s.substring( 1 ) ) ) / 2f );
    }

    void print( float x )
    {       
        System.out.printf( "%.2f" , x * 90 );
        System.exit( 0 );
    }

    public static void main( String[] args )
    {
        Compass compass = new Compass( args[ 0 ] );
    }
}

यह एनडब्ल्यू को 0-3 (या यदि डब्ल्यू शामिल है तो 4 के लिए) असाइन करके काम करता है। यह 4 अलग-अलग स्थितियों को पहचानता है:

  • parse1 सिंगल लेटर पॉइंट्स के लिए है, यह सिर्फ वैल्यू देता है।
  • parse2 दोहरे अक्षर बिंदुओं के लिए है, यह 2 अंकों के मूल्यों को औसत करता है।
  • parse3 ट्रिपल अक्षर बिंदुओं के लिए है, यह दोहरे और एकल बिंदुओं के औसत का औसत लेता है।
  • parse3b4 उन सभी के लिए है, जिनमें 'b' होता है, यह 'b' से पहले बिंदु के मान की गणना करता है और 'b' के बाद बिंदु की 'दिशा' के आधार पर 1/8 को जोड़ता या घटाता है।

वास्तविक कोण प्राप्त करने के लिए प्रिंट () में मूल्य को 90 से गुणा किया जाता है।


क्या लिखना जरूरी है C c=new C(r[0]);? शायद new C(r[0]);पर्याप्त है?
pawel.boczarski

1

पायथन 3, 149 बाइट्स

मैंने एक पुनरावर्ती एल्गोरिदम दृष्टिकोण की कोशिश की। पहली बार में जितना मैंने सोचा था, उससे अधिक तिमाही हवाओं को संभालना कठिन था, इसलिए यह समाधान अपेक्षाकृत लंबा हो गया।

def f(s):
 if'W'in s:s=s.replace(*'Nn')
 a=(len(s)-2)/8;return'b'in s and(1-a)*f(s[:-2])+a*f(s[-1])or a>=0and(f(s[0])+f(s[1:]))/2or'NESWn'.find(s)*90

Ungolfed:

def f(s):
    if 'W'in s:
        s = s.replace('N','n')
    a=(len(s)-2)/8
    if 'b' in s:
        a = 1/8 if len(s)==3 else 1/4
        return (1-a)*f(s[:-2])+a*f(s[-1])
    else:
        if len(s)==1:
            return 'NESWn'.find(s)*90
        else:
            return (f(s[0])+f(s[1:]))/2

गोल्फ संस्करण एक दशमलव लौटाता है जिसे 10 से गुणा करना पड़ता है ( f("NbW")रिटर्न के 34.875बदले 348.75)
returns 的

@ viktorahlström, क्या आपको यकीन है? यह मेरे लिए सही मूल्य लौटाता है। कोड को कॉपी और पेस्ट करते समय शायद आप अंतिम शून्य से चूक गए हों?
एमिल

ओह, क्षमा करें, जाहिर है कि यह था - मेरी गलती, क्षमा करें!
56 人

1

हास्केल, 206 बाइट्स

c l=11.25*(fromIntegral$b$l)
b l|(p y l)<0=a l+16|0<1=mod(a l)32
a l=round$(16/pi*)$atan$d$l
d l=p x l/p y l
p z[]=0.0
p z('b':[r])=z r/4
p z(a:r)=z a+p z r
x 'E'=4
x 'W'=(-4)
x c=0
y 'N'=4
y 'S'=(-4)
y c=0

सुविधाजनक परीक्षण:

*Main> map c ["N","NbE","NNE","NEbN","NE","NEbE","ENE","EbN","E","EbS","ESE","SEbE","SE","SEbS","SSE","SbE","S","SbW","SSW","SWbS","SW","SWbW","WSW","WbS","W","WbN","WNW","NWbW","NW","NWbN","NNW","NbW"]
[0.0,11.25,22.5,33.75,45.0,56.25,67.5,78.75,90.0,101.25,112.5,123.75,135.0,146.25,157.5,168.75,180.0,191.25,202.5,213.75,225.0,236.25,247.5,258.75,270.0,281.25,292.5,303.75,315.0,326.25,337.5,348.75]

0

पॉवरशेल - 350

Comapss_gui_in_powershell

Add-Type -AssemblyName *sys*forms*
$f=new-object windows.forms.form
$c=new-object windows.forms.combobox
$c.DataSource=(-split"N NbE NNE NEbN NE NEbE ENE EbN E EbS ESE SEbE SE SEbS SSE SbE S SbW SSW SWbS SW SWbW WSW WbS W WbN WNW NWbW NW NWbN NNW NbW")
$c.Parent=$f
$c.Add_SelectedValueChanged({$f.text=$c.SelectedIndex*11.25})
$f.ShowDialog()

0

जूलिया, 151 147 142 बाइट्स

t=strchr
p=s->if ""==s 0;else i=t(s,'b')
(32/2^i)^sign(i)*p(i>0?s[1:i-1]:s[2:])+im^t("ESWN",s[i+1])end
f=s->90int(16mod(angle(p(s)),2pi)/pi)/8

थोड़ा असंतुष्ट:

# return approx. direction in term of complex number of absolute value 1,
# whose argument is the direction:
# N -> 0, E -> 0+1j, S -> -1, W -> 0-1j
function p(s)
    if ""==s 0;
    else
        i=strchr(s,'b');
        if i!=0
            # if 'b' is 2nd in the word, following direction weight is 1/8,
            # if 'b' is 3rd in the word, following direction weight is 1/4.
            weight=2^(5-i)
            # the first term to count avg is all before 'b'
            first_term=s[1:i-1]
        else
            # weights are equal for the counted and the new (eg. 'NNW <= avg(N, NW)')
            weight=1
            # the first term to count avg is all after the first character
            first_term=s[2:]
        end
        # the return value - average of two vectors
        # s[i+1] evaluates to FIRST character if 'b' didn't occur
        # or to the LAST CHARACTER (after 'b') if it did.
        e^(im*angle(weight*p(first_term)+im^t("ESWN",s[i+1])));
    end
end

# ... And the proper function for returning angle
# there are errors (sic!) in the counted direction, but dividing by 11.25,
# rounding and remultiplying by 11.25 filters them out
f=s->int32(mod(angle(p(s)),2pi)/pi*16)*11.25

अनगुल्ड कोड में, मैं दो वैक्टर के औसत को गिनता हूं avg = e ^ {jArg (v_1 + v_2)}ताकि वेक्टर अभी भी सामान्य हो सके। हालांकि, पहले वेक्टर के बढ़ाव के कारण त्रुटियां अभी तक हमारी पुनरावृत्ति में बहुत कम परिवर्धन के साथ जमा नहीं हो रही हैं, इसलिए सामान्यीकरण चरण को गोल्फ करते समय हटा दिया गया था और गणना avg = v_1 + v_2बस चली जाती है। पूर्ण चक्र के 1/64 से कम त्रुटियों को गोलाई द्वारा फ़िल्टर किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.