Thu hẹp số


10

Đầu vào là một mảng gồm (ít nhất 3, tối đa 20) số nguyên khác nhau. Mỗi số nguyên lớn hơn -1000 và nhỏ hơn 1000.

Nhiệm vụ của bạn là thu nhỏ các số bằng cách "ánh xạ tuyến tính" chúng từ 0.0đến 1.0. Điều này có nghĩa là số nhỏ nhất trong mảng sẽ được ánh xạ thành 0,0, lớn nhất là 1,0.

Bạn nhận được mảng dưới dạng tham số (bên trong hàm) hoặc đối số stdin / chương trình (bạn có thể chọn). In ra kết quả ở định dạng double1;double2;double3;.... Đầu ra phải có cùng thứ tự với đầu vào .

Nếu bạn muốn, bạn có thể làm tròn đầu ra thành 2 chữ số sau dấu thập phân. Phải có ít nhất 1 chữ số sau dấu thập phân.

Việc sử dụng các hàm dựng sẵn (các hàm giảm số cho bạn, chẳng hạn như mathicalas Rescale) không được phép .

Ví dụ:

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

(Đầu ra cuối cùng được làm tròn, nếu không nó sẽ được 0.0;0.0125;0.25;1.0)


2
Vì vậy, ngay cả chúng ta viết một chức năng kết quả phải được in? (Trái ngược với việc trả lại một mảng nhân đôi tương ứng.)
Martin Ender

@ MartinBüttner Vâng, chúng phải được in. Các chức năng tích hợp không được phép.
CommonGuy

"việc sử dụng các hàm tích hợp (như mathicalas Rescale) không được phép." - điều đó quá mơ hồ. Những chức năng nào không được phép? Chỉ có những người giải quyết vấn đề đầy đủ (mà sẽ là một lỗ hổng tiêu chuẩn) là?
John Dvorak

Đợi đã, vì vậy, đầu vào có thể là một đối số chức năng, nhưng đầu ra phải đến màn hình ???
John Dvorak

1
@Dennis Định dạng phải phù hợp với định dạng được hiển thị trong câu hỏi. Điều này có nghĩa là các số được phân tách bằng dấu chấm phẩy.
CommonGuy

Câu trả lời:


5

CJam, 18 byte

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

Lưu ý rằng các thông dịch viên trực tuyến vô cớ và đại diện 0dnhư 0thay vì 0.0.

Chạy ví dụ

$ 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

Làm thế nào nó hoạt động

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

Phản ứng của tôi với điều này, với tư cách là một nguồn của CJam: Wtf? cần giải thích ...
edc65

2
Cách hay để nhận tối thiểu và tối đa bằng cách sử dụng chỉ mục mảng thay vì bật và sau đó hoán đổi mọi thứ xung quanh
Trình tối ưu hóa

Có lẽ tôi nói lạnh lùng, nhưng tại sao bạn lại sắp xếp hai lần? Không nên sắp xếp một mảng được sắp xếp nếu một hằng số bị trừ khỏi mỗi phần tử?
Ingo Bürk

@ IngoBürk Mảng được sắp xếp không tồn tại truy cập mảng, tôi nghĩ vậy. Điều này có ý nghĩa, bởi vì kết quả cuối cùng không được sắp xếp.
Martin Ender

@ MartinBüttner D'oh. Tất nhiên. Chúng tôi cần phải giữ lại trật tự cho kết quả. Cảm ơn!
Ingo Bürk

4

JavaScript, ES6, 81 byte

Cảm ơn @ edc65 cho toFixedmánh khóe

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

Chạy nó trong Firefox Console mới nhất.

Điều này tạo ra một chức năng fmà bạn có thể gọi như

F([5,-20,30])

1) tại sao eval (dấu nhắc) khi một chức năng được cho phép? 2) Phải có ít nhất 1 chữ số sau dấu thập phân. 3) không cần lưu trữ M, chỉ cần d = Mm
edc65

Cập nhật. Mặc dù, nhận được ít nhất 1 chữ số sau số thập phân là khó khăn
Trình tối ưu hóa

If you want, you can round the output to 2 digits after the decimal pointđó là cách đơn giản hơn tôi nghĩ
edc65

@ edc65 Nhưng không có cách nào để chuyển đổi 1để 1.0trừ cho những gì tôi đã làm.
Trình tối ưu hóa

Không. Tôi có thể gợi ý không?
edc65

4

Trăn 2, 72 68 63 56 55

Rõ ràng không ngắn gọn như các câu trả lời khác, nhưng dù sao:

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

Chạy mẫu:

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

Cũ (68 ký tự, được viết bằng Python 3):

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

Bạn có thể lưu thêm một char bằng cách xác định m=min(x).
FryAmTheEggman

4

CJam, 24 23 byte

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

Đầu vào giống như:

[5 -20 30]

Dùng thử trực tuyến ở đây Lưu ý rằng bản in biên dịch trực tuyến Double 0như 0chỉ. Chạy trong trình thông dịch java in chính xác.

Làm thế nào nó hoạt động:

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
Ah, đó là một ý tưởng tốt hơn nhiều để có được tối thiểu và tối đa.
Martin Ender

Bản in này 0;0.5;1thay vì 0.0;0.5;1.0.
CommonGuy

@Manu - Vâng, cố gắng khắc phục điều đó. Và hầu như tất cả các câu trả lời chỉ làm điều này.
Trình tối ưu hóa

2
Bạn không cần sửa chữa. Trình thông dịch Java đại diện cho Double 0 là 0.0.
Dennis

3

C # 92

Chạy bên trong LinqPad

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

Kiểm tra trong 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();}

Đầu ra

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

3

APL (15)

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

