ลดขนาดตัวเลข


10

อินพุตเป็นอาร์เรย์ของจำนวนเต็ม (อย่างน้อย 3, สูงสุด 20) ที่แตกต่างกัน แต่ละจำนวนเต็มมากกว่า -1000 และน้อยกว่า 1,000

งานของคุณคือการหดตัวเลขด้วย "การทำแผนที่เป็นเส้นตรง" พวกเขาจากไป0.0 1.0ซึ่งหมายความว่าจำนวนที่น้อยที่สุดในอาเรย์จะถูกแมปเป็น 0.0, มากที่สุดถึง 1.0

คุณได้รับอาร์เรย์เป็นพารามิเตอร์ (ภายในฟังก์ชั่น) หรืออาร์กิวเมนต์ stdin / program (คุณสามารถเลือก) double1;double2;double3;...พิมพ์ออกผลในรูปแบบ การส่งออกจะต้องมีการสั่งซื้อเช่นเดียวกับการป้อนข้อมูล

ถ้าคุณต้องการคุณสามารถปัดเศษผลลัพธ์เป็น 2 หลักหลังจุดทศนิยม ต้องมีอย่างน้อย 1 หลักหลังจุดทศนิยม

การใช้งานของฟังก์ชั่น (ฟังก์ชั่นที่ขนาดลงเบอร์สำหรับคุณเช่นแมธิแมติกา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
ดังนั้นแม้เราจะเขียนฟังก์ชั่นผลลัพธ์ก็จะต้องพิมพ์ออกมา? (ตรงข้ามกับการคืนอาเรย์คู่ที่สอดคล้องกัน)
Martin Ender

@ MartinBüttnerใช่พวกเขาจะต้องพิมพ์ ฟังก์ชันในตัวไม่ได้รับอนุญาต
CommonGuy

"การใช้งานฟังก์ชั่นในตัว (เช่น mathematicas Rescale) ไม่ได้รับอนุญาต" - มันคลุมเครือเกินไป ฟังก์ชั่นใดบ้างที่ไม่ได้รับอนุญาต เฉพาะผู้ที่แก้ปัญหาทั้งหมด (ซึ่งจะเป็นช่องโหว่มาตรฐาน) คืออะไร?
John Dvorak

รอดังนั้นอินพุตอาจเป็นอาร์กิวเมนต์ของฟังก์ชัน แต่ผลลัพธ์จะต้องเป็นหน้าจอ ???
John Dvorak

1
@Dennis รูปแบบต้องตรงกับที่แสดงในคำถาม ซึ่งหมายความว่าตัวเลขคั่นด้วยเครื่องหมายอัฒภาค
CommonGuy

คำตอบ:


5

CJam, 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, ';'))        ";

ปฏิกิริยาของฉันต่อสิ่งนี้ในฐานะแหล่งที่มาของ CJam: Wtf? จำเป็นต้องมีคำอธิบาย ...
edc65

2
เป็นวิธีที่ดีในการรับค่าต่ำสุดและสูงสุดโดยใช้ดัชนีอาเรย์แทนการ popping แล้วทำการแลกเปลี่ยนสิ่งต่าง ๆ
เครื่องมือเพิ่มประสิทธิภาพ

อาจเป็นเพราะฉันพูดเย็น แต่ทำไมคุณถึงจัดเรียงสองครั้ง อาร์เรย์ที่เรียงลำดับไม่ควรจัดเรียงหากค่าคงที่ถูกลบออกจากแต่ละองค์ประกอบหรือไม่
Ingo Bürk

@ IngoBürkฉันคิดว่าอาร์เรย์ที่เรียงลำดับไม่รอดจากการเข้าถึงอาร์เรย์ ซึ่งสมเหตุสมผลเพราะผลสุดท้ายจะต้องไม่ถูกจัดเรียง
Martin Ender

@ MartinBüttner D'oh แน่นอน. เราต้องรักษาความสงบเรียบร้อยของผลลัพธ์ ขอบคุณ!
Ingo Bürk

4

JavaScript, ES6, 81 ไบต์

ขอบคุณ @ edc65 สำหรับtoFixedเคล็ดลับ

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

ใช้งานได้ใน Firefox Console ล่าสุด

สิ่งนี้จะสร้างฟังก์ชั่นfที่คุณสามารถเรียกใช้ได้

F([5,-20,30])

1) ทำไม eval (prompt) เมื่อฟังก์ชั่นได้รับอนุญาต 2) ต้องมีอย่างน้อย 1 หลักหลังจุดทศนิยม 3) ไม่จำเป็นต้องเก็บ M เพียง d = Mm
edc65

Updated แม้ว่าการรับอย่างน้อย 1 หลักหลังจากทศนิยมเป็นเรื่องยาก
เครื่องมือเพิ่มประสิทธิภาพ

If you want, you can round the output to 2 digits after the decimal pointนั่นเป็นวิธีที่ง่ายกว่าที่ฉันคิด
edc65

@ edc65 แต่ไม่มีทางที่จะแปลง1เป็น1.0ยกเว้นสิ่งที่ฉันทำ
เครื่องมือเพิ่มประสิทธิภาพ

Nope ฉันขอคำใบ้ได้ไหม
edc65

4

Python 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 ตัวอักษรเขียนด้วย Python 3):

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

m=min(x)คุณสามารถบันทึกหนึ่งถ่านมากขึ้นด้วยการกำหนด
FryAmTheEggman

4

CJam, 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
อานั่นเป็นความคิดที่ดีกว่ามากที่จะได้ค่าต่ำสุดและสูงสุด
Martin Ender

พิมพ์นี้แทน0;0.5;1 0.0;0.5;1.0
CommonGuy

