হলিডে গিফট এক্সচেঞ্জ


11

আমাদের অভ্যন্তরীণ গল্ফিং থেকে আর একটি সমস্যা ... এটি গত বছরের ছুটির দিনে।

সমস্যা

অ্যান্ডি, বার্ব, কার্ল, দিদি, আর্ল এবং ফ্রান একে অপরের জন্য উপহার কিনছেন। উপহার বিনিময়ের জন্য নাম আঁকুন।

  1. প্রতিটি ব্যক্তি একটি উপহার কিনে এবং একটি উপহার গ্রহণ করে।
  2. কেউ তাদের নিজের উপহার কিনে না।
  3. সমাধানটি একাধিকবার চালানোর ফলে বিভিন্ন ফলাফল পাওয়া উচিত (দাতা-রিসিভারের জুটি রান থেকে চালানোর জন্য অনুমানযোগ্য বা অভিন্ন হওয়া উচিত নয়)।

ইনপুট

কোনটিই নয়।

আউটপুট

এই উদাহরণ হিসাবে ফর্ম্যাট করা:

Barb জন্য অ্যান্ডি ক্রয়
কার্ল জন্য Barb ক্রয়
দিদি জন্য কার্ল ক্রয়
আর্ল জন্য দিদি ক্রয়
Fran জন্য আর্ল ক্রয়
অ্যান্ডি জন্য Fran ক্রয়


আউটপুটটি নাম অনুসারে বাছাই করা উচিত?
ইভেলেক্স

@ এলভেক্স নপ, প্রয়োজনীয় নয়।
স্টিভ

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

উত্তর:


4

জে, 57