(hoặc, không có tàu, cũng có 15 ký tự :)

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

Điều này đọc đối số từ bàn phím và in kết quả ra màn hình.

Giải trình:

  • : đọc một dòng từ bàn phím và đánh giá nó
  • +-⌊/: trừ mục thấp nhất trong mảng khỏi tất cả các mục trong mảng
  • +÷⌈/: chia từng mục trong mảng cho mục cao nhất của mảng
  • 2⍕: định dạng có hai chữ số thập phân

Kiểm tra:

      (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

Nên thêm số byte ...
Trình tối ưu hóa

Đó chỉ là 24 byte.
Trình tối ưu hóa

2
@Optimizer: Trừ khi có câu hỏi khác, mọi câu trả lời đều được ghi bằng cách sử dụng mã hóa mang lại số byte nhỏ nhất. Có một bảng mã APL đại diện cho mỗi ký tự APL bằng một byte.
Dennis

Sửa lỗi cho tôi nếu tôi làm điều gì đó sai ở đây, nhưng theo mặc định, code-golf được tính bằng byte và mẹeff.in / byte- c gặp #% 282% E2% 8D% 95 +% C3% B7% E2% 8C% 88 / ... trang nói 24 byte của nó. Tôi đã bỏ lỡ một cái gì đó?
Trình tối ưu hóa

1
Đầu ra phải được phân tách bằng dấu chấm phẩy, không phải dấu cách.
CommonGuy

3

Bình thường , 18

Bây giờ với định dạng chính xác!

j\;mc-dhSQ-eSQhSQQ

Kiểm tra:

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

Giải trình:

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

Đầu ra không được định dạng chính xác.
CommonGuy

@Manu Xin lỗi về điều đó, tôi đã sửa nó.
isaacg

Không tạo ngôn ngữ của riêng bạn, thứ mà bạn thay đổi theo thời gian, hơi kéo dài các quy tắc? Bạn rõ ràng có thể chỉ cần thêm một tính năng mới để làm cho chương trình ngắn hơn?
Chris Jefferson

3
@ChrisJefferson Tôi luôn sử dụng phiên bản mới nhất của ngôn ngữ xuất hiện trước khi vấn đề được hỏi. Vì tất cả được đẩy lên Github, có thể xác minh rằng tôi không thêm bất cứ điều gì sau khi vấn đề được đăng. Đó là quy tắc CG.SE tiêu chuẩn - ngôn ngữ phải cũ hơn câu hỏi và tôi tuân thủ nó.
isaacg

2

Ngày 25 tháng 10

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

Giả sử đầu vào nằm trong lvà vì nó là vỏ tương tác, kết quả được in tự động (điều này có được phép không?)


2
Octave / Matlab inputmặc dù có nhận đầu vào của người dùng và bắt chước STDIN. Bạn cũng có thể viết một chức năng. Ngoài ra, điều này có in kết quả trong định dạng chính xác?
Martin Ender

Và không, chỉ cần quay lại và in vỏ nó thường không được tính. Golfscript và tương tự là khác nhau bởi vì ngôn ngữ chỉ định rằng ngăn xếp được in cuối cùng. Nhưng đây không phải là trường hợp, ví dụ, Javascript. Và tôi cũng không nghĩ cho Matlab / Octave.
Ingo Bürk

2

APL, 31 ký tự / 55 byte

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

Mã cũ không có chữ số sau dấu thập phân:

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

Lấy tối thiểu của vectơ, lấy chênh lệch giữa tối đa và tối thiểu của vectơ, trừ tối thiểu từ mỗi phần tử và chia cho chênh lệch giữa min và max.

Mã đã chỉnh sửa để in hai chữ số sau dấu thập phân:


2

CJam, 30 29 byte

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

Mong đợi đầu vào trên STDIN như thế nào [5 -20 30].

Kiểm tra nó ở đây. (Điều này sẽ in số nguyên 01không có dấu thập phân, nhưng trình thông dịch Java có in 0.01.0.)

Do một lỗi tôi không thể rút ngắn {e>}*tới :e>mặc dù đó ta có thể theo spec (mà sẽ tiết kiệm 4 byte khi áp dụng cho cả min và max).

Giải thích hơi lỗi thời: (sẽ sửa đổi sau)

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";

Vào cuối chương trình, nội dung ngăn xếp được in theo mặc định.

Tôi chắc chắn có một cách để tiết kiệm một nửa số lần chia sẻ lại ngăn xếp, nhưng tôi vẫn chưa thấy thoải mái với CJam.


Bản in này 0;0.5;1thay vì 0.0;0.5;1.0.
CommonGuy

@Manu Xem bình luận của Dennis về câu trả lời của Trình tối ưu hóa. Nó hoạt động tốt trong trình thông dịch Java.
Martin Ender

2

Xojo, 179 byte

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 byte

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

Định dạng ngốn rất nhiều byte do 01theo mặc định được cắt bớt để hiển thị không có gì qua phần nguyên.


1

Clojure 63

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

Không hoàn toàn tuân theo các quy tắc, vì nó trả về phân số thay vì tăng gấp đôi. Nếu điều đó không được chấp nhận, hãy thêm 7 byte

Ung dung:

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

Có thể gọi như thế này:

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

Đầu ra: (1/2 0 1)


1

Ruby, 49

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

Giải trình:

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

Q (31) ĐỊNH DẠNG IMPROPER ĐẦU RA

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

đầu vào

1 2 3

đầu ra

0 .5 1

0

Perl - 60

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

0

Java 7, 149 byte

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

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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

Đầu ra:

[0.5, 0.0, 1.0]
[0.0, 0.25, 0.5, 0.75, 1.0]
[0.0, 0.0125, 0.25, 1.0]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.