কম্পাসের একটি বিন্দু ডিগ্রিতে রূপান্তর করুন


18

আমি স্বাধীনভাবে এই চ্যালেঞ্জটি নিয়ে এসেছি, তবে ডোরকনব এই চ্যালেঞ্জের বিপরীত হিসাবে প্রমাণিত । যেহেতু আমি সত্যিই তার অনুমানটি পছন্দ করি, তাই আমি নিজের ব্যাখ্যাগুলি রান্না করার পরিবর্তে এর বড় অংশগুলি চুরি করার সিদ্ধান্ত নিয়েছি।

চ্যালেঞ্জ

কম্পাসে 32 পয়েন্টগুলির মধ্যে একটির সংক্ষিপ্তসার দেওয়া, সংশ্লিষ্ট ডিগ্রি মুদ্রণ করুন আপনি যদি 32 পয়েন্টের ব্যাখ্যায় আগ্রহী না হন তবে নীচে টেবিলের কাছে নির্দ্বিধায় পড়ে যান।

এখানে সম্পূর্ণ কম্পাসটি রয়েছে:

ভাবমূর্তি

উইকিমিডিয়া কমন্সের মাধ্যমে ডেনেলসন ৩৩ (নিজস্ব কাজ) [ জিএফডিএল বা সিসি-বাই-এসএ -৩.০ ] দ্বারা

প্রতিটি দিক পূর্বের তুলনায় 11.25 (360/32) ডিগ্রি বেশি। উদাহরণস্বরূপ, এন (উত্তর) 0 ডিগ্রি, এনবিই (পূর্বে উত্তর) 11.25 ডিগ্রি, এনএনই (উত্তর-উত্তর পূর্বে) 22.5 ডিগ্রি, ইত্যাদি,

বিস্তারিতভাবে, নামগুলি নিম্নরূপ অর্পণ করা হয়েছে:

  • 0 ডিগ্রি হ'ল এন, 90 ডিগ্রি ই,, 180 ডিগ্রি এস, এবং 270 ডিগ্রি ডাব্লু। এগুলিকে কার্ডিনাল দিকনির্দেশ বলা হয়।
  • কার্ডিনাল দিকগুলির মধ্যবর্তী অর্ধেক পয়েন্টগুলি কেবল সেই কার্ডিনাল দিক যা তারা সংক্ষিপ্তের মধ্যে থাকে are এন বা এস সর্বদা প্রথম যায় এবং ডাব্লু বা ই সর্বদা দ্বিতীয় হয়। এগুলিকে অর্ডিনাল দিকনির্দেশ বলা হয়। অর্ডিনাল এবং কার্ডিনাল দিকগুলি একসাথে মূল বাতাসের গঠন করে।
  • মূল বাতাসের মাঝামাঝি পয়েন্টগুলি সেই দিকগুলি যা তারা সংক্ষিপ্ত অবস্থায় থাকে। মূল দিকনির্দেশগুলি প্রথমে যায়, অর্ডিনাল দ্বিতীয়। এগুলিকে অর্ধ বাতাস বলা হয়।
  • অধ্যক্ষ এবং অর্ধ বাতাসের মাঝামাঝি পয়েন্টগুলি মূল বাতাস থেকে নিকটতম মূল দিকটি "দ্বারা" সংলগ্ন প্রধান বায়ু হয় are এটি একটি দ্বারা চিহ্নিত করা হয় 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 টি স্ট্রিংগুলির মধ্যে ঠিক একটি হবে (এবং আপনি বিকল্পভাবে কিন্তু ধারাবাহিকভাবে একটি একক পেছনের নতুন লাইন আশা করতে পারেন)। উপরের তালিকা অনুসারে আউটপুটও ঠিক দেওয়া উচিত, যদিও অনুসরণীয় শূন্যগুলি অনুমোদিত। আপনি allyচ্ছিকভাবে একটি একক পেছনের নতুন লাইন আউটপুট করতে পারেন।

আপনি 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

রুবি, 118 106

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

