আমাদের কি বন্ধু হওয়া উচিত?


30

নোট করুন এটি মূলত কেন্দ্র করে একটি প্রশ্ন question

ভূমিকা

লোকেরা বন্ধুবান্ধব হোক! এর মতো, তারা বন্ধুদের পরামর্শ দেওয়ার জন্য একটি নতুন সিস্টেম বাস্তবায়ন করছে! আপনার কাজটি হল বেসফুককে তাদের নতুন প্রস্তাবিত সিস্টেমটি প্রয়োগ করতে সহায়তা করা।

বিশেষ উল্লেখ:

তোমার প্রোগ্রাম একটি REPL (পাঠযোগ্য Eval-প্রিন্ট লুপ) কমান্ডের 3 ধরনের সমর্থন হতে হবে: FRIEND, SUGGESTএবং KNOW

FRIEND X Y- এটি নির্দিষ্ট করে Xএবং Yসামাজিক নেটওয়ার্কে বন্ধু friends

  • এক্স যদি Y এর সাথে বন্ধু হয় তবে Y এর সাথে এক্স এর বন্ধু

  • পারে, তবে আউটপুট থাকতে হবে না

  • এক্স সবসময় এক্স এর সাথে বন্ধু হয়

KNOW X Y - এক্স এবং ওয়াই যদি বন্ধু হয় তবে অন্যথায় মিথ্যা হয় a

  • KNOW X X সর্বদা সত্যবাদী মান আউটপুট করবে

SUGGEST X Y- এক্স এবং ওয়াই যদি বন্ধু হয় তবে অন্যথায় মিথ্যা বলা উচিত if এক্স এবং ওয়াইয়ের বন্ধু হওয়া উচিত যদি:

  • এক্স এবং ওয়াই বন্ধু নয়

  • এক্স এবং ওয়াইয়ের কমপক্ষে 1 বন্ধু কমন রয়েছে

আপনি প্রতিস্থাপন করতে অনুমতি দেওয়া হয় FRIEND, SUGGESTএবং KNOWআপনার নিজের স্ট্রিং সঙ্গে, কিন্তু আপনি কি STRING আপনার সাথে প্রতিটি কমান্ড প্রতিস্থাপিত আপনি তাদের উল্লেখ আবশ্যক।

আপনার প্রোগ্রামটি যে কোনও উপায়ে ইনপুট / উত্পাদন আউটপুট গ্রহণ করতে পারে, যতক্ষণ না এটি কীভাবে কাজ করে তা সনাক্ত করা যুক্তিসঙ্গতভাবে সহজ।

সামাজিক নেটওয়ার্কে লোকের সংখ্যা N1 এবং 100,000 এর মধ্যে, তবে সেখানে "ফ্রেন্ড লিঙ্কগুলি" (প্রান্তগুলি) সংখ্যক হতে পারে।

আপনি যদি এখনও লক্ষ্য না করে থাকেন তবে এটি গ্রাফ অনুসন্ধানের সমস্যা। এটিকে বাস্তবায়নের জন্য (সম্ভবত) সবচেয়ে সহজ (এবং সম্ভবত দ্রুততম) ডেটা কাঠামোটি সংলগ্ন ম্যাট্রিক্স হবে।

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

FRIEND A B
FRIEND A C
FRIEND B D
SUGGEST A B -> Falsy, as they are friends
SUGGEST A D -> Truthy, as they share B as a common friend
SUGGEST C D -> Falsy, they do not share a common friend
KNOW D B -> Truthy, they are friends
KNOW B C -> Falsy, not friends
=============
FRIEND Tom Tim
KNOW Tom Tim -> Truthy
KNOW Tim Tom -> Truthy
KNOW Tom Kit -> Falsy
=============
KNOW Tim Kit -> Falsy
FRIEND Tim Tom
KNOW Tim Kit -> Falsy
FRIEND Tom Kit
SUGGEST Tim Kit -> Truthy
=============
FRIEND X Y
SUGGEST X Y -> Falsy since X is friends with X

