কোনও মুদ্রা সিস্টেমটি ক্যানোনিকাল কিনা তা নির্ধারণ করুন


48

ক্যাশিয়ার-এর অ্যালগরিদম যে অধিকাংশ মুদ্রা সিস্টেমের জন্য বেশ ভাল কাজ করে কয়েন ন্যূনতম সংখ্যায় হওয়া পরিবর্তন তৈরীর জন্য একটি আলগোরিদিম হয়। তবে বেশিরভাগ লোভী অ্যালগরিদমের মতো এটি এর ত্রুটিগুলি ছাড়াই নয়। যদি কোনও মুদ্রা ব্যবস্থা ঠিক সঠিকভাবে (বা ঠিক ভুল) সেট আপ করা থাকে তবে কিছু মান রয়েছে যাতে ক্যাশিয়ারের অ্যালগোরিদম অনুকূল পরিবর্তনটি খুঁজে পেতে ব্যর্থ হবে।

নিম্নলিখিত উদাহরণটি ধরুন:

আমাদের কাছে 4 ¢, 3 ¢, এবং 1 ¢ কয়েন রয়েছে। আমরা 6 make করতে চাই।

ক্যাশিয়ারের অ্যালগরিদম প্রথমে বৃহত্তম মুদ্রা (শুরু করতে এক 4)) হিসাবে নির্বাচন করবে এবং বিয়োগ এবং পুনরাবৃত্তি করবে। এটি মোট 3 টি মুদ্রার জন্য একটি 4 ¢ মুদ্রা এবং দুটি 1 ¢ মুদ্রা তৈরি করবে।

দুর্ভাগ্যক্রমে অ্যালগরিদমের জন্য কেবল দুটি কয়েন (দুটি 3 ¢ কয়েন) দিয়ে 6 make করার উপায় রয়েছে।

ক্যাশিয়ারের অ্যালগোরিদম মুদ্রার অনুকূলতম সংখ্যাটি খুঁজে পেতে সমস্ত পূর্ণসংখ্যার মানগুলির জন্য পরিবর্তনের একটি সিস্টেমকে আধ্যাত্মিক বিবেচনা করা হবে।

কার্য

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

আপনার প্রোগ্রামটি এমন সমস্ত সিস্টেমে কাজ করা উচিত যা কোনও মান তৈরি করতে পারে। (অর্থাত্ সমস্ত সিস্টেমে একটি 1 ¢ মুদ্রা থাকবে)

এটি কোড গল্ফ ন্যূনতম বাইটস জেতা।

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

এই তালিকাটি কোনওভাবেই সম্পূর্ণ নয়, আপনার প্রোগ্রামটি সমস্ত বৈধ ইনপুট জন্য কাজ করা উচিত

1, 3, 4       -> 0
1, 5, 10, 25  -> 1
1, 6, 10, 25  -> 0
1, 2, 3       -> 1
1, 8, 17, 30  -> 0
1, 3, 8, 12   -> 0
1, 2, 8, 13   -> 0
1, 2, 4, 6, 8 -> 1

@ জিওবাইটস প্রতিটি ক্ষেত্রেই এর অর্থ এই নয় যে ক্ষুদ্রতম মুদ্রা থেকে বৃহত্তম পর্যন্ত এই পার্থক্যটি বাড়ছে বা সমান হবে
জার্গ হেলসারম্যান

@ জার্গহালসারম্যান এগুলিও যথেষ্ট ভাল নয়। [1, 6, 13] এর ক্রমবর্ধমান পার্থক্য রয়েছে তবে এটি এখনও 18 (13 + 1 * 5 এর পরিবর্তে 6 * 3 এর পরিবর্তে) ব্যর্থ হয়।
Geobits

16
এগুলিকে ক্যানোনিকাল কয়েন সিস্টেম বলা হয় । এই সংক্ষিপ্ত কাগজটি একটি মুদ্রা সিস্টেমটি প্রচলিত আছে কিনা তা যাচাই করার জন্য বহু-কালীন অ্যালগরিদম দেয় (যদিও কম দক্ষ পদ্ধতিটি গল্ফিয়ার হতে পারে)। একটি আকর্ষণীয় পরীক্ষার কেসটি এই গণিতের25, 9, 4, 1 ( এসই পোস্ট থেকে ) 37 সেন্ট তৈরি করছে - যদিও প্রতিটি মুদ্রা ছোটদের যোগফলের চেয়ে বড়, অ-লোভী 25, 4, 4, 4লোভীকে মারধর করে 25, 9, 1, 1, 1
xnor