@Manu - ใช่พยายามแก้ไขมัน และคำตอบเกือบทั้งหมดทำได้แค่นี้เท่านั้น
เครื่องมือเพิ่มประสิทธิภาพ

2
คุณไม่ต้องการการแก้ไข 0.0ชวาล่ามหมายถึงคู่เป็น 0
เดนนิส

3

C # 92

ทำงานภายใน LinqPad

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

APL (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

ควรเพิ่มจำนวนไบต์ ...
เครื่องมือเพิ่มประสิทธิภาพ

ซึ่งมีขนาด 24 ไบต์เท่านั้น
เครื่องมือเพิ่มประสิทธิภาพ

2
@Optimizer: หากไม่มีการระบุคำถามเป็นอย่างอื่นทุกคำตอบจะได้รับคะแนนโดยใช้การเข้ารหัสที่ให้จำนวนไบต์ที่น้อยที่สุด มีเพจรหัส APL ที่แสดงถึงอักขระ APL ทุกตัวด้วยหนึ่งไบต์
Dennis

แก้ไขฉันถ้าฉันทำอะไรผิดที่นี่ แต่โดยค่าเริ่มต้นโค้ดกอล์ฟจะถูกนับเป็นไบต์และmothereff.in/byte-counter#%282%E2%8D%95D%953%B7%E2%8C%88/ … page บอกว่ามีขนาด 24 ไบต์ ฉันพลาดอะไรไปหรือเปล่า?
เครื่องมือเพิ่มประสิทธิภาพ

1
เอาต์พุตต้องแยกด้วยเครื่องหมายอัฒภาคไม่ใช่ช่องว่าง
CommonGuy

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))

รูปแบบผลลัพธ์ไม่ถูกต้อง
CommonGuy

@Manu ขออภัยด้วยฉันได้แก้ไขแล้ว
isaacg

ไม่ได้สร้างภาษาของคุณเองซึ่งคุณเปลี่ยนไปตามกาลเวลายืดกฎเล็กน้อยใช่ไหม เห็นได้ชัดว่าคุณสามารถเพิ่มคุณสมบัติใหม่เพื่อให้โปรแกรมสั้นลงได้หรือไม่
Chris Jefferson

3
@ChrisJefferson ฉันมักจะใช้ภาษาเวอร์ชันใหม่ล่าสุดที่ออกมาก่อนที่ปัญหาจะถูกถาม เนื่องจากทั้งหมดถูกส่งไปยัง Github จึงสามารถตรวจสอบได้ว่าฉันไม่ได้เพิ่มอะไรเลยหลังจากมีการโพสต์ปัญหา นั่นคือกฎ CG.SE มาตรฐาน - ภาษาจะต้องเก่ากว่าคำถามและฉันก็ปฏิบัติตาม
isaacg

2

ระดับแปดเสียง

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

ถือว่าอินพุตอยู่lและเนื่องจากเป็นเชลล์แบบโต้ตอบผลลัพธ์จะถูกพิมพ์โดยอัตโนมัติ (สิ่งนี้อนุญาตหรือไม่)


2
Octave / Matlab ไม่ได้inputรับการป้อนข้อมูลผู้ใช้และ mimick STDIN นอกจากนี้คุณยังสามารถเขียนฟังก์ชั่น นอกจากนี้จะพิมพ์ผลลัพธ์ในรูปแบบที่ถูกต้องหรือไม่
Martin Ender

และไม่เพียงแค่ส่งคืนและให้เชลล์พิมพ์โดยทั่วไปจะไม่นับ Golfscript และสิ่งที่คล้ายกันแตกต่างกันเนื่องจากภาษาระบุว่าสแต็กถูกพิมพ์ในตอนท้าย แต่นี่ไม่ใช่กรณีเช่น Javascript และฉันไม่คิดว่า Matlab / Octave เช่นกัน
Ingo Bürk

2

APL, 31 ตัวอักษร / 55 ไบต์

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

รหัสเก่าที่ไม่มีตัวเลขหลังจุดทศนิยม:

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

ใช้เวกเตอร์ขั้นต่ำสุดนำความแตกต่างระหว่างค่าสูงสุดและต่ำสุดของเวกเตอร์ลบค่าต่ำสุดจากแต่ละองค์ประกอบและหารด้วยผลต่างระหว่างค่าต่ำสุดและสูงสุด

Edited Code เพื่อพิมพ์ตัวเลขสองหลักหลังจุดทศนิยม:


2

CJam, 30 29 ไบต์

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

คาดว่าจะมีการป้อนข้อมูลใน STDIN เช่น [5 -20 30]เช่น

ทดสอบที่นี่ (สิ่งนี้จะพิมพ์จำนวนเต็ม0และ1ไม่มีจุดทศนิยม แต่ตัวแปล Java จะพิมพ์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";

ในตอนท้ายของโปรแกรมเนื้อหาสแต็กจะถูกพิมพ์ตามค่าเริ่มต้น

ฉันแน่ใจว่ามีวิธีการที่จะประหยัดครึ่งหนึ่งของการปรับสแต็กใหม่ แต่ฉันยังไม่คุ้นเคยกับ CJam


พิมพ์นี้แทน0;0.5;1 0.0;0.5;1.0
CommonGuy

@Manu ดูความคิดเห็นของ Dennis ในคำตอบของเครื่องมือเพิ่มประสิทธิภาพ มันทำงานได้ดีในล่าม Java
Martin Ender

2

Xojo, 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

R, 60 ไบต์

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

การจัดรูปแบบกินจำนวนมากไบต์เนื่องจาก0และ1โดยค่าเริ่มต้นจะถูกตัดแต่งเพื่อแสดงอะไรผ่านส่วนจำนวนเต็ม


1

Clojure 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)))

callable เช่นนี้:

((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

Java 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;}

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

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.