আপেক্ষিক বনাম পরম


17

যদি এই গ্রিডের উত্তর পয়েন্টে উত্তর দিকে কেউ মুখোমুখি হয় তবে বি নির্দেশ করতে সবুজ পথ অনুসরণ করতে নির্দেশিকা চাইছিল (যেহেতু তারা কেবল গ্রিডলাইনগুলিই অনুসরণ করতে পারে) আপনি তাদের বলতে পারেন:

যাও North, North, West, East, East, South, East, East

বা সমতুল্য

যাও Forward, Forward, Left, Back, Forward, Right, Left, Forward
(যেখানে ডান , বাম , বা পিছনের একটি আদেশের অর্থ স্পষ্টভাবে সেই দিকে ঘুরিয়ে দেওয়া, তারপরে এগিয়ে যান))

ক থেকে বি পাথ

একটি যুক্তি সহ এমন একটি ফাংশন লিখুন যা কেবল একই পয়েন্টে নয়, একই পথ ধরে এই পরম এবং আপেক্ষিক দিকনির্দেশগুলির মধ্যে অনুবাদ করে । ধরে নিন নির্দেশিত ব্যক্তি সর্বদা উত্তরের দিকে শুরু হয়।

যদি আর্গুমেন্টটি অক্ষরের একটি স্ট্রিং হয় NSEWতবে সমপরিমাণের তুলনামূলক দিকটি ফিরিয়ে দিন।
যেমন f("NNWEESEE")স্ট্রিং প্রদান করে FFLBFRLF

যদি আর্গুমেন্টটি অক্ষরের একটি স্ট্রিং হয় FBLRতবে সমপরিমাণ পরম দিকটি ফিরিয়ে দিন।
যেমন f("FFLBFRLF")স্ট্রিং প্রদান করে NNWEESEE

খালি স্ট্রিং নিজেই ফলন করে। অন্য কোনও ইনপুট কেস ধরে নেই।

যদি আপনার ভাষাতে ফাংশন বা স্ট্রিং না থাকে তবে যা উপযুক্ত মনে হয় তা ব্যবহার করে।

বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।


আমরা কি ধরে নিয়েছি যে কোনও ব্যক্তি সর্বদা উত্তর দিকে মুখ করে শুরু করে? পূর্ব দিকের দিকে যেতে অপেক্ষাকৃত দিক থেকে, তাকে কেবল ডানদিকে ঘোরানো দরকার, কেবল ফরোয়ার্ড বলার চেয়ে
অপ্টিমাইজার

@ অপ্টিমাইজার হ্যাঁ, উত্তর। এবং হ্যাঁ আপনার অন্য বিষয়। শুরুতে Rসমান E
ক্যালভিনের

1
হ্যাঁ! আমি সবসময় যা ভেবেছিলাম তা নিশ্চিত করার জন্য আপনি নিজের ছবিটি পরিবর্তন করেছেন!
জাস্টিন

4
আপনি আবার পিপিসি হুক হয়? ;)
মার্টিন এন্ডার

4
@ মার্টিনব্যাটনার হয় তা হয় বা আমি আমার হোম ওয়ার্ক সমস্যার সমাধান করতে খুব ভাল। ;)
ক্যালভিনের

উত্তর:


6

CJam, 57 53 49

