সংকুচিত সংখ্যা


10

ইনপুটটি বিভিন্ন সংখ্যার (কমপক্ষে 3, সর্বোচ্চ 20) এর অ্যারে ray প্রতিটি পূর্ণসংখ্যা -1000 এর চেয়ে বড় এবং 1000 এর চেয়ে ছোট।

আপনার টাস্ক থেকে "সুসংগত ম্যাপিং" তাদের দ্বারা সংখ্যার সঙ্কুচিত হয় 0.0থেকে 1.0। এর অর্থ অ্যারের মধ্যে ক্ষুদ্রতম সংখ্যাটি 0.0 এ ম্যাপ করা হবে, বৃহত্তম থেকে 1.0 এ।

আপনি প্যারামিটার হিসাবে অ্যারে পান (কোনও ফাংশনের অভ্যন্তরে) বা স্টিডিন / প্রোগ্রাম আর্গুমেন্ট (আপনি চয়ন করতে পারেন)। বিন্যাসে ফলাফল মুদ্রণ করুন double1;double2;double3;...। আউটপুটটির ইনপুট হিসাবে একই ক্রম থাকতে হবে

আপনি যদি চান তবে দশমিক পয়েন্টের পরে আউটপুটটি 2 সংখ্যায় পরিণত করতে পারেন। দশমিক বিন্দুর পরে কমপক্ষে 1 ডিজিটের অবশ্যই থাকতে হবে।

বিল্ট-ইন ফাংশন ব্যবহার (যেমন mathematicas হিসাবে ফাংশন যা স্কেল তোমার জন্য নম্বর নিচে, Rescale) অননুমোদিত

উদাহরণ:

Input              Output
[5,-20,30]         0.5;0.0;1.0
[1,2,3,4,5]        0.0;0.25;0.5;0.75;1.0
[0,5,100,400]      0.0;0.01;0.25;1.0

(শেষ আউটপুটটি বৃত্তাকার, অন্যথায় এটি হবে 0.0;0.0125;0.25;1.0)


2
এমনকি আমরা একটি ফাংশন লিখি ফলাফল মুদ্রণ করতে হবে? (ডাবলসের সংশ্লিষ্ট অ্যারে ফিরিয়ে দেওয়ার বিরোধিতা হিসাবে।)
মার্টিন এন্ডার

@ মার্টিনবাটনার হ্যাঁ, সেগুলি মুদ্রিত করতে হবে। অন্তর্নির্মিত ফাংশনগুলি অনুমোদিত নয়।
কমনগ্যু

"অন্তর্নির্মিত ফাংশনগুলির ব্যবহার (যেমন গণিতের রেসকেল) অনুমোদিত নয়" " - এটা খুব অস্পষ্ট। কোন কাজগুলি নিষিদ্ধ করা হয়? কেবলমাত্র যারা সম্পূর্ণ সমস্যার সমাধান করেন (যা একটি স্ট্যান্ডার্ড লুফোল হবে)?
জন ডিভোরাক

অপেক্ষা করুন, সুতরাং, ইনপুটটি একটি ফাংশন আর্গুমেন্ট হতে পারে, তবে আউটপুটটি অবশ্যই পর্দার হতে হবে ???
জন ডিভোরাক

1
@ ডেনিস ফর্ম্যাটটিতে প্রশ্নের সাথে দেখা মেলতে হবে। এর অর্থ সংখ্যাগুলি সেমিকোলন দ্বারা বিভক্ত।
কমনগ্যুই

উত্তর:


5

সিজেম, 18 বাইট

q~_$0=f-_$W=df/';*

অনলাইন দোভাষা নোট করুন ভুলভাবে পরিবর্তে 0dহিসাবে উপস্থাপন করে ।00.0

উদাহরণ রান

