缩小数字


10

输入是(至少3个,最多20个)不同整数的数组。每个整数都大于-1000并且小于1000。

你的任务是“线性映射”他们缩小数字0.01.0。这意味着数组中最小的数字将映射为0.0,最大的映射为1.0。

您可以将数组作为参数(在函数内部)或stdin / program参数(可以选择)。以格式打印结果double1;double2;double3;...。输出必须具有与输入相同的顺序

如果需要,可以将输出舍入到小数点后两位。小数点后必须至少有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
因此,即使我们编写一个函数,结果也必须打印出来?(而不是返回相应的双打数组。)
Martin Ender

@MartinBüttner是的,必须将它们打印出来。不允许使用内置功能。
CommonGuy 2014年

“不允许使用内置函数(例如Mathematicas Rescale)。” -太模糊了。不允许使用什么功能?只有那些能够解决所有问题(这将是一个标准漏洞)的解决方案是?
约翰·德沃夏克

等一下,所以输入可能是函数参数,但输出必须到屏幕上???
约翰·德沃夏克

1
@Dennis格式必须与问题中显示的格式匹配。这意味着数字用分号分隔。
CommonGuy

Answers:


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
使用数组索引而不是弹出然后交换周围内容来获得最小值和最大值的好方法
Optimizer

这可能是我的冷话,但为什么要排序两次?如果从每个元素中减去常数,排序数组是否应该保持排序状态?
IngoBürk'14

@IngoBürk,我认为排序后的数组无法幸免于数组访问。这是有道理的,因为不得对最终结果进行排序。
马丁·恩德

@MartinBüttnerD'oh。当然。我们需要保留结果的顺序。谢谢!
IngoBürk'14

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控制台中运行它。

这将创建一个f可以调用的函数

F([5,-20,30])

1)为什么在允许功能时使用eval(提示)?2)小数点后必须至少有一位数字。3)无需存储M,只需d = Mm
edc65

更新。虽然,在小数点后获取至少1位数字很困难
Optimizer

If you want, you can round the output to 2 digits after the decimal point那是我认为的更简单的方式
edc65

@ edc65但是除了我所做的之外,没有其他方法可以转换11.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 2014年

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
嗯,获得最小值和最大值是一个更好的主意。
马丁·恩德

打印0;0.5;1而不是0.0;0.5;1.0
CommonGuy 2014年

@Manu-是的,正在尝试解决此问题。几乎所有答案都只能这样做。
Optimizer

2
您不需要修复程序。Java解释器将Double 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个字节。
Optimizer

2
@Optimizer:除非问题另有说明,否则使用产生最小字节数的编码对每个答案评分。有一个APL代码页,用一个字节表示每个APL字符。
丹尼斯2014年

如果我在这里做错了,请改正我,但是默认情况下,代码高尔夫球的计数单位是字节和mothereff.in/byte-counter#%282%E2%8D%95+%C3%B7%E2%8C%88/ …页面显示其24个字节。我错过了什么 ?
Optimizer

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年

是否不创建自己的语言,随着时间的推移而改变,只是稍微扩展了规则?您显然可以添加新功能来使程序更短吗?
克里斯·杰斐逊

3
@ChrisJefferson我总是使用问问题之前出现的最新版本的语言。由于所有内容均已推送至Github,因此可以确定问题发布后我没有添加任何内容。那是CG.SE的标准规则-语言必须早于问题,我遵守。
isaacg 2014年

2

八度25

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

假定输入在其中,l并且由于它是交互式外壳,所以结果会自动打印出来(是否允许?)


2
Octave / Matlab确实需要input获得用户输入并模仿STDIN。您也可以编写一个函数。另外,这是否以正确的格式打印结果?
马丁·恩德

不,仅返回并打印外壳程序通常就不算在内。Golfscript之类的内容有所不同,因为该语言指定要在最后打印堆栈。但是,例如Javascript并非如此。而且我也不认为适用于Matlab / Octave。
IngoBürk,2014年

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无小数点,但Java解释器可以打印0.01.0)。

由于存在错误,我无法简化{e>}*为,:e>尽管按照规范应该可以做到(将min和max同时应用将节省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对Optimizer答案的评论。它在Java解释器中工作正常。
马丁·恩德

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个字节

取消高尔夫:

(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

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

取消测试代码:

在这里尝试。

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]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.