এখানে চিত্র আকারে আরও কয়েকটি পরীক্ষার মামলা রয়েছে

জয়ের শর্ত

এটি , সংক্ষিপ্ততম কোডের জয়!


সুতরাং উদাহরণস্বরূপ, আমরা কি নেটওয়ার্কের সমস্ত লোকের একটি তালিকা ইনপুট দিয়ে শুরু করতে পারি {A, B, C, D}?
গ্রেগ মার্টিন

2
পাঠ্য আকারে পরীক্ষার কেসগুলি রাখা আরও সহায়ক হবে।
গ্রেগ মার্টিন

1
আমরা কি ফ্রেন্ড কমান্ডের পরে আউটপুট পেতে পারি?
ovs

7
SUGGEST UK EU
ডাব্লুবিটি

1
পাইথনের @ থুন্ডা, অন্তর্নির্মিত REPL ব্যবহার করে কমান্ডটিতে দুটি অতিরিক্ত অক্ষর প্রয়োজন। এই জাতীয় ভাষাগুলি কি প্রোগ্রামের মোট দৈর্ঘ্যে সেই অতিরিক্ত বাইট যুক্ত করা উচিত?
কুইন্টোপিয়া

উত্তর:


44

এসডাব্লুআই-প্রোলগ, 62 47 41 বাইট

X*Y:-X+Y;Y+X;X==Y.
X?Y:-not(X*Y),X*Z,Y*Z.

প্রোলোগ প্রায়শই দরকারী হয় না তবে এটি যখন হয় তখন এটি কেবল সুন্দর। আমরা ব্যবহার করব a+bnotate যে aসাথে বন্ধুত্ব হয় b, a*bযে aজানে bএবং a?bযে bপ্রস্তাব করা হবে aনা বা। প্রথম লাইনটি কেবল X*Yএটি সত্য যদি সত্য হয় X+Y, Y+Xবা X == Yসত্য হয় বলে। এটি প্রত্যেকে জানার প্রতিসাম্য প্রয়োগ করে। কোনও পরামর্শ থাকা উচিত কিনা জিজ্ঞাসা করা অবিশ্বাস্যরকম সহজ। আমরা শুধু আছে একটি জিজ্ঞাসা Zযেমন যে X*Yমিথ্যা এবং X*Zএবং Y*Zসত্য। চ্যালেঞ্জ হিসাবে বর্ণিত ঠিক হিসাবে।

যদি আপনি এটি ফাইল হিসাবে সংরক্ষণ করেন (উদাঃ friends.pl) এবং এই ফাইলটি দিয়ে এসডাব্লুআই-প্রোলোগ খুলুন ( prolog -l friends.pl) তবে আপনি একটি আরপিএল এ নেমে যাবেন।

আপনি এর মতো বন্ধুত্ব জোর দিয়ে বলতে পারেন:

assert('a' + 'b').
assert('a' + 'c').
assert('b' + 'd').

লোকেরা প্রত্যেকে জানেন বা পরামর্শ দেওয়া উচিত কিনা তা আপনি পরীক্ষা করতে পারেন:

'a'*'b'.
'a'?'d'.

আপনি প্রতিস্থাপন বাইট একটি গুচ্ছ সংরক্ষণ করতে সক্ষম হওয়া উচিত k(X,Y)সঙ্গে X*Yসঙ্গে একই fএবং sবিভিন্ন operands ব্যবহার করে। আমি সঠিকভাবে গণনা করেছি 21 বাইট।
এমিলিগা

তারা কীভাবে দৃ as়তার সাথে কাজ করে তা নিশ্চিত নয়, তাই আমি সম্পর্কে অনিশ্চিত f
এমিগনা

12
সম্পূর্ণভাবে প্রশ্নের স্ট্র্যাটেড ডিজাইনের ডিজাইন স্ট্রাকচারের মধ্য দিয়ে। অ্যামেজিং।
থুন্ডা

@ এমিগনা আমি এটি প্রয়োগ করেছি, তবে এটি আপনার গণনার মতো সাশ্রয় ঘটেনি।
orlp