$ cjam shrink.cjam <<< '[5 -20 30]'; echo
0.5;0.0;1.0
$ cjam shrink.cjam <<< '[1 2 3 4 5]'; echo
0.0;0.25;0.5;0.75;1.0
$ cjam shrink.cjam <<< '[0 5 100 400]'; echo
0.0;0.0125;0.25;1.0

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

q~                    " P := eval(input())         ";
  _$0=                " S := sorted(P)[0]          ";
      f-              " Q := { X - S : X ∊ P }     ";
        _$W=d         " D := double(sorted(Q)[-1]) ";
             f/       " R := { X / D : X ∊ Q }     ";
               ';*    " print(join(R, ';'))        ";

সিজেএম সূত্র হিসাবে এটি সম্পর্কে আমার প্রতিক্রিয়া: ডাব্লুটিএফ? ব্যাখ্যা প্রয়োজন ...
edc65

2
অ্যারে সূচক ব্যবহার সর্বনিম্ন ও সর্বোচ্চ পেয়ে পরিবর্তে পপিং এবং তারপর প্রায় জিনিষ সোয়াপিং এর সুন্দর ভাবে
অপ্টিমাইজার

এটি সম্ভবত আমার ঠান্ডা কথা বলছে তবে আপনি কেন দু'বার বাছাই করলেন? যদি প্রতিটি উপাদান থেকে একটি ধ্রুবক বিয়োগ করা হয় তবে একটি সাজানো অ্যারে বাছাই করা উচিত নয়?
ইনগো বার্ক

@ IngoBürk সাজানো অ্যারে অ্যারে অ্যাক্সেস থেকে বাঁচবে না, আমি মনে করি। যা বোঝায়, কারণ চূড়ান্ত ফলাফলটি বাছাই করা উচিত নয়।
মার্টিন ইন্ডার

@ মার্টিনব্যাটনার ডি'ওহ অবশ্যই. ফলাফলের জন্য আমাদের অর্ডার বজায় রাখতে হবে। ধন্যবাদ!
ইনগো বার্ক

4

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

জন্য @ edc65 ধন্যবাদ toFixedকৌতুক

F=a=>a.map(v=>((v-n)/d).toFixed(2),n=Math.min(...a),d=Math.max(...a)-n).join(';')

এটি সর্বশেষতম ফায়ারফক্স কনসোলে চালান।

এটি এমন একটি ফাংশন তৈরি করে fযা আপনি পছন্দ করতে পারেন

F([5,-20,30])

1) কেন কোনও ক্রিয়াকলাপ অনুমোদিত হলে বিচ্ছিন্ন (প্রম্পট)? 2) দশমিক পয়েন্টের পরে কমপক্ষে 1 ডিজিট হওয়া উচিত। 3) এম সঞ্চয় করার দরকার নেই, কেবল d = মিমি
edc65

আপডেট করা হয়েছে। যদিও, দশমিকের পরে কমপক্ষে 1 ডিজিট পাওয়া শক্ত
অপটিমাইজর

If you want, you can round the output to 2 digits after the decimal pointএটাই আমার মনে হয় সহজ উপায়
edc65

@ edc65 তবে আমি যা করেছি তা ছাড়া রূপান্তর 1করার কোনও উপায় নেই 1.0
অপ্টিমাইজার 13

নাঃ। আমি কি ইঙ্গিত দিতে পারি?
edc65

4

পাইথন 2, 72 68 63 56 55

স্পষ্টতই অন্যান্য উত্তরগুলির মতো সংক্ষিপ্ত নয়, তবে যাইহোক:

x=input()
m=min(x)
print[(i*1.-m)/(max(x)-m)for i in x]

নমুনা রান:

[1,100,25,8,0]                  #input
[0.01, 1.0, 0.25, 0.08, 0.0]    #output

পুরাতন (68 টি অক্ষর, পাইথন 3 এ লিখিত):

x=eval(input())
y=sorted(x)
print([(i-y[0])/(y[-1]-y[0])for i in x])

আপনি সংজ্ঞা দিয়ে আরও একটি চর সংরক্ষণ করতে পারেন m=min(x)
FryAmTheEggman