1
@ এক্সনর দ্রষ্টব্য যে 9, 4, 1-> এর 4, 4, 4চেয়ে ভাল হওয়া আরও 9, 1, 1, 1শক্ত উদাহরণ।
isaacg

উত্তর:


9

হাস্কেল, 94 87 82 বাইট

f s=and[j i-2<j(i-x)|let j i=last$0:[1+j(i-x)|x<-s,x<i],i<-[1..2*last s],x<-s,x<i]

এই সমাধানটি কোনও ক্রিয়া সংজ্ঞায়িত করে jযা ক্যাশিয়ারের অ্যালগরিদমটি সম্পাদন করে এবং ক্যাশিয়ারটি কয়টি কয়েন ব্যবহার করেছিল তা আমাদের জানিয়ে দেয় works তারপরে আমরা তালিকার বৃহত্তম সংখ্যার দ্বিগুণ পরীক্ষা করে দেখব যে সিস্টেমটি পূর্ববর্তী সমস্ত সংখ্যার জন্য প্রচলিত হয়েছে, যে সবচেয়ে বড় সম্ভাব্য মুদ্রা নেওয়া সঠিক পছন্দ।

এই সমাধানটি অনুমান করে যে ইনপুটটি সাজানো হয়েছে।

সবচেয়ে বড় সংখ্যার দ্বিগুণ প্রুফ চেকিং যথেষ্ট: ধরুন যে কিছু সংখ্যার জন্য সিস্টেমটি প্রৌon় নয় i, এবং kসেই তালিকার বৃহত্তম সংখ্যাটি এর চেয়ে বড় নয় i। ধরুন i >= 2kএবং সিস্টেমটি সমস্ত সংখ্যার চেয়ে কম সংখ্যার জন্য প্রচলিত i

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

এই যুক্তিটি সত্যিই দেখায় যে দুটি বড় উপাদানগুলির যোগফল না হওয়া পর্যন্ত আমাদের কেবল পরীক্ষা করা দরকার - তবে এটি করা আরও দীর্ঘতর।

সম্পাদনা: আরজান জোহানসেনকে ধন্যবাদ পাঁচ বাইট!


1
letপরিবর্তে ব্যবহার করে আপনি একটি বাইট সংরক্ষণ করতে পারেন where। আপনি এটিকে |let ...পরে f sবা তালিকা বোধের ভিতরে প্যাটার্ন গার্ড হিসাবে রাখতে পারেন ।
janrjan জোহানসেন

1
সঙ্গে আরও চারটি বাইট j i=last$0:[1+j(i-k)|k<-s,k<i]
janrjan জোহানসেন

5

পাইথ, 18 15 বাইট

!x#eST.gsky_S*e

পরীক্ষা স্যুট

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

আমি এরপরে এই জাতীয় জুড়িটি সনাক্ত করি:

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

ব্যাখ্যা:

!x#eST.gsky_S*e
!x#eST.gsky_S*eQQ   Variable introduction.
                    Q = eval(input()) - sorted list of coins.
              eQ    Greatest coin in the list
             *  Q   Repeat that many times.
            S       Sort the coins
           _        Reverse, so we have the coins in descending order.
          y         Form all subsets, in increasing size then
                    decreasing lexicographic order.
      .gsk          Group by sum
 x#                 Filter by the index in the group of
   eST              The last element lexicographically (greedy solution).
!                   Logically negate.

খুব সুন্দর - কোনও ধারণা কেন এটি [1, 2, 4, 6, 8] এর জন্য হিরকাপ্যাপে ঝুলছে এবং /opt/tryitonline/bin/pyth: line 5: 28070 Killed ... Exit code: 137টিআইও-তে মারা যায়? শুধু স্মৃতি বাইরে?
জোনাথন অ্যালান

এটি মেমরির 2 ^ (নাম্বার মুদ্রা * শেষ কয়েন) বাইট ব্যবহার করে। সুতরাং আপনার উদাহরণস্বরূপ, 2 ^ 40। একটি টেরাবাইট র‌্যাম সহ অনেকগুলি মেশিন নেই
ইসাকাক

