উত্তর দিয়ে উত্তর দক্ষিণে দক্ষিণ পূর্ব


30

এন, এস, ই এবং ডাব্লু এর একটি স্ট্রিং দেওয়া হয়েছে, একটি বিয়ারিং আউটপুট (উত্তর থেকে কোণে ক্লকওয়াইজ ডিগ্রি), সঠিকভাবে 5 দশমিক জায়গায়।

ইন ঐতিহ্যগত কম্পাস স্বরলিপি একটি স্ট্রিং শুধুমাত্র 2 (NNW বা Ese মত) এই অক্ষরের গঠিত। এখানে আপনাকে অবশ্যই 4 টি (ডাব্লুএনএনএনএসই এর মতো) স্ট্রিংগুলি গ্রহণ করতে হবে । মাত্র ২ টি প্রতীক ব্যবহার করা মানবকে স্বজ্ঞাতভাবে অর্থ বুঝতে সক্ষম করে। 4 টি প্রতীক পড়ার ফলে এটি পড়া ভয়ঙ্কর হয়ে ওঠে, তবে প্রদত্ত নির্ভুলতার সাথে জন্মদানকে বর্ণনা করার ছোট উপায়গুলি অনুমোদন করে।

(হিসাবে নির্দিষ্ট মন্তব্য দ্বারা user2357112 , এটি সক্রিয় আউট আপনি, প্রমাণ করতে পারেন তাই আমি একটি মিথ্যা ধৃষ্টতা এই চ্যালেঞ্জ ভিত্তিক করেছি যে কোনো জন্মদান জন্য, 4 প্রতীক স্ট্রিং ঠিক 2 প্রতীক স্ট্রিং হিসেবে একই দৈর্ঘ্য হতে হবে। আশা করি ব্যবহারিক উদ্দেশ্যটির এই অভাব আপনার চ্যালেঞ্জ উপভোগ থেকে বিরত না ...)

সঠিক পদ্ধতিটি নীচে বর্ণিত হয়েছে, এবং এটি প্রচলিত স্বরলিপি সমতুল্য (এটি পরিবর্তনের পরিবর্তে এটিতে প্রসারিত হয়)।

ইনপুট

  • ইনপুটটি একটি একক স্ট্রিং যেখানে কেবল অক্ষর থাকে NESW
  • আপনি যদি পছন্দ করেন তবে ইনপুটটি অক্ষরগুলির ক্রম হতে পারে তবে শর্ত থাকে যে এতে কোনও প্রিপ্রোসেসিং অন্তর্ভুক্ত নেই। উদাহরণস্বরূপ, [N, [E, [S, [W]]]]প্রক্রিয়াকরণের ক্রমটি সহায়তা করার জন্য নেস্টেড তালিকা গ্রহণের অনুমতি নেই।
  • বিভিন্ন চরিত্র গ্রহণের অনুমতি নেই। আপনি এর 1234পরিবর্তে স্ট্রিং নাও নিতে পারেন NESW

আউটপুট

  • আউটপুট অবশ্যই একটি দশমিক সংখ্যা বা স্ট্রিং প্রতিনিধিত্ব করতে হবে (যুক্তিযুক্ত / ভগ্নাংশ নয়)।
  • চলমান শূন্যগুলি প্রদর্শন করার প্রয়োজন নেই। যদি ভারবহন হয় 9.00000তবে আউটপুটটিও 95 দশমিক জায়গায় সঠিক হিসাবে গণনা করা হয়।
  • আউটপুটটি [0, 360) এর মধ্যে রয়েছে। এটি 0 সহ তবে 360 বাদে exc
  • আউটপুটটি 5 দশমিক স্থানে গোল করে সঠিকতা পরীক্ষা করা হয়। ভারবহন যদি 0.000005 হয় তবে এই রাউন্ডটি 0.00001 হয়। আউটপুট 0.00001 এবং 0.000005 উভয়ই সঠিক।
  • কিছু ইনপুট জন্য বৈজ্ঞানিক স্বরলিপি আউটপুট গ্রহণযোগ্য। উদাহরণস্বরূপ, 1e-5পরিবর্তে 0.00001

রূপান্তর

  • একক অক্ষর কম্পাস পয়েন্ট N, E, S, এবং Wমিলা 0, 90, 180, এবং 270 ডিগ্রী যথাক্রমে।
  • এর মধ্যে একটি স্ট্রিংয়ের জন্য প্রস্তুতি ফলাফলটি কার্যকর করে যা একক চরিত্রের বিয়ারিং এবং মূল স্ট্রিংয়ের ভারবিককে দ্বিখণ্ডিত করে।
  • দুটি সম্ভাব্য দ্বিখণ্ডিত বিয়ারিংয়ের সবচেয়ে নিকটতমটি বেছে নেওয়া হয়েছে, যাতে এনই 225 ডিগ্রি নয়, 45 ডিগ্রি উপস্থাপন করে।
  • দ্বিখণ্ডিত কোণটি 180 ডিগ্রি বাদে এটি দ্ব্যর্থহীন। অতএব NS, SN, WE, এবং EWundefined bearings হয় মিলা, এবং ইনপুট এর মধ্যে যে কোনো শেষ হবে না। এগুলি ইনপুট স্ট্রিংয়ের অন্য যে কোনও জায়গায় উপস্থিত হতে পারে, কারণ এটি কোনও দ্বিধাগ্রস্থতার কারণ নয়।
  • চূড়ান্ত দুটি অক্ষর যদি একরকম হয় তবে চূড়ান্ত অক্ষরটি অতিরিক্ত কাজ হবে কারণ দ্বিখণ্ডিত একই ফলস্বরূপ ফিরে আসবে। যেহেতু এটি স্বীকৃতিতে কিছুই যোগ করে না তাই আপনার কোডটি এটি পরিচালনা করার দরকার নেই। অতএব NN, EE, SS, এবং WWundefined bearings হয় মিলা, এবং ইনপুট এর মধ্যে যে কোনো শেষ হবে না। তারা তবে ইনপুট স্ট্রিংয়ের অন্য যে কোনও জায়গায় উপস্থিত হতে পারে।