4

সিজোম, 24 23 বাইট

l~_$)\(:M\;-\Mf-\df/';*

ইনপুটটি এর মতো হতে হবে:

[5 -20 30]

এটি এখানে অনলাইনে চেষ্টা করে দেখুন নোট করুন যে অনলাইন সংকলকটি কেবল সে Double 0হিসাবে মুদ্রণ করে 0। জাভা ইন্টারপ্রেটারে চালান যা সঠিকভাবে মুদ্রণ করে।

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

l~                      "Evaluate input and convert each element to double";
  _$                    "Copy the array and sort the copied array";
    )                   "Pop the last element out of the array. This is Max";
     \                  "Swap last two stack elements, bring sorted array on top";
      (:M               "Pop the first element of array and store it in M. This is Min";
         \;             "Bring the remaining of sorted array on top and remove it from stack";
           -\           "Subtract Max and Min and bring the original array to top of stack"
             Mf-        "Push min to stack and subtract it from each array element";
                \df/    "Bring (Double)(Max-Min) to top and divide each array element by it";
                   ';*  "Push the character ; to stack and join the array with it";

1
আহ, এটি ন্যূনতম এবং সর্বাধিক পাওয়ার জন্য আরও ভাল ধারণা।
মার্টিন ইন্ডার

0;0.5;1পরিবর্তে এই মুদ্রণ 0.0;0.5;1.0
কমনগ্যু

@ মনু - হ্যাঁ, এটি ঠিক করার চেষ্টা করছেন। এবং প্রায় সমস্ত উত্তর কেবল এটিই করে।
অপ্টিমাইজারটি

2
আপনার ঠিক করার দরকার নেই। জাভা ইন্টারপ্রেটার ডাবল 0 হিসাবে প্রতিনিধিত্ব করে 0.0
ডেনিস

3

সি # 92

লিনকপ্যাডের ভিতরে চলছে

void F(int[]a)
{
   double n=a.Min(),d=a.Max()-n;
   a.Select(x=>((x-n)/d).ToString("0.00")).Dump();
}

টেস্ট LinqPad মধ্যে

void Main()
{
    F(new int[]{5,-20,30});
}
void F(int[]a){double n=a.Min(),d=a.Max()-n;a.Select(x=> ((x-n)/d).ToString("0.00")).Dump();}

আউটপুট

IEnumerable<String> (3 items)
0,50 
0,00 
1,00 

3

এপিএল (15)

(2⍕+÷⌈/)(+-⌊/)⎕

(বা, ট্রেন ছাড়াই, এছাড়াও 15 টি অক্ষর :)

2⍕V÷⌈/V←V-⌊/V←⎕

এটি কীবোর্ড থেকে যুক্তিটি পড়ে এবং ফলাফলটি স্ক্রিনে মুদ্রণ করে।

ব্যাখ্যা:

  • : কীবোর্ড থেকে একটি লাইন পড়ুন এবং এটি মূল্যায়ন করুন
  • +-⌊/: অ্যারের মধ্যে সমস্ত আইটেম থেকে অ্যারের মধ্যে সর্বনিম্ন আইটেমটি বিয়োগ করুন
  • +÷⌈/: অ্যারের প্রতিটি আইটেমকে অ্যারের সর্বোচ্চ আইটেম দ্বারা ভাগ করুন
  • 2⍕: দুটি দশমিক স্থান সহ ফর্ম্যাট

টেস্ট:

      (2⍕+÷⌈/)(+-⌊/)⎕
⎕:
     5 ¯20 30
 0.50 0.00 1.00
      (2⍕+÷⌈/)(+-⌊/)⎕
⎕:
      1 2 3 4 5
 0.00 0.25 0.50 0.75 1.00
      (2⍕+÷⌈/)(+-⌊/)⎕
⎕:
      0 5 100 400
 0.00 0.01 0.25 1.00

বাইট গণনা যুক্ত করা উচিত ...
অপ্টিমাইজারটি 14

যা কেবল 24 বাইট।
অপ্টিমাইজার 14

2
@ অপ্টিমাইজার: প্রশ্নটি অন্যথায় না বললে, প্রতিটি উত্তর এনকোডিং ব্যবহার করে গোল করা হয় যা ক্ষুদ্রতম বাইট গণনা দেয়। একটি এপিএল কোডপেজ রয়েছে যা প্রতিটি এপিএল চরিত্রকে একটি বাইট দ্বারা উপস্থাপন করে।
ডেনিস

যদি আমি এখানে কিছু ভুল করছি তবে আমাকে সংশোধন করুন, কিন্তু ডিফল্টরূপে কোড- গল্ফকে বাইট এবং মোটেরেফ.ইন / বাইট- কাউন্টারে গণনা করা হয় #%282%E2%8D%95+%C3%B7%E2%8C%88/ … পৃষ্ঠাটি তার 24 বাইট বলে। আমি কি কিছু রেখে গেলাম ?
অপ্টিমাইজার 14

1
আউটপুটটি ফাঁকা নয়, সেমিকোলন দ্বারা পৃথক করতে হবে।
কমনগ্যুই

3

Pyth , 18

এখন সঠিক বিন্যাস সহ!

j\;mc-dhSQ-eSQhSQQ

টেস্ট:

$ pyth -c 'j\;mc-dhSQ-eSQhSQQ' <<< '[0,5,100,400]'
0.0;0.0125;0.25;1.0

ব্যাখ্যা:

(implicit)              Q = eval(input())
j\;                     ';'.join(
   m                             map(lambda d:
    c                                         float_div(
     -dhSQ                                              d-sorted(Q)[0],
     -eSQhSQ                                            sorted(Q)[-1]-sorted(Q)[0]),
    Q                                         Q))

আউটপুট সঠিকভাবে ফর্ম্যাট করা হয়নি।
কমনগ্যুই

@ মনু এর জন্য দুঃখিত, আমি এটি ঠিক করেছি।
isaacg

আপনার নিজস্ব ভাষা তৈরি হচ্ছে না, যা আপনি সময়ের সাথে পরিবর্তিত হয়ে কিছুটা নিয়ম প্রসারিত করছেন? আপনি প্রোগ্রামটি সংক্ষিপ্ত করতে স্পষ্টতই একটি নতুন বৈশিষ্ট্য যুক্ত করতে পারেন?
ক্রিস জেফারসন

3
@ ক্রিস জেফারসন আমি সমস্যাটি জিজ্ঞাসা করার আগে প্রকাশিত ভাষার নতুন সংস্করণটি সর্বদা ব্যবহার করি। যেহেতু এটি সমস্তই গিথুবকে ঠেলে দেওয়া হয়েছে, এটি যাচাই করা যেতে পারে যে সমস্যা পোস্ট হওয়ার পরে আমি কিছু যুক্ত করছি না। এটি স্ট্যান্ডার্ড সিজি.এসই নিয়ম - ভাষাটি অবশ্যই প্রশ্নের চেয়ে পুরানো হওয়া উচিত এবং আমি এটি মেনে চলি।
isaacg

2

অষ্টাভ 25

b=min(l);(l-b)/(max(l)-b)

ধরে নিই ইনপুট রয়েছে lএবং এটি একটি ইন্টারেক্টিভ শেল থেকে ফলাফল স্বয়ংক্রিয়ভাবে মুদ্রিত হবে (এটি কি অনুমোদিত?)


2
অক্টেভ / মতলব আছে inputযদিও ব্যবহারকারীর ইনপুট পেতে এবং stdin mimick করতে। আপনি একটি ফাংশন লিখতে পারেন। এছাড়াও, এই ফলাফলটি কি সঠিক বিন্যাসে মুদ্রণ করে?
মার্টিন ইন্ডার

এবং না, কেবল ফিরে আসা এবং শেল প্রিন্ট করা সাধারণত এটি গণনা করে না। গল্ফসক্রিপ্ট এবং এর মতো আলাদা কারণ ভাষাটি নির্দিষ্ট করে যে স্ট্যাকটি প্রিন্ট করা হয়েছে শেষ পর্যন্ত। তবে এটি জাভাস্ক্রিপ্টের ক্ষেত্রে নয়। এবং আমি মতলব / অষ্টাভের জন্যও ভাবি না।
ইনগো বার্ক

2

এপিএল, 31 টি অক্ষর / 55 বাইট

{b←⌊/⍵⋄c←(⌈/⍵)-b⋄{2⍕(⍵-b)÷c}¨⍵}

দশমিক বিন্দুর পরে অঙ্ক ছাড়াই পুরাতন কোড:

{b←⌊/⍵⋄c←(⌈/⍵)-b⋄{(⍵-b)÷c}¨⍵}

সর্বনিম্ন ভেক্টর নিন, সর্বোচ্চ এবং সর্বনিম্ন ভেক্টরের মধ্যে পার্থক্য নিন, প্রতিটি উপাদান থেকে ন্যূনতম বিয়োগ করুন এবং ন্যূনতম এবং সর্বোচ্চের মধ্যে পার্থক্য দ্বারা ভাগ করুন।

দশমিক পয়েন্টের পরে দুটি অঙ্ক মুদ্রণের জন্য সম্পাদিত কোড:


2

সিজেম, 30 29 বাইট

l~:d_{e>}*\_{e<}*:Mf-\M-f/';*

STDIN এ ইনপুটটি আশা করে [5 -20 30]

এটি এখানে পরীক্ষা করুন। (এটি পূর্ণসংখ্যা মুদ্রণ করবে 0এবং1 দশমিক বিন্দু ছাড়াই , তবে জাভা ইন্টারপ্রেটার মুদ্রণ করবে 0.0এবং 1.0))