আমি এটা পরীক্ষিত এই 41 বাইট হয়। এটি চেষ্টা করার মতো আমার কাছে আরইপিএল নেই যদিও এটি সেখানে আলাদাভাবে কাজ করে কিনা তা আমার জানা নেই।
এমিগিনা

15

পিএইচপি, 138 133 129 বাইট

পিএইচপি গণিতকে মারধর করে - একটি বিরল ঘটনা।

for(;$s=fgets(STDIN);$s>G?print$$a[$b]?$s<L:$s>L&&@array_intersect_key($$a,$$b):$$a[$b]=$$b[$a]=1)[,$a,$b]=explode(" ",trim($s));

কপি করে প্রিন্ট 1truthy জন্য, falsy জন্য খালি স্ট্রিং। এটি দিয়ে চালান -nrবা এটি অনলাইনে পরীক্ষা করুন
তালিকা নিয়োগের জন্য পিএইচপি 7.1 প্রয়োজন; ব্যবহারকারীর নাম কেস সংবেদনশীল এবং বাদ দিন উচিত a, b, s

ভাঙ্গন

for(;$s=fgets(STDIN);                       # loop through input
    $s>G                                        # 2. evaluate command
        ?print$$a[$b]
            # command KNOW: true if $$a[$b]
            ?$s<L
            # command SUGGEST: true if !$$a[$b] and array_intersect_key returns truthy
            :$s>L&&@array_intersect_key($$a,$$b)
        # command FRIEND: set keys in $$a and $$b
        :$$a[$b]=$$b[$a]=1
)
    [,$a,$b]=explode(" ",trim($s));             # 1. parse user names to $a and $b
  • $s ছাঁটাই করতে হবে কারণ এতে নতুন লাইনের চরিত্র রয়েছে।
  • array_intersect_keyনিঃশব্দ করতে হবে বা এটি খালি $$aবা এর জন্য সতর্কবার্তা প্রকাশ করবে $$b
  • সমস্ত ব্যবহারকারীর নামের জন্য +18 +15 বাইট: এর $$aসাথে $f[$a]এবং $$bসাথে প্রতিস্থাপন করুন $f[$b]

12