(,.' buys for ',"1|.)(?~6){6 4$'AndyBarbCarlDidiEarlFran'

যেমন

   (,.' buys for ',"1|.)(?~6){6 4$'AndyBarbCarlDidiEarlFran'
Carl buys for Earl
Andy buys for Barb
Fran buys for Didi
Didi buys for Fran
Barb buys for Andy
Earl buys for Carl

আমি [জে] জানি না, তবে নামগুলি বিভিন্ন দৈর্ঘ্যের সাথে থাকলে এই কাজ করবে?
zx8754

না। কোডটি এই নামটি ব্যবহার করে যে সমস্ত নাম 4 টি অক্ষর দীর্ঘ। এটি খুব কম পরিবর্তন সহ বিভিন্ন দৈর্ঘ্যের জন্য কাজ করবে।
এলেভেক্স

এটি এমনও কাজে লাগায় যে এখানে বহু সংখ্যক লোক রয়েছে। মনে রাখবেন যে এক্স যদি Y কে দেয় তবে Y সর্বদা এক্সকেও দেবে।
অ্যাডাম

3

c99 - 252 টি অক্ষর

#include <stdio.h>
#define G for(i=0;i<6;i++)
char*n="Andy\0Barb\0Carl\0Didi\0Earl\0Fran",*p[7];int i,j;int main()
{FILE*r=fopen("/dev/random","r");G p[i]=n+5*i;G{j=fgetc(r)%6;p[7]=p[j]
;p[j]=p[i];p[i]=p[7];}G printf("%s buys for %s\n",p[i],p[(i+1)%6]);}

আদেশের বৃত্তাকার প্রকৃতির সুযোগ নিয়ে সামান্য উন্নতি এই সংস্করণটি সর্বদা একটি লুপের মতো কেনার কৌশল তৈরি করে, সুতরাং এটি পূর্ববর্তী (271 অক্ষর) সংস্করণটির চেয়ে কম এলোমেলো, তবে আমি বিশ্বাস করি এটি এখনও অনুমিত হয়।

এমন একটি প্ল্যাটফর্মের প্রয়োজন যার একটি কাজ করে /dev/random\0বড় স্ট্রিংয়ে এস বাদ দিয়ে আমার প্রায় 8 টি ছিটকে পড়তে পারা উচিত, তবে আমার লিবিসিটি %4sপ্রিন্ট স্পেসিফায়ারদের সাথে ম্যান পেজটি যেভাবে বলেছে তা মনে হচ্ছে না ।

এলোমেলো অবস্থা খারাপ, তবে সেভাবে করা আমাকে "ফু ফু ফু ফু ফ্রি" শর্তগুলি পরীক্ষা করতে বাধা দেয় ।

রিডেবল:

#include <stdio.h>

char *n="Andy\0Barb\0Carl\0Didi\0Earl\0Fran",
  *p[7]; /* 7th cell for temp */
int i,j;

int main(){
  FILE*r=fopen("/dev/random","r");
  for(i=0;i<6;i++)
    p[i]=n+5*i;   /* Initialize the pointers */
  for(i=0;i<6;i++){
    j=fgetc(r)%6; /* Poor numeric properties. Cest le Code Golf */
    p[7]=p[j];
    p[j]=p[i];
    p[i]=p[7];
  }
  for(i=0;i<6;i++)
    printf("%s buys for %s\n",p[i],p[(i+1)%6]);
}

3

উইন্ডোজ পাওয়ারশেল, 83

$i=random 5
($n=-split'Andy Barb Carl Didi Earl Fran')|%{"$_ buys for "+$n[++$i%6]}

ইতিহাস:

  • 2011-02-11 22:01 (136) - প্রথম চেষ্টা।
  • 2011-02-11 22:05 (130) - কিছু বিষয় ইনলাইন করা। এখনই নাম বদলানো, সূচিগুলি নয়।
  • 2011-02-13 16:13 (128) - $iপ্রতিবারের মতো পুনরায় তৈরি করা হবে এমন আমার মডুলাসের দরকার নেই ।
  • 2011-02-13 16:20    (87) - আননের কাছ থেকে ধারণা ধার করা হয়েছে এর সি # সমাধান । কেবল একটি এলোমেলো অফসেট তৈরি করুন এবং তারপরে কেবল তাদের চেনাশোনাগুলিতে উপহার দিন।
  • 2011-02-13 16:26    (83) - র্যান্ডম সংখ্যা জেনারেশন এবং ইনডেক্সিং পরিবর্তিত। $_সংরক্ষণ করার জন্য স্ট্রিংয়ের মধ্যে টানা +

3

হাস্কেল, 241 189 টি অক্ষর

import Data.List
import Random
main=randomRIO(0,719)>>=mapM_ putStrLn.f
f n=map(\(x,y)->x++" buys for "++y).zip(l n).tail$cycle$l n
l=(permutations(words"Andy Barb Carl Didi Earl Fran")!!)

সম্পূর্ণরূপে এলোমেলো আউটপুট (এটি এখনও চশমাটি সন্তুষ্ট করে)।

এটি নামের তালিকার সমস্ত অনুমতি তৈরি করে, এলোমেলোভাবে একটি বাছাই করে (আমি মনে করি যে তালিকাটি রদবদলের জন্য এটি হ্যাসেলের সবচেয়ে সংক্ষিপ্ততম উপায় - যদি কারও কিছু ছোট থাকে তবে আমি এটির প্রশংসা করব) এবং তারপরে প্রতিটি ব্যক্তি তার পরে একটি ক্রয় করে তালিকায় পরবর্তী ব্যক্তির জন্য উপস্থিত।


আমি এই অ্যাড-হক চেষ্টা করেছি, এটি কাজ করে কিনা আমি দৃ
ure

@ অ্যান: permutations$words"Andy Barb Carl Didi Earl Fran"এবং কিছু অন্যান্য কৌশল আমি আমার উন্নত সংস্করণে চেষ্টা করেছি। আমি ভুলে গিয়েছিলাম, permutationsএটি 98 এর অন্তর্ভুক্ত নয় List, সুতরাং আপনাকে দীর্ঘ নামটি ব্যবহার করতে হবে। এটির দিকে একবার তাকাও।
FUZxxl

আর তোমার বিশেষ উদ্দেশ্যে: r=tail.cycle। এবং ইনলাইন চেয়ে।
FUZxxl

এটি 202 অক্ষরে নামা হয়েছে। একবার দেখুন: পেস্ট.বুন্টুউসার্স.ডি
ফুজজেক্সেল

1
এবং 189 অক্ষরের জন্য, আমার উদাহরণের সাথে তৃতীয় লাইনটি প্রতিস্থাপন করুন:main=randomRIO(0,719)>>=mapM_ putStrLn.f
FUZxxl

3

গল্ফস্ক্রিপ্ট: 72 64 57 অক্ষর

"AndyBarbCarlDidiEarlFran"4/{;9rand}${.n+\' buys for '}%(

টেস্ট

$ golfscript codegolf-838.gs 
Fran buys for Carl
Carl buys for Andy
Andy buys for Barb
Barb buys for Didi
Didi buys for Earl
Earl buys for Fran

$ golfscript codegolf-838.gs 
Didi buys for Earl
Earl buys for Andy
Andy buys for Barb
Barb buys for Carl
Carl buys for Fran
Fran buys for Didi
  • ধন্যবাদ gnibbler এর জন্য "AndyBarbCarlDidiEarlFran"4/, আপডেট হয়েছে এবং 7 টি কম পেয়েছে
  • 57 টি অক্ষর সমাধান মূলত ন্যাব: ডি দ্বারা করা হয় এবং এটিও লক্ষ্য করেছেন যে ;9randআমার চেয়ে বেশি এলোমেলো6rand*

1
"AndyBarbCarlDidiEarlFran"4/
gnibbler

আহ হা, আপনাকে ধন্যবাদ @gnibbler, দুর্দান্ত, এটি আপডেট করতে চলেছে।
আপনি

আপনি কেন ব্যবহার করছেন তা নিশ্চিত নন 6rand*- 0=randবা সম্ভবত ;9randপছন্দনীয়। লুপটির জন্য, আরও {.n+\' buys for '}%(খাটো ..
নবব

হেহ; জে এখন একই চরিত্র গণনায় পরিণত হয়েছে: ডি এবং আপনাকে ধন্যবাদ @ নবব, আমি ব্যবহার করেছি 6rand*কারণ আমি ভেবেছিলাম এটি 6 টি আইটেম অ্যারে সমানভাবে এলোমেলো করে দেবে (আমার মনে হয় আমি ভুল ছিলাম যেহেতু ;9randআমার চেয়ে সত্যই এলোমেলো লাগে)
আপনি

3

জাপট-আর, 41 বাইট

`AÌ)B¼C¤E¤FÎÂDi¹`qe ö¬ê1 ò mq` ¿ys f 

-২ বাইটস @ অলিভারকে ধন্যবাদ!

চেষ্টা করে দেখুন!

এটিই আমি উচ্চ স্তরে নিয়েছি:

  • অংশগ্রহণকারীদের নাম সম্বলিত একটি স্ট্রিং সঙ্কুচিত করুন
  • একটি অ্যারে মধ্যে বিভক্ত স্ট্রিং
  • এলোমেলো
  • প্রত্যেক ব্যক্তিকে পরবর্তী সর্বোচ্চ সূচকযুক্ত ব্যক্তিকে নিয়োগ করুন
  • অ্যারেতে সর্বশেষ ব্যক্তিকে প্রথম নিয়োগ দেওয়া হয়

বছরখানেক আগে আমার কাজের জন্য একটি "গোপন সান্তা" প্রোগ্রাম তৈরি করায় এই সমস্যাটির সাথে আমার একটু ইতিহাস রয়েছে। আমরা কয়েক জন চাকরীর আবেদনকারীকে এটির মাধ্যমে কাজ করতে বলি :)


@ অলিভার - টিপসের জন্য ধন্যবাদ! দেখে মনে হচ্ছে এটি ãকোনও জুটি ফিরিয়ে দিচ্ছে না যা প্রথম উপাদানটিকে প্রথম উপাদানটির সাথে যুক্ত করে। আমি এটিকে কাজ করার উপায় নিয়ে কাজ করছি, তবে ভেবেছিলাম আমি আপনাকে জানাতে চাই। আবার যদিও ধন্যবাদ! ethproductions.github.io/japt/…
ডানা


1
আহ, আপনি ঠিক বলেছেন। আমি মনে করি এটি 42
অলিভার


অপেক্ষা করুন চাপলে কি হবে "q".ö("q")Do
হওয়া ASCII শুধুমাত্র

2

পাইথন - 118 অক্ষর

from random import*;L="Andy Barb Carl Didi Earl Fran".split()
for i in sample(range(6),6):print L[i-1],"buys for",L[i]

পাইথন - 120 টি অক্ষর

import random as R;L="Andy Barb Carl Didi Earl Fran".split();R.shuffle(L)
for i in range(6):print L[i-1],"buys for",L[i]


1

পাইথন - 154 অক্ষর

import random as R;L="Andy Barb Carl Didi Earl Fran".split();M=L[:]
while any(map(str.__eq__,L,M)):R.shuffle(M) 
for i in zip(L,M):print"%s buys for %s"%i

দুঃখিত, আমার পাইথনের মারাত্মক অভাব রয়েছে ... সেখানে "ল এক্স কি এক্স এর জন্য এক্স কিনে" এড়ানো এমন কোনও সমাধান না পাওয়া পর্যন্ত মূলত লুপটি আছে?
স্টিভ

@ স্টিভ: এটি যা করছে তা অনেকটাই। এল এবং এম এর প্রতিটি জোড়কে সংশ্লিষ্ট মানগুলিতে mapকল str.__eq__করে এবং লুপগুলি অবিরত অবিরত থাকে যতক্ষণ না সেগুলির কোনওটিই সত্য না হয়।
আনন

@ স্টিভ, হ্যাঁ যদিও এটি সম্ভবত 1 থেকে 5 এর মধ্যে এলোমেলো পরিমাণে রেকর্ডগুলি স্থানান্তরিত করার চেয়ে ছোট, তবে আমি মনে করি এটি প্রশ্নের
উদ্বেগের মধ্যে নেই

আমি যখন কর্মক্ষেত্রে প্রথম প্রশ্নটি প্রকাশ করেছি তখন আপনি ঠিক বলেছেন exactly আমার সহকর্মীরা দ্রুত ইঙ্গিত করেছিলেন যে এটি আমার সংজ্ঞা দ্বারা বাতিল হয়নি ... সুতরাং এখানে পোস্ট করার সময় আমি এটিকে রেখে দিয়েছি।
স্টিভ

1

ডি: 233 অক্ষর

import std.random,std.stdio;void main(){auto p=["Andy","Barb","Carl","Didi","Earl","Fran"];auto q=p.dup;o:while(1){for(int i;i<6;++i)if(p[i]==q[i]){randomShuffle(q);continue o;}break;}foreach(i,a;p)writefln("%s buys for %s",a,q[i]);}

আরও সুস্পষ্টভাবে:

import std.random, std.stdio;

void main()
{
    auto p = ["Andy", "Barb", "Carl", "Didi", "Earl", "Fran"];
    auto q = p.dup;

    o:while(1)
    {
        for(int i; i < 6; ++i)
            if(p[i] == q[i])
            {
                randomShuffle(q);
                continue o;
            }

        break;
    }

    foreach(i, a; p)
        writefln("%s buys for %s", a, q[i]);
}

1

পাইথন (175)

import random as r
n=['Andy','Barb','Carl','Didi','Earl','Fran']
m=n[:]
r.shuffle(m)
b=' buys for '
for i in n:
 h=m.pop()
 while h==i:
  m.append(h)
  h=m.pop()
 print(i+b+h)

1

স্কিম, 173

দুটি সমাধানের একটি দেয় ives

(define(m lst)
    (printf"~v buys for ~v~n"(car lst)(cadr lst))
    (if(eq?(cadr lst)'Andy)0(m(cdr lst)))
)
(m((if(odd?(random 2))reverse values)'(Andy Barb Carl Didi Earl Fran Andy)))

1

সি #, 210 183 টি অক্ষর

using System;class a{static void Main(){var n="Andy Barb Carl Didi Earl Fran".Split();var c=0,i=new Random().Next(1,6);for(;c<6;c++)Console.WriteLine(n[c]+" buys for "+n[(c+i)%6]);}}

বয়লারপ্লেটের গাদা :(

এই সমাধানটি সম্পূর্ণ এলোমেলো নয় - সর্বদা এক বা একাধিক "লুপ" থাকে যেমন- এ-> সি-> ই-> এ, এবং অফসেটগুলি সর্বদা লুপগুলিতে একই থাকে। তবে আপনার যদি সেই আউটপুটের অংশ না থাকে তবে নির্দিষ্ট রানের আউটপুট পূর্বাভাস দেওয়া সম্ভব নয় is


এটাই সেই ব্যাখ্যাটি ছিল যা আমি অভিপ্রায় করছিলাম (এবং মূলত সমাধানটি আমরাও অবতরণ করেছি)।
স্টিভ

210 হওয়া উচিত you ফাইলটির শেষে আপনি নিউলাইনটি গণনা করছেন?
gnibbler

@gnibbler: আমি সম্ভবত ছিলাম। আমি সবেমাত্র ফাইলটি ডাব্লুসি-তে পরিণত করেছি, আমি সত্যিই হাতে হাতে এটি গণনা করছি না।
আনন

1
কি হবে var n="Andy Barb Carl Didi Earl Fran".Split()? 16 বাইট সাশ্রয় করে। আপনি যুক্তিটি ছেড়ে দিতে পারেন Main(), যা অন্য 9 বাইট সংরক্ষণ করে। আর তুমি ঘোষণা একত্রিত করতে পারেন cএবং i: int c,i=...;for(c=0;...যা দুই পরিমাণ সঞ্চয় হয়।
জো

@ জো: আপনার পরামর্শ অনুসারে এটি টুইট করেছেন, ধন্যবাদ।
আনন

0

রুবি - 89 অক্ষর

(a=%w(Andy Barb Carl Didi Earl Fran).shuffle).zip(a.reverse).each{|e|puts e*' buys for '}

আউটপুট:

Andy buys for Didi
Barb buys for Earl
Fran buys for Carl
Carl buys for Fran
Earl buys for Barb
Didi buys for Andy

1
আপনি mapপরিবর্তে ব্যবহার করতে পারেন each
ডগবার্ট

1
এই সমাধানটির সাথে সমস্যাটি হ'ল যদি আপনার কাছে অদ্ভুত সংখ্যক লোক থাকে তবে মধ্যবর্তী ব্যক্তি তাদের জন্য উপহার দেবে আর্ল কিনে ফেলবে মার্ক ফ্র্যানের জন্য কিনে অ্যান্ডি বার্ব কিনে দিদি কারি কিনে দিদি কার্ল কিনে কিনছে বার্ব অ্যান্ডি কিনে ক্রয় করে ফরাস মার্ক কিনেছে আর্লের জন্য
স্টাডলি জুন

0

ম্যাথগল্ফ , 41 বাইট

"δ%è╘+µ√♂JÇ"2/$╦╕ää▐δáw_╪" buys for "+m+n

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

ব্যাখ্যা

এটি সমান সম্ভাব্যতা সহ প্রতিটি কেস উত্পাদন করার গ্যারান্টিযুক্ত নয়, তবে এটি প্রতিটি রান পৃথক ফলাফল দেয়। আমার যদি কোনও শাফল অপারেটর থাকে তবে একটি বাইট সরানো যেতে পারে তবে এটি অন্য দিনের জন্য।

"δ%è╘+µ√♂JÇ"                                push the string "δ%è╘+µ√♂JÇ"
            2/                              split into segments of two characters
              $                             transform to ordinals using base 256
               ╦                            fetch dictionary words (['Andy', 'barb', 'Carl', 'Earl', 'Fran'])
                ╕ää                         Push "didi"
                   ▐                        append to end of list
                    δ                       capitalize all strings in list
                     áw                     sort by random character in each string (shuffle)
                       _                    duplicate TOS
                        ╪                   right-rotate bits in int, list, str
                         " buys for "       push the string " buys for "
                                     +      Add to all strings in list
                                      m+    zip add the two arrays
                                        n   join array with newline
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.