숫자 축소


10

입력은 (적어도 3, 최대 20) 다른 정수의 배열입니다. 각 정수는 -1000보다 크고 1000보다 작습니다.

당신의 작업은에서 "선형 매핑"그들에 의해 숫자를 축소하는 것입니다 0.01.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
그래서 우리는 결과를 인쇄 해야하는 함수를 작성합니까? (두 배의 해당하는 배열을 반환 반대로.)
마틴 청산

@ MartinBüttner 네, 인쇄해야합니다. 내장 기능이 허용되지 않습니다.
CommonGuy

"Mathematicas Rescale과 같은 내장 함수 사용은 허용되지 않습니다." -너무 애매하다. 어떤 기능이 허용되지 않습니까? 전체 문제를 해결하는 사람들 (표준 허점)이 있습니까?
John Dvorak

잠깐, 입력은 함수 인수 일 수 있지만 출력은 화면에 표시되어야합니까 ???
John Dvorak

1
@Dennis 형식은 질문에 표시된 형식과 일치해야합니다. 이는 숫자가 세미콜론으로 구분됨을 의미합니다.
CommonGuy

답변:


5

CJam, 18 바이트

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

있습니다 온라인 인터프리터가 부당하게 표현 0d으로 0대신 0.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
터지는 대신 배열 인덱스를 사용하여 최소값과 최대 값을 얻는 좋은 방법
최적화 도구

아마도 내 냉담한 말이지 만 왜 두 번 정렬합니까? 각 요소에서 상수를 빼면 정렬 된 배열이 정렬 된 상태로 유지되어서는 안됩니까?
Ingo Bürk

@ IngoBürk 정렬 된 배열은 배열 액세스를 유지하지 못합니다. 최종 결과가 정렬되어서는 안되기 때문에 의미가 있습니다.
Martin Ender

@ MartinBüttner D' oh. 물론이야. 결과에 대한 순서를 유지해야합니다. 감사!
Ingo Bürk

4

자바 스크립트, ES6, 81 바이트

toFixed트릭 을 위해 @ edc65에게 감사합니다

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

최신 Firefox 콘솔에서 실행하십시오.

이것은 f당신이 호출 할 수 있는 기능 을 만듭니다

F([5,-20,30])

1) 함수가 허용 될 때 왜 eval (prompt)입니까? 2) 소수점 다음에 1 자리 이상 있어야합니다. 3) M을 저장할 필요가 없습니다. d = Mm
edc65

업데이트되었습니다. 소수점 이하 1 자리 이상을 얻는 것은 어렵지만
Optimizer

If you want, you can round the output to 2 digits after the decimal point그것이 내가 생각하는 가장 간단한 방법입니다
edc65

@ edc65 그러나 내가 한 것을 제외하고는 변환 할 1수있는 방법이 없습니다 1.0.
Optimizer

아니. 힌트해도 될까요?
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 자, 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 00만. 올바르게 인쇄되는 Java 인터프리터에서 실행하십시오.

작동 방식 :

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-그렇습니다. 그리고 거의 모든 답변이 이것을 수행합니다.
Optimizer

2
수정이 필요하지 않습니다. Java 인터프리터는 Double 0을로 나타냅니다 0.0.
Dennis

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

바이트 수를 추가해야합니다 ...
Optimizer

24 바이트 만입니다.
Optimizer

2
@Optimizer : 질문에 달리 명시되어 있지 않는 한, 모든 답변은 가장 작은 바이트 수를 생성하는 인코딩을 사용하여 점수가 매겨집니다. 모든 APL 문자를 1 바이트로 나타내는 APL 코드 페이지가 있습니다.
Dennis

여기에 잘못된 일이 있으면 수정하지만 기본적으로 code-golf 는 바이트 단위로 계산되고 mothereff.in/byte-counter#%282%E2%8D%95+%C3%B7%E2%8C%88/ … 페이지는 24 바이트를 말합니다. 내가 뭘 놓 쳤니 ?
Optimizer

1
공백이 아닌 세미콜론으로 출력을 분리해야합니다.
CommonGuy

3

피 이스 , 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

옥타브 25

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

입력이 l있다고 가정 하고 대화식 쉘이므로 결과가 자동으로 인쇄됩니다 (허용됩니까?).


2
Octave / Matlab은 input사용자 입력을 받고 STDIN을 흉내냅니다. 함수를 작성할 수도 있습니다. 또한 결과가 올바른 형식으로 인쇄됩니까?
Martin Ender

그리고 아니오, 단지 쉘로 돌아가서 인쇄하는 것은 일반적으로 중요하지 않습니다. 언어 가 스택의 끝에 인쇄 되도록 지정 하므로 골프 스크립트 등이 다릅니다 . 그러나 Javascript와 같은 경우에는 그렇지 않습니다. 그리고 Matlab / Octave도 생각하지 않습니다.
Ingo Bürk

2

APL, 31 자 / 55 바이트

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

소수점 뒤에 숫자가없는 오래된 코드 :

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

벡터의 최소값을 취하고 최대 값과 최소값의 차이를 취하고 각 요소에서 최소값을 빼고 최소값과 최대 값의 차이로 나눕니다.

소수점 다음에 두 자리를 인쇄하도록 편집 된 코드 :


2

CJam, 30 29 바이트

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

STDIN과 같은 입력이 필요 [5 -20 30]합니다.

여기에서 테스트하십시오. (이것은 정수 인쇄됩니다 01소수점없이,하지만 자바 인터프리터는 인쇄 작업을 수행 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 Optimizer의 답변에 대한 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

클로저 63

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

두 배 대신 분수를 반환하기 때문에 규칙을 따르지 않습니다. 허용되지 않으면 7 바이트를 추가하십시오.

언 골프 드 :

(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

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