কোডের নাগেটস


18

কোডের নাগেটস

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

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

চিকেন নুগেট প্যাকের আকারগুলি পুরো জায়গা জুড়ে রয়েছে এবং আপনি বিশ্বের কোথায় থাকেন তার উপর নির্ভর করে স্ট্যান্ডার্ড মাপগুলিও পরিবর্তিত হয়। যাইহোক, নিকটতম [স্থান যা নাগেট পরিবেশন করে] নীচের আকারের ন্যাগেট প্যাকগুলি স্টক করে:

4, 6, 9, 10, 20, 40

এখন আপনি খেয়াল করতে পারেন যে আপনি কিছু নগেটের সংমিশ্রণটি অর্ডার করতে পারবেন না। উদাহরণস্বরূপ, 11অংশটিতে সম্ভব নয়, যেহেতু সেখানে কোন সমন্বয় যে সমান 11ঠিক। যাইহোক, যদি আপনি করতে পারেন 431 প্যাক বুঝিয়ে 20, 1 প্যাক 10, 1 প্যাক 9এবং 1 প্যাক 4,

20 + 10 + 9 + 4 = 43 (597)

যেখানে 597প্রতিটি পদ বর্গক্ষেত্র এবং একসাথে যুক্ত হয় (ইঙ্গিত: অনুকূল সমাধানটি এটি সর্বোচ্চ মান হিসাবে থাকে) । বানানোর অন্যান্য উপায় অবশ্যই রয়েছে 43, তবে আপনি জানেন যে, প্যাকের প্রতি আরও বেশি কড়া, এটি প্রতি নট সস্তার হয়ে যায়। সুতরাং, আপনি নিজের ব্যয়কে হ্রাস করার জন্য সর্বনিম্ন সংখ্যক প্যাক এবং সর্বাধিক পরিমাণে কিনতে চান।

কাজটি

আপনার এমন একটি প্রোগ্রাম বা ফাংশন তৈরি করা উচিত যা প্রতিটি ব্যক্তির প্রয়োজনীয়তার সাথে সঙ্গতিপূর্ণ সংখ্যার একটি তালিকা গ্রহণ করে। তারপরে আপনার চিকেন নੱਗজেট কিনতে সবচেয়ে ব্যয়বহুল। ক্রমটি গণনা করা এবং মুদ্রণ করা উচিত । সবচেয়ে খরচ কার্যকর α অর্ডার সমন্বয় যার দ্বারা প্রতিটি পরিমাণ বর্গের সমষ্টি সর্বোচ্চ হয়। যদি একেবারে অংশটিতে পুরোপুরি কিনতে কোন উপায় নেই, আপনাকে অবশ্যই প্রিন্ট এর মত falsy মান , , , অথবা যাই হোক না কেন আপনার ভাষায় পাওয়া যায়।0FalseImpossible!

আই / ও উদাহরণ:

[2 7 12 4 15 3] => [20 10 9 4]
     1, 1, 2, 1 => False
  6 5 5 5 5 5 9 => 40
      [6, 4, 9] => 9 10
              1 => 0
            199 => 40, 40, 40, 40, 20, 10, 9
              2 => Impossible!

এখানে প্রথম 400 টির জন্য আদর্শ সমাধানগুলির তালিকা রয়েছে Note নোট করুন এগুলি ফর্ম্যাট করা হয়নি যে আমি কীভাবে আপনার আশা করব, প্রতিটি tupleফর্মটিতে রয়েছে (N lots of M)

বিধি

  1. কোনও মানক ফাঁক নেই।
  2. FrobeniusSolveম্যাথমেটিকায় যেমন সমস্ত বা সংখ্যাগরিষ্ঠ কাজটি অন্তর্নির্মিত ফাংশনগুলির ব্যবহার নয় ।

α - একটি উদাহরণ দিয়ে এটি স্পষ্ট করার জন্য, আপনি এটি দ্বারা 43ও তৈরি করতে পারেন 4 + 6 + 6 + 9 + 9 + 9 = 43 (319), তবে এটি অনুকূল হবে না, এবং এইভাবে একটি ভুল আউটপুট হবে না কারণ স্কোরগুলির যোগফল আমার পরিচিতির সংমিশ্রণের চেয়ে কম। মূলত, উচ্চতর স্কোয়ার = কম ব্যয় = সবচেয়ে ব্যয়বহুল।