{"NESW""FRBL"_3$&!!:Q$:R^^f#0\{{+0\}Q*_@-R=\}%);}

পূর্ববর্তী সংস্করণ

{"NESW""FRBL"_3$0=#W>:Q{\}*:R;f#0\{{+0\}Q*_@-R=\}%);}

উদাহরণ:

{"NESW""FRBL"_3$0=#W>:Q{\}*:R;f#0\{{+0\}Q*_@-R=\}%);}:T;
"NNWEESEE"T
N
"FFLBFRLF"T

আউটপুট:

FFLBFRLF
NNWEESEE

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

{
  "NESW""FRBL"             " Push the two strings. ";
  _3$0=#W>                 " Check if the first character is in FRBL. ";
  :Q                       " Assign the result to Q. ";
  {\}*                     " Swap the two strings if true. ";
  :R;                      " Assign the top string to R and discard it. ";
  f#                       " Find each character of the input in the string. ";
  0\                       " Push a 0 under the top of the stack. ";
  {                        " For each item (index of character): ";
    {                      " If Q: ";
      +0\                  " A B -> 0 (A+B) ";
    }Q*
    _@-                    " C D -> D (D-C) ";
    R=                     " E -> E-th character in R ";
    \                      " Swap the top two items. ";
  }%
  );                       " Discard the last item in the list. ";
}

6

সি ++, 99 97

নীচে ল্যাম্বডা এক্সপ্রেশন হিসাবে ফর্ম্যাট করা হয়েছে। এটি একটি char*যুক্তি নেয় এবং এটি ওভাররাইট করে।

[](char*s){for(int d=0,n=0,c=*s*9%37&4;*s;d+=n)c?n=*s%11/3-d:n+=*s%73%10,*s++="NESWFRBL"[c|n&3];}

যারা এই বৈশিষ্ট্যটির সাথে পরিচিত নন (আমার মতো 1 ঘন্টা আগে), এটি নীচে ব্যবহার করুন:

#include <iostream>

int main()
{
    char s[] = "NNWEESEE";
    auto x = [](char*s){for(int d=0,n=0,c=*s*9%37&4;*s;d+=n)c?n=*s%11/3-d:n+=*s%73%10,*s++="NESWFRBL"[c|n&3];};

    x(s); // transform from absolute to relative
    std::cout << s << '\n';

    x(s); // transform from relative to absolute
    std::cout << s << '\n';
}

কিছু ব্যাখ্যা:

  • কোড ব্যবহার করার সময় flag ? (x = y) : (x += z) , দ্বিতীয় জুটির প্রথম বন্ধনী সি তে প্রয়োজনীয় হয় সুতরাং আমি পরিবর্তে সি ++ ব্যবহার করেছি!
  • সি ++ এর জন্য কোনও ফাংশনের জন্য রিটার্নের ধরণ উল্লেখ করা দরকার। আমি যদি ল্যাম্বডা এক্সপ্রেশন না ব্যবহার করি তবে তা! একটি যুক্ত বোনাস হ'ল ফাংশনটির নামে আমার 1 টি অক্ষর নষ্ট করার দরকার নেই।
  • কোড *s*9%37&4 প্রথম বাইট পরীক্ষা করে; ফলাফলটি যদি 4 টির মধ্যে একটি হয় NESW; 0 অন্যথায়
  • কোড *s%11/3 বাইটগুলি NESW0, 1, 2, 3 তে রূপান্তর করে
  • কোড *s%73%10 বাইটগুলি FRBL0, 9, 6, 3 তে রূপান্তর করে (যা 0, 1, 2, 3 মডিউল 4)
  • আপেক্ষিক দিকনির্দেশকে নিখুঁত রূপান্তর করার সময়, আমার dভেরিয়েবলের প্রয়োজন হয় না । কোডটি সম্পূর্ণরূপে মুছে ফেলার জন্য আমি পুনরায় সাজানোর চেষ্টা করেছি, তবে এটি অসম্ভব বলে মনে হচ্ছে ...

1
আপনার অক্ষরটিকে সংখ্যায় রূপান্তর করার পদ্ধতিটি আমার পছন্দ। :)
এমিল

6

জাভাস্ক্রিপ্ট (E6) 84 86 88 92 104

সম্পাদনা করুন:% এর পরিবর্তে & এর পরিবর্তে অপারেটরের অগ্রাধিকার (কম বন্ধনী) এবং নেতিবাচক সংখ্যার সাথে আরও ভাল কাজ করে সম্পাদনা 2
: | + এর পরিবর্তে, আবার অগ্রাধিকার, -2। ধন্যবাদ ডকম্যাক্স
এডিট 3: অ্যারে বোঝাপড়া স্ট্রিংয়ের জন্য মানচিত্র () এর চেয়ে 2 টি অক্ষর কম

F=p=>[o+=c[d=n,n=c.search(i),n<4?4|n-d&3:n=n+d&3]for(i of n=o='',c='NESWFRBL',p)]&&o

টেস্ট ফায়ারফক্স / ফায়ারবাগ কনসোলটি

console.log(F('NNWEESEE'),F('FFLBFRLF'))

আউটপুট

FFLBFRLF NNWEESEE

@ অপ্টিমাইজার আর নেই। এবং আরও সঙ্কুচিত হওয়ার আশা করছি।
edc65

কি && oশেষ গড় এ?
bebe

2
@ ম্যাপের ফাংশনটি পার্শ্বপ্রতিক্রিয়া হিসাবে এর ভিতরে একটি অ্যারে প্রদান করে, আমি ও স্ট্রিংটি পূরণ করি যা আমার ফিরে আসতে হবে। array && valueযে valueকোনও অ্যারে মূল্যায়ন হিসাবে truthy
এডিট

1
অবশেষে! আমি এই এক দিকে তাকিয়ে হয়েছে যেহেতু এটি 88. আঘাত যদি না আমি কিছু অনুপস্থিত করছি, আপনি প্রতিস্থাপন করতে পারেন 4+(n-d&3)সঙ্গে 4|n-d&3এবং 2 অক্ষর সংরক্ষণ।
ডকম্যাক্স

4

এপিএল, 72

{^/⍵∊A←'NESW':'FRBL'[1+4|-2-/4,3+A⍳⍵]⋄A[1+4|+\'RBLF'⍳⍵]}

যদি দোভাষী ব্যতীত দোভাষী কনফিগারেশনগুলি পরিবর্তন করা যায়, তবে স্কোরটি 66 , এ পরিবর্তন ⎕IOকরে 0:

{^/⍵∊A←'NESW':'FRBL'[4|-2-/0,A⍳⍵]⋄A[4|+\'FRBL'⍳⍵]}

3

পাইথন, 171 139

অন্যান্য সমাধানগুলির মতো সংক্ষিপ্ততর কোনও উপায় নয়, তবে আমার ধারণা পাইথন দিয়ে কী করা যায় তার জন্য এটি তুলনামূলকভাবে ভাল হওয়া উচিত:

def f(i):a,b='NWSE','FLBR';I=map(a.find,'N'+i);return''.join((b[I[k+1]-I[k]],a[sum(map(b.find,i)[:k+1])%4])[-1in I]for k in range(len(i)))

সামান্য ভাল পাঠযোগ্যতার জন্য প্রসারিত সংস্করণ:

def f(i):
    a, b = 'NWSE', 'FLBR'
    I = map(a.find,'N'+i)     # translate to numbers assuming abs. directions
    J = map(b.index,i)        # translate to numbers assuming rel. directions
    if not -1 in I:
        o = [b[I[k+1]-I[k]] for k in range(len(i))]    # rel. dir. is differences of abs. dir.
    else:
        o = [a[sum(J[:k+1])%4] for k in range(len(i))] # abs. dir. is sum of all rel. dir. so far
    return ''.join(o)

1

যান, 201

type q string;func F(s q)q{d,z:=byte(0),make([]byte,len(s));for i,c:=range[]byte(s){if(c^4)*167%3<2{c=c*156%5;z[i],d="LBRF"[(d-c)%4],c-1;}else{c=(c^43)*3%7-1;d=(d+c)%4;z[i]="NESW"[d];};};return q(z);}

পঠনযোগ্য সংস্করণ:

func F(s string) string {
    d, z, R, A := 0, make([]byte, len(s)), "LBRFLBR", "NESW"
    for i, c := range []byte(s) {
        switch c {
        case 'N': c = R[d+3]; d = 0
        case 'E': c = R[d+2]; d = 1
        case 'S': c = R[d+1]; d = 2
        case 'W': c = R[d]; d = 3
        case 'F': c = A[d]
        case 'R': d = (d + 1) % 4; c = A[d]
        case 'B': d = (d + 2) % 4; c = A[d]
        case 'L': d = (d + 3) % 4; c = A[d]
        }
        z[i] = c
    }
    return string(z)
}


1

জিএনইউ সেড, 356 বাইট

চ্যালেঞ্জটি অক্ষরের একটি স্ট্রিমে একটি সাধারণ রূপান্তর চেয়েছে। sed, স্ট্রিম সম্পাদক হ'ল ভাষার স্পষ্ট পছন্দ ;-)

/[FRBL]/bx                                     # Jump to label x if relative
:y                                             # label y (start of abs->rel loop)
/[FRBL]$/q                                     # quit if string ends in rel char
s/(^|[FRBL])N/\1F/;ty                          # Substitute next abs char with
s/(^|[FRBL])E/\1R/;tr                          #     rel char, then jump to
s/(^|[FRBL])S/\1B/;tb                          #     relevant rotation label if
s/(^|[FRBL])W/\1L/;tl                          #     a match was found
by                                             # loop back to y
:r;y/NESW/WNES/;by                             # Rotation labels: transform then
:b;y/NESW/SWNE/;by                             #     loop back to y
:l;y/NESW/ESWN/;by
:x                                             # label x (start of rel->abs loop)
/^[NESW]/q                                     # quit if string starts w/ abs char
/F([NESW]|$)/s/F([NESW]|$)/N\1/                # Matches for each direction:
/R([NESW]|$)/y/NESW/ESWN/;s/R([NESW]|$)/E\1/   #     rotate, then substitute
/B([NESW]|$)/y/NESW/SWNE/;s/B([NESW]|$)/S\1/
/L([NESW]|$)/y/NESW/WNES/;s/L([NESW]|$)/W\1/
bx                                             # loop back to x

(গল্ফ স্কোর গণনার উদ্দেশ্যে মন্তব্যগুলি এবং স্পেসগুলি ছিনিয়ে নেওয়া)

আউটপুট:

$ sed -rf absrel.sed <<< NNWEESEE
FFLBFRLF
$ sed -rf absrel.sed <<< FFLBFRLF
NNWEESEE
$ 

ব্যাখ্যা:

এখানে ধারণাটি হ'ল আমরা যখন রেফারেন্সের ফ্রেমটি পরিবর্তন করি তখন সবসময় {N, E, S, W}এবং এর মধ্যে সরাসরি ম্যাপিং থাকে {F, R, B, L}

আপেক্ষিকের সাথে নিরঙ্কুশতার ক্ষেত্রে আমরা স্ট্রিংয়ের সাহায্যে প্রিয়তমা কাজ করি। প্রতিটি চরিত্রের জন্য আমরা মানচিত্র {N, E, S, W}করি {F, R, B, L}, তারপরে বাকীটি ঘোরান[NESW] অক্ষর অনুসারে অক্ষরগুলি , তারপরে পরবর্তী অক্ষরটিতে চলে যান।

পরম সম্পর্কিত সম্পর্কিত ক্ষেত্রে আমরা বিপরীতটি করি। আমরা স্ট্রিংয়ের মাধ্যমে পিছনের দিকে কাজ করি, [NESW]অবিলম্বে সামনে অক্ষর অনুযায়ী নিম্নলিখিত সমস্ত অক্ষর ঘোরান । তারপর আমরা যে বর্ণ-সংকেত মানচিত্র {N, E, S, W}থেকে {F, R, B, L}, যতক্ষণ না আমরা স্ট্রিং এর শুরু পেতে।


0

হাস্কেল, 224

import Data.Function
i=flip(\x->length.takeWhile(/=x))
r=['F','R','B','L']
a=['N','E','S','W']
f s@(x:_)|elem x a=map((r!!).(`mod`4).(4-))$zipWith((-)`on`(i a))('N':s)(s)|True=tail$map((a!!).(`mod`4)).scanl(+)(0)$map(i r) s

এটি আপেক্ষিক দিকগুলিতে রোটেশন নম্বরগুলি নির্ধারণ করে এবং নিখুঁত দিকগুলিতে ওরিয়েন্টেশন সংখ্যাগুলি নির্ধারিত করে, তারপরে হয় ক্রমবর্ধমান ঘোরাঘুরির পরে ক্রমাগত প্রবর্তন বা ওরিয়েন্টেশনগুলির মধ্যে ঘূর্ণনগুলি আবিষ্কার করে। iফাংশন দুই কিংবদন্তী মধ্যে সূচক খুঁজে বের করে।

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