縮小する数字


10

入力は、(少なくとも3、最大20)異なる整数の配列です。各整数は-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
それで、関数を書いても結果を出力しなければならないのでしょうか?(対応するdoubleの配列を返すのとは対照的です。)
Martin Ender

@MartinBüttnerはい、それらは印刷する必要があります。組み込み関数は許可されていません。
CommonGuy 2014年

「組み込み関数(mathematicas Rescaleなど)の使用は許可されていません。」-あいまいすぎる。許可されていない機能は何ですか?完全な問題(標準の抜け穴になる)を解決するものだけですか?
John Dvorak

待ってください、そうすれば、入力は関数の引数になるかもしれませんが、出力は画面へのものでなければなりません?
John Dvorak

1
@Dennis形式は、質問に示されているものと一致する必要があります。つまり、数値はセミコロンで区切られます。
CommonGuy 2014年

回答:


5

CJam、18バイト

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

オンラインインタープリターがで0d0なくとして誤って表現することに注意してください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
ポップする代わりに配列インデックスを使用して最小値と最大値を取得し、次に物事を入れ替える良い方法
オプティマイザー

おそらく私の寒さですが、なぜ2度並べ替えるのですか?定数が各要素から差し引かれる場合、ソートされた配列はソートされたままになってはいけませんか?
IngoBürk2014年

@IngoBürkソートされた配列は配列アクセスを生き延びないと思います。最終結果を並べ替えてはならないため、これは理にかなっています。
マーティンエンダー2014年

@MartinBüttnerD'oh もちろん。結果の順序を保持する必要があります。ありがとう!
IngoBürk2014年

4

JavaScript、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(プロンプト)を使用する理由 2)小数点以下1桁以上必要です。3)Mを保存する必要はありません。d= Mmのみ
edc65

更新しました。ただし、10進数の後に少なくとも1桁を取得するのは難しい
オプティマイザー

If you want, you can round the output to 2 digits after the decimal pointそれが私が考える最も簡単な方法です
edc65 2014年

@ edc65しかし、私がしたことを除いて、変換1する方法はありません1.0
オプティマイザー2014年

いいえ。ヒントしてもいいですか?
edc65 2014年

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

を定義することで、さらに1つの文字を保存できますm=min(x)
FryAmTheEggman 2014年

4

CJam、24 23バイト

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

入力は次のようになります:

[5 -20 30]

ここでは、オンラインでそれを試して いるオンラインコンパイラのプリントを注意Double 0として0のみ。正しく印刷される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
ああ、それは最小値と最大値を取得するためのはるかに良いアイデアです。
マーティンエンダー2014年

これはの0;0.5;1代わりに印刷され0.0;0.5;1.0ます。
CommonGuy 2014年

@Manu-はい、それを修正しようとしています。そしてほとんどすべての答えはこれだけをします。
オプティマイザ

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桁のフォーマット

テスト:

      (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バイトのみです。
オプティマイザー2014年

2
@オプティマイザー:質問で特に明記されていない限り、すべての回答は、最小のバイト数を生成するエンコーディングを使用してスコアリングされます。すべてのAPL文字を1バイトで表すAPLコードページがあります。
Dennis

ここで何か間違っている場合は修正してください。ただし、デフォルトでは、コードゴルフはバイトでカウントされ、mothereff.in / byte - counter#%282%E2%8D%95 +%C3%B7%E2%8C%88 / …ページには24バイトと書かれています。私は何か見落としてますか ?
オプティマイザ

1
出力はスペースではなくセミコロンで区切る必要があります。
CommonGuy 2014年

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 2014年

@Manu申し訳ありませんが、修正しました。
isaacg 2014年

少しずつルールを広げて、時間とともに変化する独自の言語を作成しませんか?新しい機能を追加してプログラムを短くすることはできますか?
Chris Jefferson

3
@ChrisJefferson私は常に、問題が尋ねられる前に出てきた最新バージョンの言語を使用しています。すべてGithubにプッシュされているため、問題が投稿された後、何も追加していないことを確認できます。それが標準のCG.SEルールです-言語は質問よりも古い必要があり、私はそれに従います。
isaacg 2014年

2

オクターブ25

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

入力がlあり、インタラクティブシェルであるため、結果が自動的に出力されると仮定します(これは許可されますか?)


2
Octave / Matlabはinput、ユーザー入力を取得してSTDINを模倣する必要があります。関数を書くこともできます。また、これは正しい形式で結果を印刷しますか?
マーティンエンダー2014年

いいえ、シェルに戻って印刷させるだけでは、通常は考慮されません。スタックが最後に出力されるように言語が指定しているため、ゴルフスクリプトなどは異なります。しかし、これは、例えば、JavaScriptの場合には当てはまりません。そして、私はMatlab / Octaveについても考えていません。
IngoBürk2014年

2

APL、31文字/ 55バイト

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

小数点以下の桁のない古いコード:

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

ベクトルの最小値を取り、ベクトルの最大値と最小値の差を取り、各要素から最小値を差し引き、最小値と最大値の差で割ります。

小数点以下2桁を印刷するようにコードを編集:


2

CJam、30 29バイト

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

STDINのような入力が期待されます[5 -20 30]

ここでテストしてください。(これは整数を印刷する0と、1小数点なし、しかし、Javaインタプリタは、印刷を行う0.01.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 2014年

@Manuオプティマイザーの回答に関するDennisのコメントを参照してください。Javaインタープリターで正常に動作します。
マーティンエンダー2014年

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

原因にバイトをたくさん食べるの書式を設定する01、デフォルトですることは整数部分過去何も表示しないようにトリミングされています。


1

Clojure 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

Perl-60

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

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&test code:

ここで試してください。

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.