কোন সময় / স্মৃতি সীমা আছে?
ডেনিস

@ ডেনিস কোনও সময় বা স্মৃতির সীমা নেই।
কেদে

4
এটি আসলে বৃহস্পতিবার।
mbomb007

4
@ mbomb007 অসাধারণ পর্যবেক্ষণ: পি আমি পরিচয় সামঞ্জস্য করেছি।
কেদে

2
আমি কোনওভাবে চিকেন এমকনুগেট উপপাদ্যটি ব্যবহার করা দরকার ...
স্ট্রেচ ম্যানিয়াক

উত্তর:


7

পাইথ, 26 25 বাইট

e+Zo.aNf!-TCM"  
("./sQ

লক্ষ্য করুন যে কিছু ছাপানো অক্ষর নেই। এটি অনলাইনে চেষ্টা করে দেখুন: বিক্ষোভ । এটি বেশ ধীর (তবে আমার 26 বাইট সমাধানের মতো ধীর নয়)।

ব্যাখ্যা:

                          implicit: Q = input list
                     sQ   sum(Q)
                   ./     generate all integer partitions
       f                  filter for partitions T, which satisfy:
             "   ("          string containing chars with the ASCII-values of 4,6,9,10,20,40
           CM                convert each char to the ASCII-value
         -T                  remove this numbers from T
        !                    and check, if the resulting list is empty
    o                      order the remaining subsets N by:
     .aN                      the vector length of N (sqrt of sum of squares)
  +Z                       insert 0 at the beginning
 e                         print the last element

পাইথ, 32 বাইট

e+Zo.aNfqsTsQysm*]d/sQdCM"  
(

লক্ষ্য করুন যে কিছু ছাপানো অক্ষর নেই। অনলাইনে এটি ব্যবহার করে দেখুন: বিক্ষোভ এই সংস্করণটি আরও দ্রুত। এটি [6,7,8]প্রায় এক সেকেন্ডে ইনপুটটির সমাধান [30]এবং প্রায় 90 সেকেন্ডের মধ্যে ইনপুটটির সমাধান সন্ধান করে ।

ব্যাখ্যা:

                                 implicit: Q = input list
                          "...(  the string containing chars with the ASCII-values of 4,6,9,10,20,40
                        CM       convert each char to the ASCII-value
                m                map each number d to:
                  ]d                create the list [d]
                 *  /sQd            and repeat it sum(Q)/d times
               s                 unfold
              y                  generate all subsets
        f                        filter for subsets T, which satisfy:
         qsTsQ                      sum(Q) == sum(T)
    o                            order the remaining subsets N by:
     .aN                            the vector length of N (sqrt of sum of squares)
  +Z                             insert 0 at the beginning
 e                               print the last element

কেন এটি বর্গফলের যোগফলের চেয়ে বেশি যোগফলের চেয়ে বেশি হয়?
mbomb007

1
@ mbomb007 কারন এটি বিবেচনা করে না। যদি a> খ, স্কয়ার্ট (ক)> স্ক্রুট (খ) এর চেয়ে বেশি এবং তদ্বিপরীত। এবং .aপদ্ধতিটি ব্যবহার করা স্কোয়ারিং এবং যোগফলের চেয়ে কম s^R2
জাকুবে

5

পার্ল, 175 153

sub f{my$n=$_[0];if(!$n){return 1;}foreach$o(40,20,9,10,6,4){if($n>=$o&&f($n-$o)){print"$o ";return 1;}}return 0;}$n+=$_ for@ARGV;if(!f($n)){print":(";}

প্রোগ্রাম আর্গুমেন্ট থেকে এটি ইনপুট নেয়। প্রিন্ট করুন একটি :( যদি এটি কোনও নিখুঁত সমাধান না খুঁজে পায়।

অবহেলিত কোড:

sub f
{
    my $n = $_[0];
    if(!$n)
    {
        return 1;
    }
    foreach $o(40,20,9,10,6,4)
    {
        if($n>=$o&&f($n-$o))
        {
            print "$o ";
            return 1;
        }
    }
    return 0;
}

$n += $_ for @ARGV;
if(!f($n))
{
    print ":(";
}

পিএস: এটি সম্ভবত প্রথম এন্ট্রি যা 10 মিনিট সময় নেয় না 1 2;)

