পূর্ণসংখ্যা পার্সেন্টিফাই


21

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

রিটার্ন তালিকার সমস্ত পূর্ণসংখ্যার অবশ্যই 100 পর্যন্ত যোগ করা উচিত You উভয় দিকেই 1 এর বেশি নেই।

p([1,0,2])      ->  [33,0,67] or [34,0,66]
p([1000,1000])  ->  [50,50]
p([1,1,2,4])    ->  [12,12,25,51] or [13,12,25,50] or [12,13,25,50] or [12,12,26,50]
p([0,0,0,5,0])  ->  [0,0,0,100,0]

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোড!


আমাদের অ্যালগরিদম কি ডিটারমিনিস্টিক হওয়া উচিত? এটি কি সর্বদা একটি সীমাবদ্ধ সময়ের মধ্যে শেষ করা উচিত?
lirtosiast

আমাদের ইতিমধ্যে কিছু গোলাকার সমস্যা একই রকম তবে আরও সাধারণ ছিল
edc65

1
আমি আপনাকে পরামর্শ দিচ্ছি যে, আপনি অন্য পরীক্ষা ক্ষেত্রে যোগ করুন: p([2,2,2,2,2,3])। এটির অনেকগুলি সম্ভাব্য আইনী উত্তর রয়েছে তবে সমস্ত 2মান একই মানকে ম্যাপ করা যায় না। এটি অনেকগুলি অতি-সাধারণ অ্যালগরিদমগুলি দূর করে যা পূর্ববর্তী সমস্ত পরীক্ষার ক্ষেত্রে কাজ করে কারণ গোলটি খুব খারাপ হয় না।
সোফিয়া ল্যাটারের

4
ক্যান p([1000,1000]) -> [49,51]?
l4m2

1
@ l4m2 এটি ভুল বলে মনে হচ্ছে, তবে উভয় ফলাফলই 1 এবং আরও বেশি বন্ধ রয়েছে, সুতরাং এটি
অনুমান

উত্তর:


20

ডায়ালগ এপিএল, 21 19 16 বাইট

+\⍣¯1∘⌊100×+\÷+/

উপরেরটি একটি ট্রেনের সমতুল্য

{+\⍣¯1⌊100×+\⍵÷+/⍵}

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

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

                 ⍝ Sample input: 1 1 2 4
           +\    ⍝ Cumulative sum of input. (1 2 4 8)
              +/ ⍝ Sum of input. (8)
             ÷   ⍝ Divide the first result by the second. (0.125 0.25 0.5 1)
       100×      ⍝ Multiply each quotient by 100. (12.5 25 50 100)
      ⌊          ⍝ Round the products down to the nearest integer... (12 25 50 100)
     ∘           ⍝ and ...
  ⍣¯1            ⍝ apply the inverse of...
+\               ⍝ the cumulative sum. (12 13 25 50)

9
যদি কেবল ফার্মাট আপনার কাছ থেকে গল্ফের শিক্ষা গ্রহণ করতে পারত।
টেসেল্ল্যাটিংহেকলার

1
@ টেসেল্লাটিংহেকলার আমি দেখতে পেয়েছি আপনি সেখানে কী করেছেন। তারপরে সম্ভবত তার প্রমাণের জন্য মার্জিনগুলিতে পর্যাপ্ত জায়গা থাকবে। :)
mbomb007

14

টিআই-বেসিক, 26 23 16 বাইট

TI-83 + / 84 + সিরিজের ক্যালকুলেটরগুলির জন্য।