উদাহরণ

N: 0
E: 90
S: 180
SE: halfway between S and E: 135
NSE: halfway between N and SE: 67.5
NNSE: halfway between N and NSE: 33.75
NNNSE: halfway between N and NNSE: 16.875
NNNNSE: halfway between N and NNNSE: 8.4375

পরীক্ষার মামলা

পরীক্ষার সমস্ত ক্ষেত্রে সঠিক আউটপুট দেয় তবেই জমা দেওয়া বৈধ। নোট করুন যে পরীক্ষার কেসগুলি দ্বিগুণ নির্ভুলতার সাথে কী পরিচালনা করতে পারে তার সীমাতে চাপ দেয়। একক নির্ভুলতায় ডিফল্ট হওয়া ভাষাগুলির জন্য সঠিক আউটপুটগুলি পেতে ডাবল স্পষ্টতা নির্দিষ্ট করতে আপনাকে সম্ভবত বাইটগুলি ব্যয় করতে হবে।

পরীক্ষার কেস আউটপুটগুলি 5 টি দশমিক স্থানে গোল করে এবং যথেচ্ছ নির্ভুলতার জন্য দেখানো হয়। উভয়ই বৈধ আউটপুট।

WNE 337.5 337.5
WEN 337.5 337.5
WEWEWEWEWEWEWEWEWEWEWEN 330.00001 330.000007152557373046875
NESWNESWNESWNESWNESWNESWNESW 90 89.99999932944774627685546875
NNNNNNNNNNNNNNNNNNNNNNNE 0.00001 0.0000107288360595703125
NNNNNNNNNNNNNNNNNNNNNNNW 359.99999 359.9999892711639404296875
SNNNNNNNNNNNNNNNNNNNNNNNE 90.00001 90.00000536441802978515625
SNNNNNNNNNNNNNNNNNNNNNNNW 269.99999 269.99999463558197021484375

স্কোরিং

এটি । স্কোরটি বাইটের উত্স কোডের দৈর্ঘ্য এবং সংক্ষিপ্ততম জয়।


পণ্ডিতিপনা

"উত্তর দ্বারা উত্তর পশ্চিম" একটি বৈধ কম্পাস দিক ছিল তা ভেবে আমি ভুল করেছি। একটি সুখী ভুল, যেহেতু এটি একটি চ্যালেঞ্জ ধারণা তৈরি করেছিল, কিন্তু আমি তখন উইকিপিডিয়া পৃষ্ঠা থেকে আবিষ্কার করেছি :

"আলফ্রেড হিচকক ১৯৫৯ চলচ্চিত্রের শিরোনাম, উত্তর বাই নর্থ ওয়েস্ট, 32-বায়ু কম্পাসের দিকনির্দেশনা নয়, তবে ফিল্মে উত্তর-পশ্চিম এয়ারলাইন্সের একটি উল্লেখ রয়েছে contains

এটিও সক্রিয় যে এই চ্যালেঞ্জের জন্য ব্যবহৃত পদ্ধতিটি কেবলমাত্র 16 পয়েন্টের কম্পাস সহ traditionalতিহ্যবাহী কম্পাস পয়েন্টগুলির সাথে সামঞ্জস্যপূর্ণ। সেই পৃষ্ঠাতে বর্ণিত 32-বায়ু কম্পাসটি সম্পূর্ণ ভিন্ন এবং আমি এই চ্যালেঞ্জের জন্য এর অস্তিত্বটি সুবিধামত উপেক্ষা করেছি।

শেষ অবধি, যে কেউ মনে করে আমার "দক্ষিণ পূর্ব" এর পরিবর্তে "দক্ষিণপূর্ব" ব্যবহার করা উচিত,


WNNNSE<= আপনার পোস্টের শুরুতে এই উদাহরণ এন্ট্রিটির আউটপুট কী হবে? এটি আমার কাছে অবৈধ মনে হলেও এটি বলা শক্ত।
তেনসিবাই

@ টেনসিবাই ইনপুট WNNNSEজন্য আউটপুট হবে 323.4375। ওয়াকথ্রুয়ের জন্য উদাহরণ বিভাগটি দেখুন যা একই ক্ষেত্রে একই ক্ষেত্রে প্রযোজ্য।
ট্রাইকোপলাক্স

ইনপুট কি f(N,N,N,S,E)ঠিক আছে?
কার্ল ন্যাপফ

@ কার্লনাপ্ফ আমি স্পষ্ট করতে ইনপুট বিভাগটি প্রসারিত করেছি। আমি যদি সঠিকভাবে বুঝতে পারি তবে একাধিক যুক্তির সাথে আপনার উদাহরণের ইনপুট অক্ষরের অনুক্রমের সমান বলে মনে হচ্ছে, সুতরাং এটি গ্রহণযোগ্য হবে।
ট্রিকোপলাক্স