একটি বাগ কারণে আমি সংক্ষিপ্ত {e>}*করতে পারি না :e>যদিও এটি অনুমান অনুযায়ী সম্ভব হওয়া উচিত (যা ন্যূনতম এবং সর্বাধিক উভয় ক্ষেত্রে প্রয়োগ করলে 4 বাইট সংরক্ষণ করতে পারে)।

সামান্য পুরানো ব্যাখ্যা: (পরে সংশোধন করবে)

l~:d_{e<}*_@_{e>}*@-\@f-\f/';* "Read and eval the input leaving an array of strings on the stack";
l~                             "Read and eval the input leaving an array of strings on the stack";
  :d                           "Convert all elements to double";
    _                          "Duplicate the array";
     {e<}*                     "Wrap the MIN function in a black and fold it onto the array";
          _                    "Duplicate the minimum";
           @                   "Rotate the stack, pulling the array to the top";
            _                  "Duplicate the array";
             {e>}*             "Same as before, now with MAX";
                  @            "Rotate the stack, pulling the minimum to the top";
                   -           "Subtract to give the total range";
                    \          "Swap range and array";
                     @         "Rotate the stack, pulling the other minimum to the top";
                      f-       "Subtract the minimum from each element in the array";
                        \      "Swap range and array";
                         f/    "Divide each element in the array by the range";
                           ';  "Push a semicolon character";
                             * "Riffle the semicolon into the array";