এটি পয়েন্টগুলির মধ্যে দিয়ে কার্টেসিয়ান পদচারণা। অক্ষরগুলি NSEWসঞ্চিত x এবং y স্থানাঙ্ক থেকে 4 যোগ করে বা বিয়োগ করে d[]। একটি b(বা ব্যতীত অন্য কোনও চিহ্নের NSEW) মুখোমুখি হওয়ার পরে এটি হ্রাস করা হয় 1 এ।

এর পরে এক্স এবং ওয়াই ডেটা কৌনিক যুক্তিটি বের করার জন্য একটি জটিল সংখ্যা হিসাবে বিবেচনা করা হয়। এটি 16 / পিআই = দ্বারা গুণিত হয় 5.1। যদিও পদ্ধতির কিছু জ্যামিতিক ত্রুটি রয়েছে, সঠিক কোণটি দেওয়ার জন্য এই কোণটি ঘোরানো যথেষ্ট -15..+16। Modulo এটিকে সংশোধন করতে ব্যবহৃত হয় 0..31(রুবি %সর্বদা ইতিবাচক প্রত্যাবর্তন করে)) অবশেষে ফলাফলটি 11.25 দ্বারা গুণিত হয়।


1
রাউন্ডিংয়ের সাথে কী চালাক ধারণা! আপনি কোণটির পরিবর্তে কোণটির আর্কটান পান, নিকটতম অরথোগোনাল দিকের তুলনায় নেওয়া, তবে এটি যথেষ্ট নিকটে পরিণত হয়।
xnor

@xnor কে গোল না করে আমি NbE 14.05 (+2.8), এনএনই 26.60 (+4.1), NEbE 51.41 (-4.84) ​​পেয়েছি তাই আমার মানগুলি কিছুটা ছাড়িয়েছিল nতবে আমি সেগুলি সাবধানে বেছে নিতে হয়েছিল।
স্তর নদী সেন্ট

6

জাভাস্ক্রিপ্ট (ES6), 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

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

কিভাবে এটা কাজ করে

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]);}}

এটি কমান্ডলাইন থেকে ইনপুট নেয় এবং কনসোলে আউটপুট দেয়। অবরুদ্ধ সংস্করণ:

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 একক অক্ষরের পয়েন্টগুলির জন্য, এটি কেবল মানটি দেয়।
  • পার্স 2 ডাবল লেটার পয়েন্টের জন্য, এটি 2 পয়েন্টের মান গড় করে।
  • পার্স 3 টি ট্রিপল লেটার পয়েন্টগুলির জন্য, এটি দ্বিগুণ এবং একক পয়েন্টের গড় গড়ে নেয়।
  • 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.875348.75

@ ভিক্টোরিহ্লাস্ট্রোম, আপনি কি নিশ্চিত? এটি আমার জন্য সঠিক মান প্রদান করে। কোডটি অনুলিপি করে এবং পেস্ট করার সময় আপনি শেষ শূন্যটি মিস করেছেন?
এমিল

ওহ, দুঃখিত, স্পষ্টতই এটি ছিল - আমার ভুল, দুঃখিত!
5 的 人

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

অবিকৃত কোডটিতে, গড় = ই ^ {জেআরজি (v_1 + ভি 2)}ভেক্টরটিকে এখনও সাধারণীকরণের জন্য আমি গড়ে দুটি ভেক্টরকে গণনা করি । যাইহোক, প্রথম ভেক্টরের প্রসারিত হওয়ার কারণে ত্রুটিগুলি এখনও আমাদের পুনরাবৃত্তিতে খুব সামান্য সংযোজন সহ জমে উঠেনি, তাই গল্ফ করার সময় স্বাভাবিকীকরণের পদক্ষেপটি সরানো হয়েছিল এবং গণনাটি গড় = v_1 + v_2সহজভাবে চলে যায় । পূর্ণ বৃত্তের 1/64 এরও কম ত্রুটিগুলি বৃত্তাকার দ্বারা ফিল্টার করা হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.