2
"4 টি প্রতীক পড়ার ফলে তা পড়া ভয়ঙ্কর হয়ে ওঠে, তবে প্রদত্ত নির্ভুলতার সাথে জন্মদানকে বর্ণনা করার ছোট্ট উপায়ে অনুমতি দেয়" " - আপনি কি এ ব্যাপারে নিশ্চিত? দেখে মনে হচ্ছে এমন সমস্ত ইনপুট যেমন একই ভারবহনকে বর্ণনা করে তার দৈর্ঘ্য একই থাকে, যেহেতু আপনি যদি প্রতিটি বিয়ারিং 0 থেকে 1 এর মধ্যে একটি ডায়ডিক যুক্তিযুক্ত করেন তবে এন> 1 এর সাথে একটি দৈর্ঘ্য-এন স্ট্রিং সর্বদা ডিনোমিনেটর 2 with (এন) এর সাথে ডায়ডিক যুক্তির সাথে মিলে যায় +1) সর্বনিম্ন পদে। এছাড়াও, বিয়ারিংয়ে 2 টিরও বেশি স্বতন্ত্র বর্ণের অনুমতি দেওয়া কোনও অভিব্যক্তিক শক্তি যোগ করে না; 3 বা 4 টি বর্ণের সাথে প্রকাশিত যে কোনও বিয়ারিং 2 দিয়ে প্রকাশ করা যেতে পারে
ব্যবহারকারী 2357112 মনিকা

উত্তর:


13

জাভাস্ক্রিপ্ট (ES6), 84 80 78 74 72 বাইট

@ টিটাসকে একটি বাইট ধন্যবাদ সংরক্ষণ করা হয়েছে, @ নীলকে 1 টি ধন্যবাদ

f=([c,...s],b="NESW".search(c))=>b*90-(s[0]?(b-=f(s)/90)-4*(b*b>4):0)*45

এটি কিছুটা সময় নিয়েছিল, তবে আমি মনে করি অবশেষে আমি সূত্রটি নিখুঁত করে দিয়েছি ...

পরীক্ষার স্নিপেট

ব্যাখ্যা

আসুন সবচেয়ে সহজ কেস দিয়ে শুরু করা যাক: একটি একক-চর স্ট্রিং। ফলাফলটি স্ট্রিংয়ে কেবল তার (0-ইনডেক্সড) অবস্থান হয় NESW, 90 দ্বারা গুণিত হয়।

দ্বি-চর স্ট্রিংয়ের জন্য, ফলাফলটি প্রথম চরের ফলাফল এবং দ্বিতীয়টির ফলাফলের মধ্যে অর্ধেকের মধ্যে থাকে। যাইহোক, একটি ক্যাপচার রয়েছে: যদি উভয়ের মধ্যে পরম পার্থক্য 180 (যেমন NWবা WN) এর চেয়ে বেশি হয় তবে আমাদের অবশ্যই কোণটি 180 করতে হবে যাতে এটি বিপরীত দিকটি নির্দেশ না করে।

দীর্ঘতর স্ট্রিংয়ের জন্য, ফলাফলটি প্রথম চরের ফলাফল এবং বাকী স্ট্রিংয়ের ফলাফলের মধ্যে অর্ধেক অবধি থাকে। এটি নিম্নলিখিত উপায়ে সাধারণ করা যেতে পারে:

  • যদি ইনপুটটি একক চর হয় তবে তার সূচিটি NESW90 বারের স্ট্রিংয়ে ফেরান।
  • অন্যথায়, স্ট্রিংয়ের NESWসময় 45 এর প্রথম চরটির সূচকটি ফিরে আসুন, এবং বাকি স্ট্রিংয়ের অর্ধেক ফলাফল; দুটির মধ্যে পরম পার্থক্য 90 এর চেয়ে বেশি হলে একটি অতিরিক্ত 180 যুক্ত করুন।

প্রথম চরিত্রটি কেটে ফেলার দুর্দান্ত উপায়! আপনি 45 দ্বারা বিভক্ত মানগুলির সাথে গণনা করলে আপনি একটি বাইট সংরক্ষণ করতে পারেন
টাইটাস

@ টাইটাস আমি সেই কৌশলটি দিয়ে 2 বাইট সংরক্ষণ করতে পারি, ধন্যবাদ!
ETH প্রোডাকশনস

1
searchপরিবর্তে indexOfআপনি একটি বাইট সংরক্ষণ করুন।
নিল

@ নিল আবার ধন্যবাদ! আমি সমীকরণটি সম্পূর্ণ পুনরায় সাজিয়ে আরও তিনজনকে গল্ফ থেকে পরিচালিত করেছিলাম।
ইটিএইচ প্রডাকশন

10

সি # 6, 226 217 207 185 বাইট

using System.Linq;double N(string s){double b=f(s.Last());foreach(var c in s.Reverse()){b=(b+f(c)+(b-f(c)>2?4:f(c)-b>2?-4:0))/2;b=(b+4)%4;}return b*90;}int f(char x)=>"NESW".IndexOf(x);

সম্পাদনা: ইটিএইচ প্রডাকশনস এর জমা থেকে "ধার" ধারনা দ্বারা -10 বাইট @Titus
ধন্যবাদ

Ungolfed