আমি ভেবেছিলাম যে এটি হতে পারে, অ্যালগরিদমের বিবরণটি বোঝায় তবে আমি সংখ্যাগুলি গণনা করি নি - এত বিশাল এত তাড়াতাড়ি!
জোনাথন অ্যালান

5

পিএইচপি, 323 বাইট

অ্যারেতে দুটি শেষ উপাদানগুলির যোগফল না হওয়া পর্যন্ত অন্যান্য উপায়ে একইভাবে মুদ্রা গণনা করুন

<?function t($g){rsort($g);$m=array_slice($g,1);for($y=1,$i=$g[0];$i<$g[0]+$m[0];$i++){$a=$b=$i;$p=0;$r=$s=[];while($a||$b){$o=$n=0;$g[$p]<=$a?$a-=$r[]=$g[$p]:$o=1;($m[$p]??1)<=$b?$b-=$s[]=$m[$p]:$n=1;$p+=$o*$n;}$y*=count($r)<=count($s);}return$y;}for($i=0,$t=1;++$i<count($a=$_GET[a]);)$t*=t(array_slice($a,0,$i+1));echo$t;

আমার সেরা এবং দীর্ঘতম উত্তর আমি বিশ্বাস করি> 370 বাইট

আমি কেবল একটি প্রসারিত সংস্করণ দেই কারণ এটির পরে আমার উত্তরটি আরও দীর্ঘ

for($x=1,$n=0,$f=[];++$n<count($a)-1;){
$z=array_slice($a,0,$n+1);
$q=$a[$n]-$a[$n-1];
$i=array_fill(1,$c=max($a[$n+1]??1,11),"X");#$q*$a[$n]
$f=range($a[$n],$c,$q);

$f[]=2*$a[$n];
for($d=[$z[$n]],$j=0;$j<$n;){
   $f[]=$a[$n]+$d[]=$z[$n]-$z[$j++]; 
}

while($f){
    $i[$t=array_pop($f)]="T";
    foreach($d as $g)
    if(($l=$t+$g)<=$c)$f[]=$l;
}

foreach($i as$k=>$v){
    if(in_array($k,$z))$i[$k]="S";
}
#var_dump($i);
if($i[$a[$n+1]]=="X")$x*=0;
}
echo$x;

এই উত্তরের ব্যাখ্যা

অনলাইন সংস্করণ

  1. অ্যারেতে সমস্ত সেট করুন মিথ্যা == এক্স

  2. আপনার দ্বারা নিয়ন্ত্রণ করা অ্যারেতে সমস্ত সংখ্যা সেট করুন

  3. শেষ এস এবং অন্যান্য এস বা 0 এর মধ্যে পার্থক্য খুঁজে পেয়েছে

  4. অ্যারে শেষ এস এ শুরু করুন

  5. সমস্ত সংখ্যা ডি তে নির্ধারণ করুন যেখানে সর্বশেষ এস + সকল পার্থক্যের মধ্যে একটি

  6. একেবারে ডি

  7. অ্যারেতে "টি" থেকে ডি মানগুলি সেট করুন

  8. GOTO 5 এটি পাওয়া সমস্ত ডিআই এর সাথে পুনরাবৃত্তি করুন কোডটিতে এটি সত্যই হয়নি

  9. অ্যারেতে পরবর্তী আইটেমটিতে এক্স থাকলে এটি অন্যথায় মিথ্যা মামলা

অতিরিক্ত পদক্ষেপের পার্থক্যটি স্নিপেটে 3 টির মধ্যে 1 এবং 4 এর মধ্যে 2 এক্স হয় এর অর্থ আপনি ধাপ 5 দ্বারা দ্বিতীয় ডি প্রয়োজন this এই ক্ষেত্রে 10 এর মান পরে সমস্ত ঘটনা সত্য যে আমি এখনও পর্যন্ত দেখতে পেলাম যে একটি সম্পর্ক আছে পার্থক্য এবং অ্যারেতে গণনার মধ্যে আপনি শেষের মিথ্যা মামলাটি আবিষ্কার করার আগে আপনাকে কতটা ডি (ধাপ 5) পয়েন্টটি পেতে হবে তা নির্ধারণ করতে নিয়ন্ত্রণ করে।

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

  1. প্রথম শত্রুকে 1 + শেষ এস এ সেট করুন

  2. এই পয়েন্ট থেকে পরবর্তী শত্রু সেট করতে অ্যারেতে প্রতিটি মান যুক্ত করুন

  3. শেষ শত্রু গোটো 2 দিয়ে শুরু করুন