এটি এখানে দেখুন।


এখন পর্যন্ত সবচেয়ে দ্রুততম প্রোগ্রাম হিসাবে উপস্থিত হিসাবে অভিনন্দন! এটি আমার রেফারেন্স প্রোগ্রামের চেয়েও দ্রুত হতে পারে: পি আমি আপনার পোস্টের নীচে একটি আদর্শ লিঙ্ক যুক্ত করেছি যাতে লোকেরা আউটপুট দেখতে পারে।
কেড

আপনার কোডটি ভুল আউটপুট তৈরি করতে পারে। ইনপুট 18মুদ্রণ করা উচিত 9 9, না 4 4 10
ডেনিস

এছাড়াও অন্যান্য ভুল আউটপুট আছে। যদি আমার ভুল না হয় তবে আপনি 9এবং এর ক্রমটি অদলবদল করে সেগুলি সব ঠিক করতে পারেন 10
ডেনিস

@ ডেনিস আপনাকে ধন্যবাদ, এটি স্থির!
টমাস অল্টম্যান

3

সিজেম, 45 29 28 বাইট

q~:+_[40K9A6Z)U]m*_::+@#=0-p

মনে রাখবেন যে এই পদ্ধতিরটি খুব ধীর এবং স্মৃতি-নিবিড়।

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

এটি 5 বাইট ব্যয়ে উল্লেখযোগ্যভাবে বৃদ্ধি করা যেতে পারে:

q~:+_40/4+[40K9A6Z)U]m*_::+@#=0-p

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

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

ধারণা

একটি সর্বোত্তম ক্রয় (বর্গক্ষেত্রের সর্বাধিক যোগফল) একটি বৈধ ক্রয় (নুগের সঠিক সংখ্যা) যা যতটা সম্ভব 40 এর বেশি, তারপরে যতটা সম্ভব 20 টি , তারপরে যতটা সম্ভব 9 টি (যেমন, 9 9হ'ল বেশি পছন্দসই 10 4 4) এবং তাই 10 এর, 6 'গুলি এবং 4 এর জন্য।

এই পদ্ধতির মধ্যে আমরা অ্যারে [40 40 9 10 6 4 0] এর এন কপিগুলির কার্টেসিয়ান পণ্য উত্পন্ন করি , যেখানে এন হ'ল কাঙ্কের সংখ্যা। আমাদের ক্রয় সংখ্যার জন্য এন একটি (খারাপ) উপরের আবদ্ধ। কোডটির স্পিড আপ সংস্করণে আমরা এর পরিবর্তে N / 40 + 4 ব্যবহার করি।

অ্যারে কীভাবে অর্ডার করা হয়েছে সেই কারণে, কার্টেসিয়ান পণ্য ভেক্টর [40 ... 40] দিয়ে শুরু হবে এবং ভেক্টরের সাথে শেষ হবে [0 ... 0] । আমরা প্রথম ভেক্টরের সূচক গণনা করি যার সঠিক যোগফল রয়েছে (যার মধ্যে বর্গক্ষেত্রের সর্বোত্তম যোগফলও থাকবে), সংশ্লিষ্ট অ্যারে উপাদানটি পুনরুদ্ধার করে, স্থানধারক হিসাবে পরিবেশন করা শূন্যগুলি সরিয়ে ফেল এবং ফলাফল মুদ্রণ করি।

যদি কোনও ভেক্টর খুঁজে পাওয়া যায় না, তবে সূচকটি -1 হবে , সুতরাং আমরা [0 ... 0] পুনরুদ্ধার করব, যা পরিবর্তে একটি খালি অ্যারে মুদ্রণ করবে।

কোড

q~                            e# Read from STDIN and evaluate the input.
  :+                          e# Push N, the sum of all elements of the resulting array.
     [40K9A6Z)U]              e# Push B := [40 20 9 10 6 4 0].
    _           m*            e# Push B**N, the array of all vectors of dimension N
                              e# and coordinates in B.
                  _::+        e# Copy and replace each vector by its sum.
                      @#      e# Get the first index of N.
                        =     e# Retrieve the corresponding element.
                         0-p  e# Remove 0's and print.