// Call this method
double N(string s){
    // Initialize bearing with last direction
    double b=f(s.Last());
    // Do backward. Doing last direction once more doesn't impact result
    foreach(var c in s.Reverse()){
        // Average current bearing with new bearing, adjusted with wrapping
        b=(b+f(c)+(b-f(c)>2?4:f(c)-b>2?-4:0))/2;
        // Make bearing back to range [0,4)
        b=(b+4)%4;
    }
    // Change from "full circle = 4" unit to degree
    return b*90;
}
// helper method to convert direction to bearing. This returns bearing with full circle = 4.
int f(char x)=>"NESW".IndexOf(x);

আমি মনে করি আপনি%
ট্রাইকোপলাক্স

@ ট্রাইকোপলাক্স কি ডেসিমেল কাটবে না?
তিতাস


1
b=(b+360)%360;পরিবর্তে 10 বাইট সংরক্ষণ করুন b+=b>360?-360:b<0?360:0;। 90 এবং দ্বারা সমস্ত ভাগ করে অন্য 12 বাইট সংরক্ষণ করুন return b*90;
তিতাস

1
এখানে আরও 10 টি বাইট রয়েছে: দুটি অ্যাসাইনমেন্টটি মার্জ করুন এবং বন্ধনীগুলি সরান: b=(b+f(c)+(b-f(c)>2?4:f(c)-b>2?-4:0)+8)/2%4;তারপরে +8ফলাফলটি বিতরণ করুনb=(b+f(c)+(b-f(c)>2?12:f(c)-b>2?4:8))/2%4;
টাইটাস

8

পিএইচপি, 95 88 86 100 127 104 101 বাইট

  • নাল কোলেসিং অপারেটর দিয়ে -7 বাইট
  • -2 বাইটগুলি প্রতিস্থাপন না করে N(এবং আরও অনেক কিছু, কারণ এটি লুপের মাথায় অনুবাদটি দিতে দেয়: Nসত্যবাদী, তবে 0গণনায় মূল্যায়ন করে ))
  • দ্বিখণ্ডিত ( কাশি ) ঠিক করার জন্য +৪১ বাইট
  • -7 বাইটস সরাসরি এবং -16 পরোক্ষভাবে @ ETH প্রোডাকশনস কোড দ্বারা অনুপ্রাণিত
  • strtrআমার বিট জাগলিংগুলির একটিতে প্রতিস্থাপন করে -3 বাইট

for($i=strlen($s=$argv[1]);$i--;$p=($q+$p=$p??$q)/2+2*(abs($q-$p)>2))$q=ord($s[$i])/.8+3&3;echo$p*90;

এটি আমি প্রথমবারের মতো প্রথমবারের মতো নাল কোয়েলসিং অপারেটরটি ব্যবহার করি। সাথে চালাও -r

পিএইচপি 7.1

আসন্ন পিএইচপি সংস্করণে নেতিবাচক স্ট্রিং অফসেটগুলি 12 বাইট সংরক্ষণ করবে: এর সাথে এবং সাথে
প্রতিস্থাপন করুন ।strlen($s=$argv[1])0$s$argv[1]


(প্রায়) সবার জন্য বিনামূল্যে বাইট:

  • 0,90,180,270 এর পরিবর্তে 0,1,2,3 দিয়ে গণনা করা এবং 90 এর সাথে চূড়ান্ত ফলাফলটি গুণিত করা দুটি বাইট সংরক্ষণ করবে এবং সম্ভবত আরও গল্ফিংয়ের অনুমতি দেবে।
  • অক্ষরের ASCII কোডগুলিতে কিছু নিদর্শন রয়েছে। আপনার ভাষায় এর মধ্যে একটি ব্যবহার করে দেখুন:
    • (a/2%6+2)%5
    • a<87?a/2&3^3:3 অথবা a/2&3^3*(a<87)
    • a&1?a&2|a/4&1:0
    • a/.8-1&3

5

পাইথন 3, 133 113 বাইট

@ L3viathan এর উত্তরে কেবল উন্নতি হচ্ছে কারণ আমি এই অ্যাকাউন্টটি তৈরি করেছি এবং তাই এখনও মন্তব্য করতে পারি না।

d={"N":0,"E":.5,"S":1,"W":1.5}
def B(s):
 b=d[s[-1]]
 for c in s[::-1]:b=(b+d[c])/2+(abs(b-d[c])>1)
 return b*180

প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ এ আপনাকে স্বাগতম, এবং চমৎকার উন্নতি ...
ট্রাইকোপল্যাক্স

আমি আপনার উত্তরটি দেখতে পেলাম না, তবে
তিতাসেরও

5

05AB1E ,48 42 37 32 বাইট