এতে আপনার যদি এখন শত্রু এবং সত্যিকারের কেস থাকে তবে সম্ভাবনা বেড়ে যায় যে আরও বেশি ডি দিয়ে সম্ভাবনাগুলি ডুবে যায়।

table{width:80%}
td,th{width:45%;border:1px solid blue;}
<table>
  <caption>Working [1,4]</caption>
<tr><th>Number</th><th>Status</th></tr>
<tr><td>1</td><td>S</td></tr>
<tr><td>2</td><td>X</td></tr>
<tr><td>3</td><td>X</td></tr>
<tr><td>4</td><td>S</td></tr>
<tr><td>5</td><td>X</td></tr>
<tr><td>6</td><td>X</td></tr>
<tr><td>7</td><td>D3</td></tr>
<tr><td>8</td><td>D4</td></tr>
<tr><td>9</td><td>X</td></tr>
<tr><td>10</td><td>D3D3</td></tr>
<tr><td>11</td><td>D4D3</td></tr>
<tr><td>12</td><td>D4D4</td></tr>
<tr><td>13</td><td>D3D3D3</td></tr>
<tr><td>14</td><td>D4D3D3</td></tr>
<tr><td>15</td><td>D4D4D4</td></tr>
<tr><td>16</td><td>D4D4D3</td></tr>
</table>
<ul>
  <li>S Number in Array</li>
  <li>D Start|End point TRUE sum Differences from last S</li>
  <li>X False</li>
  </ul>

প্লাস? বাইটস আপনাকে ধন্যবাদ জনাথন অ্যালান আমাকে ভুল পরীক্ষার মামলা দেওয়ার জন্য ২
26২ বাইট কাছাকাছি কিন্তু মুহুর্তে 4 টি ভুল টেস্টকেস যথেষ্ট ভাল নয়

পরীক্ষার কেসগুলির [1,16,256] এর আগে মিথ্যা হওয়ার পরে সত্য হওয়া উচিত

<?for($q=[1],$i=0,$t=1,$w=[0,1];++$i<count($a=$_GET[v]);$w[]=$a[$i],$q[]=$m)($x=$a[$i]-$a[$i-1])>=($y=$a[$i-1]-$a[$i-2])&&((($x)%2)==(($m=(($a[$i]+$x)*$a[$i-1])%$a[$i])%2)&&$m>array_sum($q)||(($x)%2)==0&&(($a[$i]-$a[$i-2])*2%$y)==0||in_array($m,$w))?:$t=0;echo$t;

অ্যারে অ্যাসেন্ডিং অর্ডার

ব্যাখ্যা

for($q=[1],$i=0,$t=1,$w=[0,1] # $t true case $q array for modulos $w checke values in the array
;++$i<count($a=$_GET[v])   #before loop
;$w[]=$a[$i],$q[]=$m) # after loop $q get the modulo from the result and fill $w with the checked value

($x=$a[$i]-$a[$i-1])>=($y=$a[$i-1]-$a[$i-2]) 
# First condition difference between $a[i] and $a[$i-1] is greater or equal $a[$i-1] and $a[$i-2]
# if $a[$-1] == 1 $a[$i-2] will be interpreted as 0
&&  ## AND Operator with the second condition
(
(($x)%2)==   # See if the difference is even or odd
(($m=(($a[$i]+$x)*$a[$i-1])%$a[$i])%2)&&$m>array_sum($q)
# After that we multiply the result with the lower value *$a[$i-1]
    # for this result we calculate the modulo of the result with the greater value %$a[$i]
    # if the difference and the modulo are both even or odd this belongs to true
# and the modulo of the result must be greater as the sum of these before
    # Ask me not why I have make try and error in an excel sheet till I see this relation
||
(($x)%2)==0&&(($a[$i]-$a[$i-2])*2%$y)==0 # or differce modulator is even and difference $a[$i],$a[$i-1] is a multiple of half difference $a[$i-1],$a[$i-2] 
||
in_array($m,$w) # if the modulo result is equal to the values that we have check till this moment in the array we can also neglect the comparison
)
?:$t=0; # other cases belongs to false
echo$t; #Output