ΔList(augment({0},int(cumSum(ᴇ2Ans/sum(Ans

একটি সুন্দর অ্যালগরিদমের জন্য @ ডেনিসকে ধন্যবাদ! পার্সেন্টে রূপান্তরিত হওয়ার পরে আমরা তালিকার সংশ্লেষক সমষ্টি গ্রহণ করি, তারপরে মেঝেতে, 0 টি সামনের দিকে ট্যাক করি এবং পার্থক্যগুলি গ্রহণ করি। ᴇ2এর চেয়ে এক বাইট ছোট 100

একই বাইট গণনাটি হ'ল:

ΔList(augment({0},int(cumSum(Ans/sum(Ans%

মজাদার ঘটনা: %একটি দ্বি-বাইট টোকেন যা সংখ্যাকে .01 multip দ্বারা গুণ করে তবে ক্যালকুলেটরে টাইপ করার কোনও উপায় নেই! আপনার হয় হয় উত্সটি বাইরে সম্পাদনা করতে হবে বা কোনও অ্যাসেম্বলি প্রোগ্রাম ব্যবহার করতে হবে।

পুরানো কোড:

int(ᴇ2Ans/sum(Ans
Ans+(ᴇ2-sum(Ans)≥cumSum(1 or Ans

প্রথম লাইনটি সমস্ত তলিত পার্সেন্ট গণনা করে, তারপরে দ্বিতীয় লাইনটি প্রথম Nউপাদানগুলিতে 1 যোগ করে, যেখানে Nশতাংশটি বাকি আছে। cumSum("সংযুক্তি যোগফল" বোঝায়।

উদাহরণস্বরূপ {1,1,2,4}:

          sum(Ans                  ; 8
int(ᴇ2Ans/                         ; {12,12,25,50}

                        1 or Ans   ; {1,1,1,1}
                 cumSum(           ; {1,2,3,4}
     ᴇ2-sum(Ans)                   ; 1
                ≥                  ; {1,0,0,0}
Ans+                               ; {13,12,25,50}

আমাদের থাকবে না N>dim([list], কারণ কোনও শতাংশই মেঝেতে 1 এর বেশি হ্রাস পায় না।


আপনি কীভাবে এখানে বাইটগুলি গণনা করছেন তা নিশ্চিত নন, এটি আমার কাছে 23 বছরেরও বেশি
ভয়ঙ্কর দেখাচ্ছে

@ ডেভিড আরেনবুর্গ এটি কেবল মানব-পঠনযোগ্য ফর্ম। সকল টোকেন ( int(, sum(, Ans, ইত্যাদি) শুধুমাত্র এক বাইট দখল করে আছে।
ডেনিস

4
+1 এটি এই সাইটে দেখা সবচেয়ে চিত্তাকর্ষক টিআই-বেসিক গল্ফগুলির মধ্যে একটি।
PhiNotPi

থমাস এই উত্তর অত্যাশ্চর্য!
ডেভএলগার

আপনি কি নিশ্চিত যে %প্রতীকটি প্রবেশ করার কোনও উপায় নেই ? আমি ভাবতাম এটি প্রতীক ক্যাটালগের মধ্যে পাওয়া যেতে পারে ... এছাড়াও, আমার টিআই -৪৪ + সিলভার পাওয়া উচিত। আমি এটি একটি সময় ব্যবহার করে না। ব্লক ডুড দুর্দান্ত।
mbomb007

7

সিজেম, 25 23 22 বাইট

{_:e2\:+f/_:+100-Xb.+}

25 → 24 এর জন্য @ Sp3000 কে ধন্যবাদ।

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

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

_                   e# Push a copy of the input.
 :e2                e# Apply e2 to each integer, i.e., multiply by 100.
    \               e# Swap the result with the original.
     :+             e# Add all integers from input.
       f/           e# Divide the product by the sum. (integer division)
        _:+         e# Push the sum of copy.
           100-     e# Subtract 100. Let's call the result d.
               Xb   e# Convert to base 1, i.e., push an array of |d| 1's.
                 .+ e# Vectorized sum; increment the first |d| integers.

5

গণিত, 41 বাইট

(s=Floor[100#/Tr@#];s[[;;100-Tr@s]]++;s)&

দাঁড়াও, এখানে কি হয়?
16

@ সিক অ্যালগরিদম টিআই-বেসিক উত্তরের পুরানো কোডের মতো। এটি সমস্ত মেঝে পার্সেন্ট গণনা করে, তারপরে প্রথম Nউপাদানগুলিতে 1 যুক্ত করে, যেখানে Nশতাংশটি বাকি আছে।
আলেফাল্ফ

5

জে (8.04 বিটা) , 59 বাইট (30 টি চোরাই বাইট)

ডেনিসের এপিএলের 30 বাইট আক্ষরিক জে-বন্দর উত্তর :

    f=.3 :'+/\^:_1<.100*(+/\%+/)y'

    f 1 1 2 4
12 13 25 50

59 বাইট উত্তর, ভাল আমি নিজে করতে পারে:

f=.3 :0
p=.<.100*y%+/y
r=.100-+/p
p+((r$1),(#p-r)$0)/:\:p
)

(বাকি মানগুলিকে সর্বোচ্চ মানগুলিতে যেতে হবে, প্রতিটি +1 এর চেয়ে বেশি নয়, অবশিষ্ট> 1 বা সর্বোচ্চ মানের ক্ষেত্রে একটি টাইয়ের ক্ষেত্রে একাধিক মানের বিভক্ত হবে)।

যেমন

   f 1 0 2
33 0 67

   f 1000 1000
50 50

   f 1 1 2 4
12 12 25 51

   f 0 0 0 5 0
0 0 0 100 0

   f 16 16 16 16 16 16
17 17 17 17 16 16

   f 0 100 5 0 7 1
0 89 4 0 7 0

ব্যাখ্যা

  • f=.3 : 0 - 'f' একটি পরিবর্তনশীল, যা একটি ক্রিয়া প্রকার (3), নীচে সংজ্ঞায়িত (: 0):
  • p=. ভেরিয়েবল 'পি', এর থেকে নির্মিত:
    • y সংখ্যার একটি তালিকা 1 0 2
    • +/y '+' প্রতিটি মানের মধ্যে রাখা হয় '/', তালিকার যোগফল 3
    • y % (+/y) মূল y মানগুলি যোগফল দ্বারা বিভক্ত: 0.333333 0 0.666667
    • 100 * (y%+/y)33.33.. 0 0.66...শতাংশটি পেতে : এই মানগুলি 100x ।
    • <. (100*y%+/y) শতাংশের জন্য ফ্লোর অপারেটর প্রয়োগ করা হয়: 33 0 66
  • r=. পরিবর্তনশীল 'আর', এর থেকে নির্মিত:
    • +/p মেঝে শতাংশের যোগফল: 99
    • 100 - (+/p) যোগফলটি 100 - যোগফল, বা শতাংশ শতাংশকে 100 করার জন্য প্রয়োজনীয় শতকরা পয়েন্টগুলি।
  • ফলাফল, সঞ্চিত নয়:
    • r $ 1 1s এর তালিকা, যতক্ষণ আমাদের বাড়ানোর প্রয়োজন আইটেমের সংখ্যা: 1 [1 1 ..]
    • #p শতাংশ তালিকার দৈর্ঘ্য
    • (#p - r) এমন আইটেমগুলির সংখ্যা যা বাড়ানো হবে না
    • (#p-r) $ 0 সেই গণনা যতক্ষণ 0 এর তালিকা রয়েছে: 0 0 [0 ..]
    • ((r$1) , (#p-r)$0) 1s তালিকাটি 0 এর তালিকা অনুসরণ করে: 1 0 0
    • \: ppক্রমবর্ধমান ক্রমে রাখার জন্য সূচকগুলির তালিকা ।
    • /: (\:p)\:pআরোহী ক্রমে রাখার জন্য সূচকগুলির তালিকা
    • ((r$1),(#p-r)$0)/:\:p1 1 থেকে উপাদানগুলি নিচ্ছে .. 0 0 .. মাস্ক তালিকা এবং বাছাই তাই অন্যান্য সংখ্যার জন্য সবচেয়ে বড় শতকরা প্রতিটি সংখ্যাকে আমরা বৃদ্ধি প্রয়োজন জন্য এক অবস্থানকে 1s, এবং 0 সেঃ আছেন: 0 0 1
    • p + ((r$1),(#p-r)$0)/:\:p ফলশ্রুতিটি + মাস্ক, ফলাফলের তালিকা তৈরি করা যা 100% এর সমষ্টি, যা ফাংশনটির রিটার্ন মান।

যেমন

33 0 66 sums to 99
100 - 99 = 1
1x1 , (3-1)x0 = 1, 0 0
sorted mask   = 0 0 1

33 0 66
 0 0  1
-------
33 0 67

এবং

  • ) সংজ্ঞা শেষ।

আমি জে এর সাথে খুব অভিজ্ঞ নই; অন্তর্নির্মিত অপারেশনটির "মোট শতাংশের মধ্যে টার্ন লিস্ট" এবং "ইনক্রিমেন্ট এন সর্বাধিক মান" এর একটি পরিষ্কার উপায় থাকলে আমি খুব অবাক হব না। (এটি আমার প্রথম প্রয়াসের চেয়ে 11 বাইট কম)


1
খুব ঠান্ডা. আমার কাছে অজগর সমাধান রয়েছে তবে এটির চেয়ে এটি অনেক দীর্ঘ। চমৎকার কাজ!
ডেভএলগার

1
আপনি যদি খেয়াল না করে থাকেন, বিধি পরিবর্তন হয়েছে, সুতরাং আপনার এটি যথেষ্ট পরিমাণে সংক্ষিপ্ত করতে সক্ষম হওয়া উচিত।
lirtosiast

@ ডেভএলগার ধন্যবাদ! @ থমাসকওয়া আমি লক্ষ্য করেছি, আমি নিশ্চিত নই যে এটি আমাকে যথেষ্ট সাহায্য করে - প্রথম চেষ্টা আমি -২ অক্ষর পেতে পারি। আমার list[0:100-n] + list[:-100-n]দৃষ্টিভঙ্গিটি বদলাতে হবে - এবং আমি এটির কাছে যাওয়ার অন্য কোনও উপায়ের কথা ভাবিনি।
টেসেল্ল্যাটিংহেকলার

4

জাভাস্ক্রিপ্ট (ES6), 81 বাইট

a=>(e=0,a.map(c=>((e+=(f=c/a.reduce((c,d)=>c+d)*100)%1),f+(e>.999?(e--,1):0)|0)))

সেই "অবশ্যই 100 টি শর্তের সমান" হওয়া উচিত (গোল করা এবং যোগ করার চেয়ে) আমার কোডটি প্রায় দ্বিগুণ করেছে (৪৪ থেকে ৮১ পর্যন্ত)। কৌশলটি ছিল দশমিক মানগুলির জন্য একটি পাত্র যুক্ত করা যা একবার এটি 1 এ পৌঁছায়, নিজের থেকে 1 নেয় এবং বর্তমান সংখ্যায় এটি যুক্ত করে। সমস্যা তখন ভাসমান পয়েন্ট ছিল, যার অর্থ [1,1,1] এর কিছুটা বাকি রয়েছে 999999999999999858। সুতরাং আমি চেকটি .৯৯৯ এর চেয়ে বড় হিসাবে পরিবর্তন করেছি এবং ঠিক সেইটাকে যথাযথভাবে কল করার সিদ্ধান্ত নিয়েছি।


4

হাস্কেল, 42 27 বাইট

p a=[div(100*x)$sum a|x<-a]

গল্ফিংয়ের জন্য কয়েকটি জায়গা অপসারণের সাথে হাস্কেলের খুব তুচ্ছ পদ্ধতি।

কনসোল (বন্ধনী উদাহরণের সাথে সামঞ্জস্যপূর্ণ থাকতে পারে):

*Main> p([1,0,2])
[33,0,66]
*Main> p([1000,1000])
[50,50]
*Main> p([1,1,2,4])
[12,12,25,50]
*Main> p([0,0,0,5,0])
[0,0,0,100,0]

সম্পাদনা করুন: আমার রাখার অনুশীলন করেছেন, কিছু স্পষ্ট প্রতিস্থাপন করেছেন।

মূল:

p xs=[div(x*100)tot|x<-xs]where tot=sum xs

1
তালিকার যোগফলটি 100 হওয়া উচিত your আপনার প্রথম উদাহরণে এটি 99
ড্যামিয়েন

4

জেলি , 7 বাইট

-2 ডেনিসকে ধন্যবাদ, আমাকে আর একটি নতুন বৈশিষ্ট্য ( Ä) ব্যবহার করার জন্য মনে করিয়ে দিয়ে এবং :আমার শুরুতে যা ছিল তার পরিবর্তে ব্যবহার করে।

ŻÄ׳:SI

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

জেলি , 11 বাইট

0;+\÷S×ȷ2ḞI

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

পাশাপাশি সম্পন্ন caird coinheringaahing এবং user202729 মধ্যে চ্যাট

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

0; + \ ÷ এস × Ḟ2ḞI - সম্পূর্ণ প্রোগ্রাম।

0; - একটি 0 প্রস্তুত করুন।
  + \ - সংখ্যার যোগফল।
    ÷ এস - ইনপুট এর যোগফল দ্বারা বিভক্ত।
      ȷ ȷ2 - টাইমস 100. monadic লিঙ্ক সংস্করণে × by দ্বারা প্রতিস্থাপিত।
         আমি - প্রতিটি মেঝে, ইনক্রিমেন্টগুলি গণনা করুন (ডেল্টাস, পার্থক্য))


3

পার্ল, 42 বাইট

ডেনিসের অ্যালগোরিদমের উপর ভিত্তি করে

এর জন্য +1 অন্তর্ভুক্ত -p

STDIN- তে সংখ্যার তালিকা সহ চালান

perl -p percent.pl <<< "1 0 2"

percent.pl:

s%\d+%-$-+($-=$a+=$&*100/eval y/ /+/r)%eg


2

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

def f(L):
 p=[int(x/0.01/sum(L))for x in L]
 for i in range(100-sum(p)):p[i]+=1
 return p

print f([16,16,16,16,16,16])
print f([1,0,2])

->

[17, 17, 17, 17, 16, 16]
[34, 0, 66]

2

মস্তিষ্ক-ফ্লাক , 150 বাইট

((([]){[{}]({}<>)<>([])}{})[()])<>([]){{}<>([{}()]({}<([()])>)<>(((((({})({})({})){}){}){}{}){}){}(<()>))<>{(({}<({}())>)){({}[()])<>}{}}{}([])}<>{}{}

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

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

(

  # Compute and push sum of numbers
  (([]){[{}]({}<>)<>([])}{})

# And push sum-1 above it (simulating a zero result from the mod function)
[()])

<>

# While elements remain
([]){{}

  # Finish computation of modulo from previous step
  <>([{}()]({}

    # Push -1 below sum (initial value of quotient in divmod)
    <([()])>

  # Add to 100*current number, and push zero below it
  )<>(((((({})({})({})){}){}){}{}){}){}(<()>))

  # Compute divmod
  <>{(({}<({}())>)){({}[()])<>}{}}{}

([])}

# Move to result stack and remove values left over from mod
<>{}{}

2

জাভাস্ক্রিপ্ট (ES6) 60 63 95

অভিযোজিত থেকে সরলীকৃত আমার (ভুল) উত্তর অন্য চ্যালেঞ্জ করার
আবিষ্কার যে খুব ভুল ছিল Thk @ l4m2 করতে

1 বাইট স্থির করে (এবং 2 বাইট কম, নাম গণনা করা হচ্ছে না F=)

v=>v.map(x=>(x=r+x*100,r=x%f,x/f|0),f=eval(v.join`+`),r=f/2)

যে কোনও ইকামাস্ক্রিপ্ট 6 অনুবর্তী ব্রাউজারে নীচে স্নিপেট চালনা পরীক্ষা করুন

F=
v=>v.map(x=>(x=r+x*100,r=x%f,x/f|0),f=eval(v.join`+`),r=f/2)

console.log('[1,0,2] (exp [33,0,67] [34,0,66])-> '+F([1,0,2]))
console.log('[1000,1000] (exp [50,50])-> '+F([1000,1000]))
console.log('[1,1,2,4] (exp[12,12,25,51] [13,12,25,50] [12,13,25,50] [12,12,26,50])-> '+F([1,1,2,4]))
console.log('[0,0,0,5,0] (exp [0,0,0,100,0])-> '+F([0,0,0,5,0]))
console.log('[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,980] -> '+F([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,980]))
console.log('[2,2,2,2,2,3] -> ' + F([2,2,2,2,2,3]))
<pre id=O></pre>


ব্যর্থ হয়েছে[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,980]
l4m2

@ l4m2 ব্যর্থ কেন? যোগফলটি 100 এবংany single resulting integer returned as a percentage is off by no more than 1 in either direction.
edc65


@ l4m2 ওহ, ঠিক আছে, ধন্যবাদ। আবার চিন্তা করার সময়
edc65

@ l4m2 এখনই ঠিক করা উচিত
edc65

1

মরিচা, 85 বাইট

এটি অ্যারের পরিবর্তে ভেক্টর ব্যবহার করে কারণ আমি যতদূর জানি একাধিক বিভিন্ন দৈর্ঘ্যের অ্যারে গ্রহণ করার উপায় নেই।

let a=|c:Vec<_>|c.iter().map(|m|m*100/c.iter().fold(0,|a,x|a+x)).collect::<Vec<_>>();

1

জাভাস্ক্রিপ্ট, 48 বাইট

F=

x=>x.map(t=>s+=t,y=s=0).map(t=>-y+(y=100*t/s|0))

// Test 
console.log=x=>O.innerHTML+=x+'\n';


console.log('[1,0,2] (exp [33,0,67] [34,0,66])-> '+F([1,0,2]))
console.log('[1000,1000] (exp [50,50])-> '+F([1000,1000]))
console.log('[1,1,2,4] (exp[12,12,25,51] [13,12,25,50] [12,13,25,50] [12,12,26,50])-> '+F([1,1,2,4]))
console.log('[0,0,0,5,0] (exp [0,0,0,100,0])-> '+F([0,0,0,5,0]))
<pre id=O></pre>



0

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

for(;++$i<$argc-1;$s+=$x)echo$x=$argv[$i]/array_sum($argv)*100+.5|0,_;echo 100-$s;

কমান্ড লাইন আর্গুমেন্ট থেকে ইনপুট নেয়, আন্ডারস্কোর দ্বারা সীমাবদ্ধ শতাংশ প্রিন্ট করে।

এটি দিয়ে চালান -nrবা অনলাইনে চেষ্টা করুন


15_15_15_15_15_25ইনপুট দেওয়ার সময় এই আউটপুটগুলি [2,2,2,2,3], যা সঠিক নয় কারণ3/13 ~= 23.1%
সোফিয়া লেটেনার

@ সোফিয়ালটেকার উত্তরগুলির মধ্যে কোনটি এটি সঠিকভাবে করতে পারে?
তিতাস

বেশিরভাগই বাস্তবে করেন। এখনও পর্যন্ত সঠিক উত্তর দুটি অ্যালগরিদমের মধ্যে একটির কাছে নির্মিত বলে মনে হয়; প্রথম রাউন্ডগুলি ক্রমবর্ধমান অঙ্কের শতাংশকে ছাড়িয়ে যায় এবং পার্থক্য গ্রহণ করে; দ্বিতীয় গণনা করে শতকরা মেঝে এবং তারপর যথেষ্ট স্বতন্ত্র শতকরা বৃদ্ধি 100 মোট আনতে
সোফিয়া Lechner

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