Emigna ধন্যবাদ 6 বাইট সংরক্ষণ করা। সীমা [0,4 [এবং শেষের দিকে 90 দ্বারা গুণিত করার জন্য টাইটাসের ধারণার জন্য 5 বাইট সংরক্ষণ করা হয়েছে। প্রাচীন জোর / মডুলো রূপান্তরিত বিষয়ে আদনানের আয়ত্তের জন্য 5 বাইট সংরক্ষণ করা।

সুতরাং প্রতিটি কোণ কার্যকরভাবে জুড়ে [0,360 [পরিসীমা [0,4 [পরিসীমা থেকে কমিয়ে আনা হয়েছে। ফলাফলটি তখন 90 দ্বারা গুণিত হয় এবং প্রদর্শিত হয়।

Ç30^5%R¬U¦vXy+;DX-Ä0›2*+4%U}X90*

It can be divided into two sequentially called subprograms.
First program: convert input string into an array of the corresponding angles in range [0,4[
Ç      Take the ascii value of all input characters
 30^5% Dark ascii manipulation that yields [0,1,2,3] for [N,E,S,W]

Now we have an array of integers in range [0,4[.

Second program: actually compute the final angle
R                          Reverse the array
 ¬                         Take the first value (the last of the non-reversed array)
  U                        Pop it from the stack and set X to the same value
   ¦                       Strip the first element
    v                      For each remaining element
     Xy+;                  Compute the average value between the leftmost value and X
         DX-Ä0›            Push 1 if angular distance cast to integer is > 0 (i.e. if it is >= 1), 0 otherwise. It's equivalent to checking >= 90 degrees
               2*+         Multiply by 2 (=2 if angular distance is >= 1 and 0 otherwise) and add it to the formerly computed average value. It's equivalent to multiplying by 180
                  4%       Perform mod 4. It's equivalent to performing mod 360
                    U      Store the result back to X
                     }     End for, mandatory if input has only one character
                      X90* Push X*90 and implicitly display it

এটি অনলাইন চেষ্টা করুন!

গল্ফিংয়ের সম্ভাব্য অক্ষ:

  • নিশ্চিত না যে সেই মড 4 প্রয়োজন হয় (এটি 2 বাইট সংরক্ষণ করবে)। সমস্ত পরীক্ষার কেসগুলি এগুলি ছাড়া কাজ করে তবে সম্ভবত একটি জটিল ঘটনা উপস্থিত রয়েছে। এটি বৈধকরণ বা বাতিল করার জন্য একটি গাণিতিক প্রমাণ শীর্ষস্থানীয় হবে।
  • ফলাফল প্রদর্শন ছাড়াও কোনও অন্তর্নিহিত জিনিস নেই (উদ্ধৃতি চিহ্নগুলি বন্ধ করা, বন্ধনী বন্ধ করা)।

1
পরীক্ষা NNNNNNNNNNNNNNNNNNNNNNNESNNNNNNNNNNNNNNNNNNNNNNNEপরীক্ষার ক্ষেত্রে অনুরোধ করা ফলাফল বলে মনে হচ্ছে না ।
এমিগনা

2
রহস্যময়। এখন আমিও করি। আমি অবশ্যই ভুল বা কিছু আটকিয়েছি, দুঃখিত। আপনি কোডটি নীচে ছোট করতে পারেন v"NESW"yk90*})R¬U¦vXy+;DX-Ä89›180*+360%U}X
এমিগানা

1
দুর্দান্ত ব্যাখ্যা! এটি একটি নোট সহ মূল্য সহকারে মূল্যবান হতে পারে যার 89›অর্থ হল পূর্ণসংখ্যার অংশটি 89 এর চেয়ে বেশি, যা সম্পূর্ণ সংখ্যা 90 এর চেয়ে বেশি বা সমান (যা এখনও ঠিক কাজ করে কারণ ঠিক 90 কখনই ঘটে না) বলে সমান to বর্তমানে বর্ণিত কোডটিতে করা মন্তব্যটি এটির মতো শোনাচ্ছে যা এটি 89 টিরও বেশি বেশি যাচাই করে, আপনার কোডটি পরীক্ষার ক্ষেত্রে উত্তীর্ণ হয় তাই 90 এর চেয়ে বেশি জন্য সঠিকভাবে পরীক্ষা করা হয়
ট্রাইকপ্লেক্স

1
আমি ব্যাখ্যাটি তাই সম্পাদনা করেছি, তবে আমি "কাস্ট টু পূর্ণসংখ্যা" লিখেছিলাম যেহেতু আমি নিশ্চিত নই যে অপারেটরটি নেতিবাচক ভাসমান বিন্দুর মানগুলির সাথে আচরণ করা উচিত should এখানে কোনও সমস্যা নেই যেহেতু এটি নিখুঁত মানের উপর কাজ করে তবে আমি অপারেটরের উপর খুব দৃ strong় অনুমান করা পছন্দ করি না।

1
আপনি এর v"NESW"yk})সাথে প্রতিস্থাপন করতে পারেন Ç30^5%:)
আদনান

5

পাইথন 3, 146 145 117 107 97 94 93 92 বাইট

f(s):u='NESW'.find(s[0])*90;return(u+f(s[1:]))/2+180*(abs(u-‌​f(s[1:]))>180)if s[1:]else u

fস্ট্রিং সহ কল করুন ।


...0elseসিন্ট্যাক্সেররগুলি ফেলে দেওয়া দু'জনেই আপনার থাকতে পারে না ।
জোনাথন অ্যালান

@ জোনাথন অ্যালান আপনি পাইথনের কোন সংস্করণ ব্যবহার করছেন? আমি 3.5.2 এ আছি এবং এটি কাজ করে।
L3viathan

আমি এটা 3.3.3 উপর স্থাপিত - আপনি মধ্যে স্থান অপসারণ করতে পারেন elseএবং -বাড়ছে কি? (3.3.3 এ পারেন)
জোনাথন অ্যালান

@ জোনাথন অ্যালান হ্যাঁ পারি! ধন্যবাদ, এটি আমার আরও একটি বাইট সংরক্ষণ করে।
L3viathan

2
@ টিটাস d.findপারেন, আমি এক মিনিট আগে সঠিক ধারণা পেয়েছিলাম; আপডেট উত্তর দেখুন।
L3viathan

5

সি, 184 বাইট

double h(char c){return ((c=='E')+(c=='S')*2+(c=='W')*3);}double d(char*s){double f=h(*s);if(s[1]){double t=f;f=(f+d(s+1)/90)/2;if(((t-f)>1)||((f-t)>1))f+=2;if(f>=4)f-=4;}return f*90;}

Ungolfed

// a helper function
double direction_(char ch)
{
    if (ch=='N')
        return 0.;
    else if (ch=='E')
        return 90.;
    else if (ch=='S')
        return 180.;
    else
        return 270.;
}

// this is the main function to call
double direction(char* str)
{
    double fAngle = direction_(str[0]);
    if (str[1])
    {
        double tmp = fAngle + direction(str+1);
        if (tmp>=360.)
            tmp-=360.;
        tmp/=2;

        if (((tmp-fAngle)>90.) || ((tmp-fAngle)<-90.))
        { //  check if we need to take the "other side"; if the resulting angle is more than 90 degrees away, we took the wrong on
            if (tmp>=180.)
                tmp-=180.;
            else
                tmp+=180.;
        }
        fAngle = tmp;
    }
    return fAngle;
}

মনে হচ্ছে ভাসা ব্যবহার করে আপনাকে প্রয়োজনীয় যথার্থতা দেয় না।
ইয়াল লেভ

4
পিপিসিজিতে আপনাকে স্বাগতম! : ডি
mbomb007

ফাংশনগুলির নামগুলি একে অপরের সাথে বিরোধ করবে না (যেহেতু নামগুলি উভয়ই d)?
ক্লিষ্টিক

@ কিওয়ার্প, বিভিন্ন স্বাক্ষর (একজনের জন্য চার * লাগে, অন্যটি কেবল চরে নেয়)
এয়াল লেভ

2
ফাংশনটির নামগুলি সি -+ তে ম্যাংড করা নাম নয়, সুতরাং আপনি যদি এটি সি হতে চান তবে তাদের একটির নাম পরিবর্তন করতে হবে
Klas Lindbäck

3

আর, 172 146 বাইট

z=rev((0:3*90)[match(scan(,""),c("N","E","S","W"))]);p=z[1];l=length(z);for(i in 2:l)p=(p+z[i])/2+(abs(p-z[i])>180)*180;if(l<2)p=z;sprintf("%f",p)

Ungolfed

z=rev((0:3*90)[match(scan,""),c("N","E","S","W"))]); #1
p=z[1];                                              #2
l=length(z)                                          #3
for(i in 2:l)p=(p+z[i])/2+(abs(p-z[i])>180)*180;     #4
if(l<2)p=z                                           #5
sprintf("%f",p)                                      #6

ব্যাখ্যা

  1. স্টিডিনের কাছ থেকে ইনপুট পড়ুন
    • সূচী দ্বারা ইনপুট ম্যাচ করুন c("N","E","S","W")
    • মিলে যাওয়া সূচকগুলি থেকে: ডিগ্রির ভেক্টরের সাথে মেলে 0:3*90(পরিবর্তে c(0,90,180,270))
    • বিপরীত এবং হিসাবে সংরক্ষণ করুন z
  2. ইনপুটটিতে pশেষ চরের সমতুল্য ডিগ্রির সূচনা করুন
  3. হিসাবে ইনপুট দৈর্ঘ্য l
  4. স্বতঃস্ফূর্তভাবে, দুটি সম্ভাব্য দ্বিখণ্ডিত বিয়ারিংয়ের সবচেয়ে নিকটতম গণনা করুন।
  5. যদি কেবল একটি ইনপুট দেওয়া হয় তবে সেট pকরুনz
  6. ফর্ম্যাট এবং মুদ্রণ

আর-ফিডল পরীক্ষার কেসগুলি চেষ্টা করে দেখুন (দ্রষ্টব্য যে scanআর-ফিডলটিতে কাজ না করার কারণে এটি একটি ফাংশন )


প্রদত্ত যে আউটপুটটি 5 দশমিক স্থানে সঠিক, আপনার রাউন্ডিং করার দরকার নেই। চ্যালেঞ্জ থেকে: Outputs 0.00001 and 0.000005 are both correct.সুতরাং আপনি গোল না করে কিছু বাইট সংরক্ষণ করতে সক্ষম হবেন
ট্রাইকপ্লেক্স

পছন্দ করুন ইনপুট এছাড়াও স্ট্রিং অক্ষরের ভেক্টর হতে পারে। c("N","N","E")এর বদলে "NNE"? এটি একটি অ-নেস্টেড অজগর তালিকার সমতুল্য ["N","N","E"]
বিলিওব

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

1
আমি মনে করি আপনি 90 টি এবং প্রিন্টফের (পি * 90) দিয়ে ভাগ করে নিলে আপনি 4 বাইট সংরক্ষণ করতে পারবেন।
তিতাস

3

হাস্কেল, 109 105 103 বাইট

h=180
a#b|abs(a-b)<h=n|n>h=n-h|1>0=n+h where n=(a+b)/2 -- calculates the new "mean" on the cirlce
f 'N'=0                                          -- translates characters to angles
f 'E'=90
f 'S'=h
f _=270
foldr1(#).map f                                  -- traverses the whole string

@ Xnor -2 বাইটের জন্য ধন্যবাদ!


সম্পূর্ণরূপে fদেখতে দীর্ঘ তালিকা প্রদর্শন করা হয়েছে , তবে ছোট কিছু খুঁজে পেতে আমার সমস্যা হচ্ছে। আমার কাছে সবচেয়ে কাছের ছিল f c=90*until(\i->"NESW"!!i==c)(+1)0(35)। আমার মনে হয় আপনি প্রতিস্থাপন করতে পারেন 'W'সঙ্গে _
xnor

হ্যাঁ আমিও আশা করছিলাম সেখানে আরও কিছু সংক্ষিপ্ত হবে, কিন্তু কিছুই পাইনি। জন্য ধন্যবাদ _!
flawr

3

ডায়ালগ এপিএল , 55 45 38 বাইট

সমাধান

প্রয়োজনীয় ⎕IO←0, যা অনেক সিস্টেমে ডিফল্ট। দিকের জন্য জিজ্ঞাসা।

360|÷○÷180×12○(+÷(|+))/¯12○○2÷⍨'NES'⍳⍞

ব্যাখ্যা

প্রতিটি অক্ষরকে জটিল সংখ্যায় 1∠ θa + b to i তে রূপান্তর করে সমস্যাটি ঘুরে দেখেন , তারপরে প্রতিটি পদক্ষেপে স্বাভাবিক করার সময় ডান থেকে বামে (এপিএল এর ফোর) থেকে যোগফল হ্রাস করুন। চূড়ান্ত θ এর পরে ডিগ্রিতে রূপান্তরিত হয় এবং [0, 360) এর মধ্যে সাধারণীকরণ করা হয়:

'NES'⍳⍞"এনইএস" এর প্রতিটি ইনপুট চিঠির সূচকগুলি; এন → 0, ই → 1, এস → 2, অন্য কিছু → 3

○2÷⍨রেডিয়ানে কোণে রূপান্তর; θ = π · x2

¯12○ইউনিট বৃত্তের জটিল সংখ্যায় রূপান্তর; e i · θ

(... এর )/সাথে তালিকাটি হ্রাস করুন ... (যেমন উপাদানগুলির মধ্যে ফাংশনটি সন্নিবেশ করুন ...)

+÷(|+)... স্বাভাবিক অঙ্ক; x n - 1 + x n| x এন - 1 + এক্স এন |

12○কোণে রূপান্তর; θ

÷○÷180×ডিগ্রীতে রূপান্তর; 1π · 1180 · x

360| বিভাগ দ্বারা অবশিষ্ট যখন 360 দ্বারা বিভক্ত

অনলাইনে চেষ্টা করুন!

গপ্প

যদি ইনপুট এবং আউটপুটটি অर्थোগোনাল জটিল ইউনিটগুলির মতো হয় তবে পুরো সমাধানটি কেবলমাত্র:

(+÷(|+))/

কোডের বাকি অংশগুলি ইনপুট এবং ফর্ম্যাটিং আউটপুটকে বিশ্লেষণ করছে।


আমি লক্ষ্য করেছি যে পরীক্ষার আউটপুটগুলি চ্যালেঞ্জের সাথে 5 দশমিক স্থানে মেলে না, এটি অবৈধ করে তোলে। ডায়ালগ এপিএলে কি ডাবল স্পষ্টতা ব্যবহারের বিকল্প রয়েছে?
ট্রাইকোপলাক্স

@ থ্রিচোপ্লেক্স হ্যাঁ, ⎕FR←1287128 বিট ফ্লোট ব্যবহার করে তবে ট্রাইএপিএল এটির অনুমতি দেয় না।
অ্যাডম

আমি মনে করি 64৪ বিট ফ্লোটের চেয়ে বড় বা সমান যে কোনও কাজ করা উচিত (আমি যদিও পাইথনটিতেই পরীক্ষা করেছি)। এর অর্থ কি আপনি কোডটি বৈধ করতে পারবেন তবে এটি তখন কেবল ভাষা ইনস্টলকারীদের জন্য কাজ করবে? হতে পারে আপনি স্কোরের জন্য পুরো বৈধ কোডটি প্রদর্শন করতে পারেন এবং অনলাইনে সংস্করণটি অন্তর্ভুক্ত করতে পারেন যাতে প্রয়োজনীয় যথাযথতা নেই যাতে লোকেরা দেখতে পারে যে অ্যালগোরিদমটি সঠিক is
ট্রাইকোপলাক্স

@ ট্রাইকোপ্লেক্স আসলে, ট্রাইএপিএল দ্বিগুণ নির্ভুলতা ব্যবহার করে তবে আপনার পরীক্ষার কেসগুলি 53 বিটেরও বেশি ত্রুটি জমা করে।
অ্যাডাম

যদি এটি দেখানো যায় যে আইইইই 754 স্ট্যান্ডার্ডের ব্যাখ্যার পার্থক্যের কারণে পার্থক্য রয়েছে, এটি এখনও মান সম্মত, তবে আমি উভয় ব্যাখ্যা একই সাথে 5 দশমিক স্থানে দেবে তা নিশ্চিত করার জন্য আমি পরীক্ষার কেসগুলি সামঞ্জস্য করব। আমি পরীক্ষার কেসগুলি এমনটি বেছে নিয়েছি যে তারা পাইথনের 5 টি দশমিক স্থানে ভাসমান (ডাবল নির্ভুলতা) এবং স্বেচ্ছাসেবী যথার্থ দশমিকের জন্য একই ফল দেয় gave আমি এটি দেখতে হবে।
ট্রাইকোপল্যাক্স

2

কমন লিস্প, 347 327 বাইট

কিছুটা খুলে দেওয়ার জন্য @ টিটাসকে ধন্যবাদ

এটি সম্ভবত আরও গল্ফ করা যেতে পারে তবে কমপক্ষে এটি কার্যকর হয় (আমার ধারণা):

(defun d(c)(if(eql c #\N)0(if(eql c #\E)1(if(eql c #\S)2(if(eql c #\W)3)))))(defun m(a b)(if(> a b)(rotatef a b))(if(<(+(- 4 b)a)(- b a))(+(/(+(- 4 b)a)2)b)(+(/(- b a)2)a)))(defun f(s)(let((c))(setf c(d(char s(1-(length s)))))(do((a)(p(-(length s)2)(1- p)))((< p 0))(setf a(char s p))(setf c(m(d a)c)))(format t"~5$"(* c 90))))

ব্যবহার:

* (f "WNE")
337.50000
NIL

ফাংশন dএকটি অক্ষর লাগে N, E, W, অথবা Sএবং আয় উপযুক্ত ডিগ্রী। ফাংশন mদুটি প্রদত্ত দিকনির্দেশের সম্মিলিত ডিগ্রি লাভ করে। fপ্রদত্ত স্ট্রিংয়ের মাধ্যমে ফাংশন পুনরাবৃত্তি করে, উপযুক্ত ডিগ্রি গণনা করে এবং এটি একটি ভাসমান বিন্দু হিসাবে মুদ্রণ করে।


আমার এলআইএসপি মরিচা, তবে কি 90 টি দিয়ে 6 টি বাইট বাদ দিয়ে সবকিছু ভাগ করা যায়?
তিতাস

টাইটাস আমার মনে হয় এটি হবে। আমি কিছু অন্যান্য উন্নত উপলব্ধি করেছি যাতে আমি এই যুক্ত করতে হবে আমি আমার কম্পিউটার আছি
artificialnull

2

Befunge, 183 181 175 বাইট

>~#+:#25#%6*#/`#2_$>5%4*:00p"Z}"4*:***20g#v_+2/00g10g-:8`\0\-8`+!v
v5:+*:*:"d"/+55+5$_^#!:\p01/**:*4"}Z":p020<%**:*"(2Z"+**5*:*"0}"!<
>5>+#<%#56#58#:*#/+\#5:#5_$$$,,,".">:#,_@

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

এটি অন্যান্য অনেক উত্তরের অনুরূপ অ্যালগরিদম অনুসরণ করে, কেবল এটি পূর্ণসংখ্যার সাথে অনুকরণযুক্ত স্থির বিন্দু গণনা ব্যবহার করে যেহেতু বেফঞ্জ ভাসমান পয়েন্টটি সমর্থন করে না।

ASCII থেকে টু-ইন রুটিনের জন্য @ টিটাসকে ধন্যবাদ ।

 ~ : 5 6* ` _$        while ((c = getchar()) > 30)  // ends with any ctrl char or EOF
> + 2 %6 / 2            push(c / 2 % 6 + 2)         // partial conversion to int

                      do {
  5%                    dir = pop() % 5             // completes the conversion to int   
  4*:00p                dir *= 4; lowres_dir = dir  // used by the 180-flip calculation
  "Z}"4*:***            dir *= 22500000             // this is 90000000 / 4 
  20g_                  if (!first_pass) {
    +2/                   dir = (dir+last_dir)/2    // last_dir is second item on stack
    00g10g-               diff = lowres_dir - last_lowres_dir
    :8`\0\-8`+!!          flip = diff>8 || -diff>8
    "}0"*:*5**+           dir += flip * 180000000   // add 180 degrees if we need to flip
    "Z2("*:**%            dir %= 360000000          // keep within the 360 degree range
                        }
  020p                  first_pass = false
  :"Z}"4*:**/10p        last_lowres_dir = dir / 22500000
  \                     last_dir = dir              // saved as second item on stack
  :!_                 } while (!stack.empty())

$                     pop()                         // this leaves the final dir on top
5+55+/                dir = (dir + 5)/10            // round down to 5 decimal places
"d":*:*+              dir += 100000000              // add a terminating digit
                      while (true) {                // convert into chars on stack
:55 + % 6 8 * +\ : _    push(dir%10+'0'); if (!dir) break
   > < 5 5 : /+ 5 5     dir /= 10
                      }

$$$                   pop() x 3                     // drop the chars we don't need
,,,                   putchar(pop()) x 3            // output first three chars
"."                   push('.')                     // add a decimal point
>:#,_@                while(c=pop()) putchar(c)     // output the remaining chars

এর অর্থ কি কেবল আপনার বৃহত্তর নির্দিষ্ট পয়েন্টের ধরণের (আরও দশমিক স্থান) অনুকরণ করতে হবে? পরীক্ষার কেসগুলি দ্বিগুণ নির্ভুলতার জন্য ডিজাইন করা হয়েছে, যা 17 টি উল্লেখযোগ্য পরিসংখ্যান (সর্বাধিক 16 দশমিক স্থান) নয়, এবং 14 দশমিক স্থান সম্ভবত যথেষ্ট হবে।
ট্রিকোপলাক্স

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