দেখে মনে হচ্ছে যে আমি টেবিলটিতে যা দেখেছি তার মধ্যে [1,2,3,4,5,6] এর মান রয়েছে এবং আমি কেবলমাত্র শেষ আইটেমটি 9 পর্যন্ত পরিবর্তন করি 2 23 এবং 4to5 এর জন্য আমরা নিম্ন মানের মান তৈরি করি মডুলো গণনা

table{width:95%;}th,td{border:1px solid}
<table><tr><th>difference</th><td></td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td></tr>
<tr><th>difference modulo 2</th><td></td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td></tr>
<tr><th>value</th><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td></tr>
<tr><th>result</th><td></td><td>3</td><td>8</td><td>15</td><td>24</td><td>35</td></tr>
<tr><th>modulo value great</th><td></td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr>
<tr><th>modulo 2</th><td></td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td></tr>
<tr><th></th><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>difference</th><td></td><td>1</td><td>1</td><td>1</td><td>1</td><td>2</td></tr>
<tr><th>difference modulo 2</th><td></td><td>1</td><td>1</td><td>1</td><td>1</td><td>0</td></tr>
<tr><th>value</th><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>7</td></tr>
<tr><th>result</th><td></td><td>3</td><td>8</td><td>15</td><td>24</td><td>45</td></tr>
<tr><th>modulo value great</th><td></td><td>1</td><td>2</td><td>3</td><td>4</td><td>3</td></tr>
<tr><th>modulo 2</th><td></td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td></tr>
<tr><th></th><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>difference</th><td></td><td>1</td><td>1</td><td>1</td><td>1</td><td>3</td></tr>
<tr><th>difference modulo 2</th><td></td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td></tr>
<tr><th>value</th><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>8</td></tr>
<tr><th>result</th><td></td><td>3</td><td>8</td><td>15</td><td>24</td><td>55</td></tr>
<tr><th>modulo value great</th><td></td><td>1</td><td>2</td><td>3</td><td>4</td><td>7</td></tr>
<tr><th>modulo 2</th><td></td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td></tr>
<tr><th></th><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><th>difference</th><td></td><td>1</td><td>1</td><td>1</td><td>1</td><td>4</td></tr>
<tr><th>difference modulo 2</th><td></td><td>1</td><td>1</td><td>1</td><td>1</td><td>0</td></tr>
<tr><th>value</th><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>9</td></tr>
<tr><th>result</th><td></td><td>3</td><td>8</td><td>15</td><td>24</td><td>65</td></tr>
<tr><th>modulo value great</th><td></td><td>1</td><td>2</td><td>3</td><td>4</td><td>2</td></tr>
<tr><th>modulo 2</th><td></td><td>1</td><td>0</td><td>1</td><td>0</td><td>0</td></tr></table>


আপনি ", "যখন বিভক্ত হতে পারলেন তখন কেন আপনি বিভক্ত হন ","; আপনি যখন কোনও তালিকা নিতে পারলেন তখন কেন বিভক্ত হবেন; আপনি যখন বাছাই তালিকার তালিকা নিতে পারেন কেন আপনি বাছাই করবেন? (আপনি যে পদ্ধতিটি ব্যবহার করছেন তা অযোগ্য কিনা আমি এখনও নিশ্চিত নই, আপনার কাছে একটি প্রমাণ আছে কারণ আমি যে সাহিত্যের মাধ্যমে মুখোমুখি হয়েছি তা মনে হয় আপনার কোডটি যা করছে তার থেকে এটি আরও কঠিন ))
জনাথন অ্যালান

@ জার্গহলসারম্যান দুঃখিত আমি যদি কোনও বিভ্রান্তি সৃষ্টি করে থাকি তবে যদিও এখন আপনি বাছাই করা তালিকার তালিকা তৈরি করতে পারার আগে এটি আলাদা ছিল।
গম উইজার্ড

আমি ভীত, আমি মনে করি যে পার্থক্যগুলি সম্পর্কে আপনাকে কেবলমাত্র মড 2 এর চেয়ে বেশি পরীক্ষা করতে হবে, উদাহরণ হিসাবে [1,2,5,11,17]এটি প্রচলিত। আমার উত্তরটিতে লিঙ্কযুক্ত কাগজটি একবার দেখুন।
জোনাথন অ্যালান