এটি কয়েকটি পরিস্থিতিগুলির মধ্যে একটি হতে পারে যেখানে হাতে হাত দিয়ে সমাধানের কাজ করা কোড শেষ হওয়ার চেয়ে দ্রুততর হয় .. নির্বিশেষে সুন্দর কাজ :)
কেড

2

জুলিয়া, 126 বাইট

r->(t=filter(i->all(j->j[4,6,9,10,20,40],i),partitions(sum(r)));show(!isempty(t)&&collect(t)[indmax(map(k->sum(k.^2),t))]))

এটি একটি নামবিহীন ফাংশন তৈরি করে যা কোনও অ্যারেটিকে ইনপুট হিসাবে গ্রহণ করে এবং কোনও অ্যারে বা বুলিয়ান প্রিন্ট করে কোনও সমাধান বিদ্যমান কিনা তার উপর নির্ভর করে D এটি কল করার জন্য, এটির একটি নাম দিন f=n->...

অবহেলিত + ব্যাখ্যা:

function f(r)
    # Nugget pack sizes
    packs = [4, 6, 9, 10, 20, 40]

    # Filter the set of arrays which sum to the required number of nuggets
    # to those for which each element is a nugget pack
    t = filter(i -> all(j -> jpacks, i), partitions(sum(r)))

    # Print the boolean false if t is empty, otherwise print the array of
    # necessary nugget packs for which the sum of squares is maximal
    show(!isempty(t) && collect(t)[indmax(map(k -> sum(k.^2), t))])
end

উদাহরণ:

julia> f([1])
false

julia> f([2,7,12,4,15,3])
[20,10,9,4]

1

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

import itertools as i
n=list(map(int,input().split(',')));m=[]
for f in range(1,9):
 for j in range(6*f):
  for x in i.combinations((4,6,9,10,20,40,)*f,j+1):
   if sum(n)==sum(x):m.append(x)
if m!=[]:v=[sum(l**2for l in q)for q in m];print(m[v.index(max(v))])
else:print(0)

ব্যবধান দেখানো হচ্ছে:

import itertools as i
n=list(map(int,input().split(',')));m=[]
for f in range(1,5):
 for j in range(6*f):
\tfor x in i.combinations((4,6,9,10,20,40,)*f,j+1):
\t if sum(n)==sum(x):m.append(x)
\t\tif m!=[]:v=[sum(l**2for l in q)for q in m];print(m[v.index(max(v))])
else:print(0)

সমস্ত পরীক্ষার কেস পাস করে

দ্রষ্টব্য: আমি জানি না যে এটি সমস্ত কেস পাস করবে কিনা কারণ এটি এত ধীর ... তবে এটি হওয়া উচিত ...


এই মুহুর্তে কিছুই ভুল দেখাচ্ছে না, আমি এটি পরীক্ষা করে দেখব। আমি বাড়ি ফিরে আসার পরে আমি একটি রেফারেন্স যুক্ত করব, অগল্ফড প্রোগ্রাম যা আমি গিস্টে থাকা তালিকাটি তৈরি করতে ব্যবহার করি। আমার সময়সীমা নির্ধারণের সময় আমি বিশ্বাস করি যে এটি সমস্ত ক্ষেত্রে 8-12 মিনিটের পরিসরে কিছুটা সময় নিয়েছে।
কেদে

@ ভিওজ- উজ্জ্বল! : ডি
বিটা ক্ষয়

মনে হচ্ছে আমি ভুল হতে পারি, 36 টি পরীক্ষা করার পরে এটি প্রায় 40 মিলিয়ন সংমিশ্রণ (40,007,602 অবধি সঠিক হতে পারে) মেমোরিঅরারে যাওয়ার আগে চলে যায়। এটি আমার ওয়ার্ক মেশিনের সীমাবদ্ধতা হতে পারে যদিও এটিতে কেবল 4 গিগাবাইট মেমরি থাকে।
কেড

@ ভিওজ- এইচএম ... ঠিক আছে আমার ফোনে পরীক্ষা চালিয়ে যাওয়া আমার পক্ষে আশাশূন্য ...
বিটা ডিকায়