প্রোগ্রামের শেষে, স্ট্যাকের সামগ্রীগুলি ডিফল্ট দ্বারা মুদ্রিত হয়।

আমি নিশ্চিত যে স্ট্যাক রদবদলের অর্ধেক সঞ্চয় করার উপায় আছে তবে আমি সিজোমের সাথে এখনও তেমন আরামদায়ক নই।


0;0.5;1পরিবর্তে এই মুদ্রণ 0.0;0.5;1.0
কমনগ্যুই

@ মানু অপ্টিমাইজারের উত্তর সম্পর্কে ডেনিসের মন্তব্য দেখুন। এটি জাভা ইন্টারপ্রেটারে ভাল কাজ করে।
মার্টিন এন্ডার

2

জোজো, 179 বাইট

dim x,n as double,k,z as int16,s() as string
n=1e3
x=-n
for each k in a
x=max(x,k)
n=min(n,k)
next
for k=0 to ubound(a)
s.append str((a(k)-n)/(x-n),"0.0#")
next
msgbox join(s,";")

2

আর, 60 বাইট

m=min(x<-scan());cat(sprintf("%f",(x-m)/(max(x)-m)),sep=";")    

বিন্যাসের কারণে 0এবং 1ডিফল্টরূপে প্রচুর বাইট খায় এবং পূর্ণসংখ্য অংশের অতীত কিছুই প্রদর্শন করতে ছাঁটাই করা হয়।