... এবং এটি আমার চেয়ে গর্বিত হাসেলিলারের কোড দিয়ে তা নিশ্চিত করার জন্য: আদর্শ one.com/C022x0
জোনাথন অ্যালান

@ উইট উইজার্ড [1,2,5,11,17] সত্য বা মিথ্যা?
জার্গ হালসারম্যান

4

জাভাস্ক্রিপ্ট (ES6), 116 125 130

l=>eval("r=(d,k)=>d?--k&&l.map(v=>v>d||r(d-v,k)):x=1;for(x=l[0]*2;--x>1;r(x,g))g=0,h=x,l.map(v=>(g+=h/v|0,h%=v));x")

এর জন্য ইনপুট অ্যারে সাজানো ক্রমে সাজানো দরকার। 2 এন ডাউনটো 2 (এন সর্বাধিক মুদ্রার মান হিসাবে) থেকে প্রাপ্ত প্রতিটি মানের জন্য, এটি লোভী অ্যালগরিদম থেকে কয়েনের সংখ্যা খুঁজে বের করে এবং কয়েনের একটি ছোট সেট আবিষ্কার করার চেষ্টা করে।

কম গল্ফড

l=>{
  // recursive function to to find a smaller set of coins
  // parameter k is the max coin limit
  r = (d,k) => d // check if difference is not 0
     ? --k // if not, and if the number of coins used will be less than limit
      && l.map(v => v>d || r(d-v, k))  // proceed with the recursive search
     : x=1 // if diff is 0, value found, set x to 1 to stop the loop
  for( x=l[0]*2; --x > 1; )  
    g=0, h=x, l.map(v=>(g += h/v|0, h %= v)), // find g with the greedy algorithm
    r(x,g) // call with initial difference equal to target value
  return x
}

পরীক্ষা

f=
l=>eval("r=(d,k)=>d?--k&&l.map(v=>v>d||r(d-v,k)):x=1;for(x=l[0]*2;--x>1;r(x,g))g=0,h=x,l.map(v=>(g+=h/v|0,h%=v));x")

/* No eval
f=l=>{
  r=(d,k)=>d?--k&&l.map(v=>v>d||r(d-v,k)):x=1;
  for(x=l[0]*2;--x>1;r(x,g))
    g=0,h=x,l.map(v=>(g+=h/v|0,h%=v));
  return x;
}*/

;[
 [[100,50,20,10,5,2,1],1], [[4,3,1],0],
 [[25,10,5,1],1], [[25,10,6,1],0],
 [[3,2,1],1], [[30,17,8,1], 0], 
 [[12,8,3,1],0], [[13,8,2,1], 0]
].forEach(t=>{
  var i=t[0],k=t[1],r=f(i),
      msg=((r==k)?'OK ':'KO ')+i+' -> '+r
      + (r==k?'':' (should be '+k+')')
  O.textContent += msg+'\n'
})

function test()
{
  var i=I.value.match(/\d+/g).map(x=>+x).sort((a,b)=>b-a)
  O.textContent = i+' -> '+f(i)+'\n'+O.textContent
 }
#I { width:50% }
<input id=I value='1 4 9'><button onclick='test()'>test</button>
<pre id=O></pre>


4

পাইথন, 218 211 205 বাইট

-1 @TuukkaX করার বাইট ধন্যবাদ (ক স্থান মধ্যে মুছে যেতে পারে <3এবং or)

from itertools import*
g=lambda x,c,n=0:x and g(x-[v for v in c if v<=x][0],c,n+1)or n
lambda c:len(c)<3or 1-any(any(any(x==sum(p)for p in combinations(c*i,i))for i in range(g(x,c)))for x in range(c[0]*2))

repl.it

অবতরণ ক্রমে ইনপুট।