1
@underlandmonorail আপনি যদি এটি একবার ব্যবহার করেন তবে <= 4 টি অক্ষরের জন্য একটি সরাসরি আমদানি ভাল (5 বিরতি এমনকি)। তবে আপনি যদি এটি একাধিকবার ব্যবহার করেন তবে from blah import*সর্বদা সেরা। উপরেরটি সম্পর্কে আমি একমাত্র ব্যতিক্রমটি ভাবতে পারি তবে তা হ'ল যদি আপনার একাধিক importগুলি থাকে তবে এটি শুধুমাত্র সময়টি মনে আসে যেখানে asআসলে কার্যকর।
Sp3000

1

জাভাস্ক্রিপ্ট, 261 256 261

d="length";function g(a){for(z=y=0;y<a[d];z+=+a[y++]);return z}x=[40,20,10,9,6,4];l=prompt().split(",");o=g(l);p=[];for(i=0;i<x[d];i++)r=g(p),s=r+x[i],(s<o-3||s==o)&&p.push(x[i]),(i==x[d]-1||40<o-r)&&r+x[i]<o-3&&(i=-1,0==i||o-r<p[p[d]-1]&&p.pop());g(p)==o&&p||0

আমি নিশ্চিত না যে এটি ঠিক আছে কিনা, এটি কাজ করে বলে মনে হচ্ছে তবে আমি অবশ্যই জিনিসগুলি মিস করছি।

এটি ধীর বলে মনে হচ্ছে না, 123456এটি [40 x 3086, 10, 6]প্রায় তাত্ক্ষণিকভাবে আউটপুট দেয়।

ব্যাখ্যা:

ন্যুগেটের আকারের উপরে ইটরেটিং করা (বৃহত্তম বৃহত্তম)

  • যদি স্ট্যাকের যোগফলের যোগফল নাগের আকারের হয় তবে লক্ষ্য - 3 -> এটি স্ট্যাকের উপরে চাপ দিন
  • যদি 40 এর বেশি থাকে -> লুপের কাউন্টারটি পুনরায় সেট করুন
  • সর্বশেষ নাগেট-আকারটি পৌঁছে যাওয়ার পরে যদি স্ট্যাকের যোগফল লক্ষ্যের চেয়ে বেশি হয় -> শেষ উপাদানটি পপ করুন, লুপের কাউন্টারটি পুনরায় সেট করুন
  • যদি স্ট্যাকটির যোগফল যোগ হয় তবে তা ফিরিয়ে দিন, অন্যথায় 0 প্রদান করুন

199 এর জন্য | 1 নির্মিত স্ট্যাকটি দেখতে দেখতে এরকম দেখাচ্ছে

i | stack
0   [40]
0   [40, 40]
0   [40, 40, 40]
0   [40, 40, 40, 40]
0   [40, 40, 40, 40]
1   [40, 40, 40, 40, 20]
2   [40, 40, 40, 40, 20, 10]
3   [40, 40, 40, 40, 20, 10, 9]
4   [40, 40, 40, 40, 20, 10, 9]
5   [40, 40, 40, 40, 20, 10, 9]
==> [40, 40, 40, 40, 20, 10, 9]

1 এর জন্য

i | stack
0   []
1   []
2   []
3   []
4   []
5   []
==> 0

1
আপনার পদ্ধতির লক্ষ্যটি পৌঁছানো যায় কিনা তা যাচাই করে দেখা যাচ্ছে না। 11প্রিন্ট [6]এবং 18প্রিন্ট [10, 4]
ডেনিস

@ ডেনিস এই যে, এটি দেখানোর জন্য ধন্যবাদ। গতকাল গভীর রাত হয়ে গেছে। এটি 5 টি অক্ষরের জন্য স্থির করে। 18 মুদ্রিত হয়েছে [10,4]কারণ আমি এক জোড়া পেরেন অনুপস্থিত। চেকটি প্রকৃতপক্ষে ভুল ছিল, আমি কেবলমাত্র ফলাফলটিটিতে কমপক্ষে একটি উপাদান আছে কিনা তা যাচাই করেছিলাম, যদি এটি সঠিকভাবে যোগ হয় না। আমি সেখানে কী ভেবেছিলাম তা জানি না
C5H8NNaO4
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.