সিএমডি (ব্যাচ), 50 + 20 + 135 = 205 বাইট

  • FRIEND.CMD

    @for %%f in (%1.%1 %1.%2 %2.%2 %2.%1)do @set %%f=1
    
  • KNOW.CMD

    @call echo(%%%1.%2%%
    

    1বন্ধুদের জন্য প্রিন্ট করুন , অপরিচিতদের জন্য একটি ফাঁকা লাইন।

  • SUGGEST.CMD

    @call set k=0%%%1.%2%%
    @set k=1&if %k%==0 for /f "tokens=2 delims=.=" %%f in ('set %1.')do @call set k=%%k%%%%%%f.%2%%
    @echo(%k:~1,1%
    

    প্রিন্ট 1বা একটি ফাঁকা লাইন। আমি মনে করি টানা ছয়টি %নতুন ব্যক্তিগত সেরা হতে পারে।


এটা দুর্দান্ত পাগল। সুন্দর সমাধান।
অ্যাডমবর্কবার্ক

6

পাইথন 3, 122 118 + 2 = 120 বাইট

l={}
def f(*r):l[r]=l[r[::-1]]=1
k=lambda a,b:a==b or(a,b)in l
s=lambda a,b:1-k(a,b)and any(k(a,z)&k(b,z)for z,_ in l)

ওভসের উত্তর হিসাবে ব্যবহার হুবহু একই।


1
এটি আমার কাছে বেশ সুস্পষ্ট, তবে প্রয়োজনীয়তাগুলি আপনাকে কীভাবে আপনার আরপিএল ব্যবহার করতে হবে এবং কোন আদেশগুলি দিয়ে তা নির্দিষ্ট করতে হবে। যারা অজগর জানেন না তাদের কাজে লাগতে পারে। (ঘটনাচক্রে, আমি হ'ল এটিই পদ্ধতিটি ব্যবহার করতাম))
কুইন্টোপিয়া

6

পাইথন 3, 163 149 143 + 2 = 145 বাইট

-6 বাইটস @ ফিলিপনার্ডিবাটিস্টাকে ধন্যবাদ

l=[]
def f(a,b):l.extend([(a,b),(b,a)])
k=lambda a,b:a==b or(a,b)in l
s=lambda a,b:k(a,b)-1and{c for c,d in l if d==a}&{c for c,d in l if d==b}

এটা সংরক্ষণ একটি ফাইলে এবং এটি চালানোর python3 -i file.py
ব্যবহারের
- f("a", "b")পরিবর্তে FRIENDS a b
- k("a", "b")পরিবর্তে KNOW a b
- s("a", "b")পরিবর্তেSUGGEST a b

মিথ্যা আউটপুট: 0, সেট (), মিথ্যা
ট্রুথনি আউটপুট: খালি খালি সেট, সত্য

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


আরপিএল হিসাবে পাইথন ইন্টারপ্রেটার ব্যবহার না করার সময় 164 বাইট:

f=[]
while 1:c,a,b=input().split();i=(a,b)in f;f+=c=="f"and[(a,b),(b,a)]or[(i+(a==b),-i+1and{c for c,d in f if d==a}&{c for c,d in f if d==b})];print(f[-1][c=="s"])

ব্যবহার
- fজন্য FRIEND
- sজন্য SUGGEST
- জন্য অন্য কিছুKNOW

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


প্রস্তাবিত ফাংশনটি দ্বিতীয় লিঙ্কটির জন্য নষ্ট হয়ে গেছে
থুন্ডা

@ থুন্ডা এটি ঠিক করেছে
ওভস

আমি যদি কিছু মিস করছি তবে আমাকে সংশোধন করুন, তবে পরিবর্তে l.extend([(a,b),(b,a)]), আপনি ঠিক কি করতে পারবেন না l+=[(a,b),(b,a)]? (আমি এখনও এটি পরীক্ষা করে
দেখিনি

ওহ দুঃখিত, আমি আমার ভুল বুঝতে পেরেছিলাম, যার কারণ একটি UnboundLocalError। ভাল উত্তর!
হাইপারনিউট্রিনো

যদি আপনি সরাতে bool()থেকে sফাংশন, এবং ব্যবহার 0, {}এবং Falseএবং Falsey যেমন Trueএবং একটি খালি রাখা setTruthy হিসাবে, আপনি 6 বাইট বাঁচাতে পারে
ফিলিপ Nardi বাতিস্তা

5

গণিত, 164 বাইট

f={}
p:=Union@@f
i=Position[p,#][[1,1]]&
m:=Outer[Boole@MemberQ[f,{##}]&,p,p]
a=(#[[i@#2,i@#3]]/._@__->0)>0&
F=(f=#~Tuples~2~Join~f;)&
K=m~a~##&
S=a[m.m,##]&&!K@##&

নির্ধারণ করে তিনটি প্রধান ফাংশন F, Sএবং Kআকাঙ্ক্ষিত আচরণ সঙ্গে। উদাহরণস্বরূপ, কমান্ডের ক্রম

F@{David, Bob}
F@{Bob, Alex}
F@{Alex, Kitty}
F@{Daniel, David}
F@{David, Kit}
S[David, Alex]
S[Bob, Kitty]
S[David, Kitty]
S[David, Bob]
K[David, Bob]
F@{Kit, Kitty}
S[David, Kitty]

ওপিতে লিঙ্কযুক্ত চিত্রটি থেকে সর্বশেষ পরীক্ষার কেস; Fকমান্ড উত্পাদ কোন আউটপুট (একক সেমিকোলন এই জন্য অর্থ প্রদান করার স্বল্প মূল্যে বলে মনে হয়), এবং ছয় Sএবং Kকমান্ড ফলন

True
True
False
False
True
True

পছন্দসই হিসাবে

যেকোন মুহুর্তে fফর্মের আদেশ যুগলের তালিকা {A, B}যেখানে Aজানে B, যখন pকিছু উপাদান প্রদর্শনে মানুষের তালিকা রয়েছে f। কলিং F@{A, B}যোগ চার আদেশ জোড়া {A, B}, {B, A}, {A, A}, এবং {B, B}করতে f

এছাড়াও, যে কোনও মুহুর্তে, mঅন্তর্নিহিত গ্রাফের সংলগ্ন ম্যাট্রিক্স (কোনও ব্যক্তি নিজের এবং তাদের সমস্ত Fবন্ধুর সাথে সংলগ্ন ); সারি এবং কলামগুলি সূচিবদ্ধ হয় pএবং iকোনও ব্যক্তিকে সম্পর্কিত সারি / কলাম সংখ্যায় রূপান্তর করে। সহায়ক ফাংশনটি aএকটি ম্যাট্রিক্স এবং দু'জনকে ইনপুট হিসাবে নেয় এবং ম্যাট্রিক্সের প্রবেশের সন্ধান করে যার "স্থানাঙ্ক" দুটি ব্যক্তি, Trueসংখ্যাটি ইতিবাচক Falseহলে এবং যদি এটি শূন্য হয় তবে ফিরে আসে । ( aইনপুট ব্যক্তিদের মধ্যে একটি এখনও স্বীকৃত না হলে কল করাও সম্ভব — উদাহরণস্বরূপ, কোনও বন্ধু ঘোষণার আগে কোনও জ্ঞান বা সফল জিজ্ঞাসা করা, বা কোনও বন্ধু নেই এমন কিছু দরিদ্র ব্যক্তির বিষয়ে জিজ্ঞাসা করা; এটি ত্রুটি ছুঁড়েছে, তবে নিয়ম /._@__->0আউটপুটটিকে Falseযাইহোক হতে বাধ্য করে )

কল করার K[A, B]ফলে m[A, B]ইতিবাচক কিনা তা সন্ধান করে যা Kবর্তমানে ক্রিয়াটি প্রয়োগ করে । ম্যাট্রিক্স পণ্যটি m.mদৈর্ঘ্য-2-পাথের ম্যাট্রিক্স, দৈর্ঘ্য 2 এর পথ ধরে এক ব্যক্তি থেকে অন্য ব্যক্তিতে যাওয়ার কতগুলি পথ রয়েছে; এটি যতক্ষণ না আমরা অতিরিক্তভাবে হাতে ( ) ততক্ষণ ইনপুট লোকজন একে অপরকে চিনি না তা পরীক্ষা করে অবধি ক্রিয়ার S[A, B]প্রয়োগ করতে দেয় ।S&&!K@##

মজার বিষয়: বিনামূল্যে জন্য এই প্রয়োগটি আমাদের চক্রের ঘোষণা করতে পারবেন বন্ধুদের-কমান্ড F@{A, B, C, D}সব সমতূল্য F@{A, B}, F@{A, C}, F@{A, D}, F@{B, C}, F@{B, D}, এবং F@{C, D}মিলিত।


2

পাইথন 2 , 118 বাইট

F=[]
def s(f,c):c=set(c);r=c in F;return F.append(c)if f%2 else not r^(4 in[len(x|c)for x in F])if f else 2>len(c)or r

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

যেহেতু আমি পাইথন 2 এর জন্য রেপলাইন অনলাইন সরঞ্জামটি খুঁজে পাইনি, তাই আমি টিআইও নেক্সাস যুক্ত করেছি (আরপিএল ফর্ম্যাটে)।

বিকল্প এবং এর সম্ভাব্য আউটপুটটির জন্য অনুসন্ধান

0 জ্ঞাত - কিছুই নয়

1 বন্ধুদের জন্য - সত্য বা মিথ্যা

2 পরামর্শের জন্য - সত্য বা মিথ্যা

একটি repl পাইথন ইন্টারপ্রেটারে ব্যবহার এবং নমুনা আউটপুট উদাহরণ।

>>> F=[]
>>> def s(f,c):c=set(c);r=c in F;return F.append(c)if f%2 else not r^(4 in[len(x|c)for x in F])if f else 2>len(c)or r
...
>>> s(1,['A','B'])
>>> s(1,['A','C'])
>>> s(1,['B','D'])
>>> s(2,['A','B'])
False
>>> s(2,['A','D'])
True
>>> s(2,['C','D'])
False
>>> s(0,['D','B'])
True
>>> s(0,['D','C'])
False

0

GNU সেড , 158 + 2 (আরএন পতাকা) = 160 বাইট

যেহেতু সেড একটি রেজেক্স ভিত্তিক ভাষা, তাই কোনও আদিম প্রকার নেই, বিমূর্ত ডাটা স্ট্রাকচারের উল্লেখ নেই। নেটওয়ার্ক ডেটা ফ্রি ফর্ম্যাট টেক্সট হিসাবে সংরক্ষণ করা হয়, এ ক্ষেত্রে রিন্ডন্ড্যান্ট ফ্রেন্ড লিঙ্ক A-B;B-A;ইত্যাদির মতো , যা পরে বিভিন্ন রেজেক্স প্যাটার্নের সাথে মেলে।

G
/^F/{s:. (.+) (.+)\n:\1-\1;\1-\2;\2-\1;\2-\2;:;h}
/^K |^S /{s:(.) (.+) (.+)\n.*\2-\3.*:\1:;/^K$/p}
/^S /s:(.) (.+) (.+)\n.*(.+)-(\2.*\4-\3|\3.*\4-\2).*:\1:p

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

ডিজাইন দ্বারা, সেড প্রতিটি ইনপুট লাইনের জন্য পুরো স্ক্রিপ্টটি চালায়। টাইপ করার সাথে সাথে কমান্ডের আউটপুট দেখতে, আমি ইন্টারেক্টিভ মোডে পরীক্ষার পরামর্শ দিই।

ব্যবহার: সেডে কোনও সত্যবাদী / মিথ্যা মান নেই, সুতরাং আমি যে আউটপুট কনভেনশনটি ব্যবহার করি তা বাশ থেকে ধার করা হয়, যার দ্বারা একটি খালি খালি স্ট্রিংটিকে সত্যবাদী হিসাবে বিবেচনা করা হয়, এবং খালি স্ট্রিংটিকে মিথ্যা বলে মনে করা হয়।

  • F X Yজন্য FRIEND X Y। এটির কোনও আউটপুট নেই।
  • K X Yজন্য KNOW X Y। আউটপুটস 'কে' সত্য হিসাবে এবং মিথ্যা হিসাবে কিছুই নেই।
  • S X Yজন্য SUGGEST X Y। আউটপুটস 'এস' সত্য হিসাবে এবং মিথ্যা হিসাবে কিছুই নেই।

ব্যাখ্যা:

G
# append stored network data, if any, to the current input line
/^F/{
# if command is 'F' (FRIEND), for ex. 'F X Y'
   s:. (.+) (.+)\n:\1-\1;\1-\2;\2-\1;\2-\2;:
   # generate friend links, for ex. 'X-X;X-Y;Y-X;Y-Y'
   h
   # store updated network data
}
/^K |^S /{
# if command is either 'K' (KNOW) or 'S' (SUGGEST), for ex. 'K X Y'
   s:(.) (.+) (.+)\n.*\2-\3.*:\1:
   # search friend link 'X-Y'. If found, delete pattern except the command letter.
   /^K$/p
   # if only letter K left, print it (command is 'K', 'X' and 'Y' are friends)
}
/^S /
# if command is 'S', for ex. 'S X Y', but 'X' and 'Y' aren't friends
   s:(.) (.+) (.+)\n.*(.+)-(\2.*\4-\3|\3.*\4-\2).*:\1:p
   # search if 'X' and 'Y' have a friend in common (for ex. 'C'), and if so print
   #letter S. The search is for ex. 'C-X.*C-Y' and 'C-Y.*C-X'.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.