ভয়াবহভাবে হিংস্র শক্তি। একটি একক ইউনিট মুদ্রা এবং কিছু অন্যান্য মুদ্রার যে কোনও সেট প্রমিত হয়। বৃহত্তর সেটগুলির জন্য ক্ষুদ্রতম ব্যর্থতার ক্ষেত্রে, যদি কোনও উপস্থিত থাকে তবে তৃতীয় ক্ষুদ্রতম মুদ্রার চেয়ে বড় বা সমান হবে (এটি নিশ্চিত না যে এটি সমান হতে পারে কী করে!) এবং দুটি বৃহত্তম মুদ্রার যোগফলের চেয়ে কম - এই কাগজটি দেখুন (যা আসলে অন্যটিকে উল্লেখ করে তবে একটি ও (n ^ 3) পদ্ধতি দেয়।

g লোভী পদ্ধতিতে ব্যবহৃত মুদ্রা গণনা করে এবং নামবিহীন ফাংশন সম্ভাব্য প্রার্থীদের (আসলে বাইট সংরক্ষণে সবচেয়ে বড় মুদ্রার দ্বিগুণ থেকে এক থেকে কম) এবং এই পরিমাণের সমান যে কোনও কম মুদ্রার সংগ্রহের সন্ধান করে।

gকোনও ক্যাশিয়ার যা যা করে তা সম্পাদন করে এটি কাজ করে, এটি পুনরাবৃত্তভাবে সবচেয়ে বড় মুদ্রা পরিমাণের চেয়ে কম বা সমান করে এখনও তৈরি করতে, [v for v in c if v<=x][0]দূরে রাখে এবং ব্যবহৃত মুদ্রার সংখ্যা গণনা করে n,।

নামহীন ফাংশনটি len(c)3 এর চেয়ে কম হলে 1 প্রদান করে এবং অন্যথায় পরীক্ষা করে যে এটি ঘটনাটি নয়, 1-...সম্ভাবনার পরিসরের কোনও মান, range(c[0]*2)))কম মুদ্রা দিয়ে সম্ভব i in range(g(x,c)), প্রতিটি মুদ্রার অনেকগুলি সংগ্রহ করে, c*i, এবং iমুদ্রার সমস্ত সংমিশ্রণ পরীক্ষা combinations(c*i,i)করে দেখুন, একই মানের কোনও যোগফল কিনা তা দেখার জন্য।


@ ওয়েট উইজার্ড এটি [13,8,2,1] এর জন্য মিথ্যা ফিরিয়ে দেয় - আমি এটি পরীক্ষার ক্ষেত্রে যুক্ত করেছি to যোগ করা স্পষ্টতা যে ইনপুটটি ক্রমবর্ধমান ক্রমে রয়েছে।
জোনাথন অ্যালান

1
3orকাজ করা উচিত.
Yytsi

ধন্যবাদ @ টুকুএক্সএক্স, আমিও এর not(...)সাথে প্রতিস্থাপন করতে পারলাম1-...
জোনাথন অ্যালান

2

জেলি ( কাঁটাচামচ ), 15 14 বাইট

SRæFµS€Ṃ=$Ṫµ€Ȧ

এই সমাধানটি এই কাগজটি থেকে পাল্টা উদাহরণের জন্য সীমা ব্যবহার করে । সেখানে, লেখক পাল্টা উদাহরণের জন্য একটি দৃ bound় বাউন্ড ব্যবহার করে তবে গল্ফিংয়ের স্বার্থে, মুদ্রার বর্ণের যোগফলের পরিসর ব্যবহৃত হয় যা আরও বড় এবং এতে আবদ্ধ থাকে।

এই প্রোগ্রামটি আমার মেশিনে এক সেকেন্ডেরও কম সময়ে সমস্ত পরীক্ষার কেসগুলি গণনা করে।

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

ব্যবহার

$ ./jelly eun 'SRæFµS€Ṃ=$Ṫµ€Ȧ' '1,2,4,6,8'
1

পারফরম্যান্সটি ভাল এবং সমস্ত পরীক্ষার কেস এক সেকেন্ডেরও কম সময়ে একবারে সমাধান করতে পারে।

$ time ./jelly eun 'SRæFµS€Ṃ=$Ṫµ€Ȧ¶Ç€' '[[1,3,4],[1,5,10,25],[1,6,10,25],[1,2,3],[1,8,17,30],[1,3,8,12],[1,2,8,13],[1,2,4,6,8]]'
[0, 1, 0, 1, 0, 0, 0, 1]

real    0m0.793s
user    0m0.748s
sys     0m0.045s

ব্যাখ্যা

SRæFµS€Ṃ=$Ṫµ€Ȧ  Input: list of integers C
    µ           Start a new monadic chain