1

ক্লোজার 63

(fn[v](let[l(apply min v)](map #(/(- % l)(-(apply max v)l))v))) 

এটি নিয়মগুলি পুরোপুরি অনুসরণ করে না, কারণ এটি দ্বিগুণের পরিবর্তে ভগ্নাংশ দেয়। যদি তা গ্রহণযোগ্য না হয় তবে 7 বাইট যুক্ত করুন

Ungolfed:

(fn [values]
    (let [low (apply min values)]
         (map #(/ (- % low)
                  (- (apply max values) low))
              values)))

এর মতো কলযোগ্য:

((fn[v](let[l(apply min v)](map #(/(- % l)(-(apply max v)l))v))) [5 -20 30])

আউটপুট: (1/2 0 1)


1

রুবি, 49

f=->a{$><<a.map{|x|(x-l=a.min).fdiv(a.max-l)}*?;}

ব্যাখ্যা:

f=->a{}     # Define a lambda that takes one argument a
$><<        # Print the following to STDOUT
a.map{|x|}  # For each element x
(x-l=a.min) # Find the lowest element of a, assign it to l, and subtract it from x
.fdiv       # Float division (/ truncates)
(a.max - l) # Divide by the maximum minus the minimum
*?;         # Convert the resulting array into a string joined by the ';' character


0

প্রশ্ন (31) ইমপ্রোপার আউটপুট ফর্ম্যাট

{(%/)(x;max x)-min x}(.:)(0::)0

ইনপুট

1 2 3

আউটপুট

0 .5 1

0

পার্ল - 60

my@a=sort@ARGV;print map{($_-$a[0])/($a[-1]-$a[0])." "}@ARGV

0

জাভা 7, 149 বাইট

float[]c(int[]x){int b=1<<31,a=b-1,j=0,l=x.length;for(int i:x){a=i<a?i:a;b=i>b?i:b;}float[]r=new float[l];for(;j<l;r[j]=x[j++]-a)*1f/(b-a);return r;}

অবরুদ্ধ এবং পরীক্ষার কোড:

এখানে চেষ্টা করুন।

import java.util.Arrays;
class M{
  static float[] c(int[] x){
    int b = Integer.MIN_VALUE,
        a = b-1, // In Java, Integer.MIN_VALUE - 1 = Integer.MAX_VALUE (and vice-versa)
        j = 0,
        l = x.length;
    for(int i : x){
      a = i < a ? i : a; // Determine min value of array
      b = i > b ? i : b; // Determine max value of array
    }
    float[] r = new float[l];
    for(; j < l; r[j] = (x[j++] - a) * 1f / (b-a));
    return r;
  }

  public static void main(String[] a){
    System.out.println(Arrays.toString(c(new int[]{ 5, -20, 30 })));
    System.out.println(Arrays.toString(c(new int[]{ 1, 2, 3, 4, 5 })));
    System.out.println(Arrays.toString(c(new int[]{ 0, 5, 100, 400 })));
  }
}

আউটপুট:

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