S                 Sum
 R                Range, [1, 2, ..., sum(C)]
  æF              Frobenius solve for each X in the range using coefficients from C
                  This generates all vectors where the dot product of a
                  vector with C equals X, ordered by using values from the
                  start to end of C
           µ€   Start a new monadic chain that operates on each list of vectors
     S€           Sum each vector
         $        Monadic hook on the sums
       Ṃ            Minimum (This is the optimal solution)
        =           Vectorized equals, 1 if true else 0
          Ṫ       Tail (This is at the index of the greedy solution)
             Ȧ  All, returns 0 if it contains a falsey value, else 1

2

জাভাস্ক্রিপ্ট (ES6), 144 132 124 122 110 বাইট

a=>![...Array(a[0]*2)].some((_,i)=>(g=(a,l=0,n=i)=>[a.filter(c=>c>n||(l+=n/c|0,n%=c,0)),-l*!n])(...g(a))[1]>0)

অ্যারেটি অবতরণ ক্রমে বাছাই করা দরকার। সংযুক্ত কাগজে এমন পর্যবেক্ষণ ব্যবহার করে যে সিস্টেমটি যদি প্রৌ .় না হয় তবে প্রাথমিক লোভী অ্যালগরিদম থেকে অব্যবহৃত কয়েনগুলি পচানোর সময় কম কয়েন গ্রহণের ক্ষেত্রে কমপক্ষে 2A [0] এর চেয়ে কম মূল্য থাকে value

সম্পাদনা করুন: 12 টি বাইট সংরক্ষণ করে বুঝতে পেরেছি যে আমি ইতিমধ্যে লক্ষ্যমাত্রায় পৌঁছে গিয়েও আমি সমস্ত কয়েন চেক করতে পারি। আমার মধ্যবর্তী আউটপুট থেকে এতে স্যুইচ করে 8 বাইট সংরক্ষণ [l,b]করা [b,-l]; এটি আমাকে দ্বিতীয় কলটির প্যারামিটার হিসাবে সরাসরি প্রথম ফলাফলটি পাস করার অনুমতি দেয় এবং দ্বিতীয় কলটি সফল হয়েছিল কিনা তা সনাক্ত করে একটি ছোট সঞ্চয়ও করে। কলব্যাকের সংজ্ঞাটি সরিয়ে 2 বাইট সংরক্ষণ gকরা হয়েছে some, আমাকে অকারণে দুবার লুপ ভেরিয়েবল এড়ানো এড়াতে দেয়। আমার পুনরাবৃত্তকারী সহায়ক ফাংশন থেকে একটি কলটিতে স্যুইচ করে 12 বাইট সংরক্ষণ করা filter(আমার মধ্যবর্তী আউটপুট সুইচ দ্বারা সম্ভব হয়েছে)।


2

পার্ল, 69 বাইট

জন্য +2 অন্তর্ভুক্ত -pa

এসটিডিনে ক্রমবর্ধমান ক্রমে মুদ্রা দিন। আপনি বিকল্পভাবে 1মুদ্রা ছেড়ে দিতে পারেন ।

coins.pl <<< "4 3 1"

coins.pl:

#!/usr/bin/perl -pa
$_=!map{grep$`>=$_&&($n=$G[$`-$_]+1)<($G[$`]||=$n),@F,/$/}1..2*"@F"

@Gবৃহত্তম মুদ্রার 1 থেকে দ্বিগুণ পরিমাণে ক্যাশিয়ারদের অ্যালগোরিদম দ্বারা ব্যবহৃত মুদ্রার সংখ্যা তৈরি করে । প্রতিটি পরিমাণের জন্য পরীক্ষা করে দেখুন যে যদি সেই পরিমাণটি 1 মুদ্রার মূল্য হ্রাস হয় তবে ক্যাশিয়ারদের অ্যালগোরিদমকে কমপক্ষে 1 টি কম মুদ্রা প্রয়োজন। যদি না হয় তবে এটি একটি কাউন্টারিক্স নমুনা (বা পূর্বে একটি কাউন্টারিক নমুনা ছিল)। আমি প্রথম কাউন্টারেরেক্সামলে থামতে পারি তবে এতে আরও বাইট লাগে। তাই সময় জটিলতা O(max_coin * coins)এবং স্থান জটিলতা হয়O(max_coin)

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