遍历数组


13

我们大家经常听到“遍历数组”这个成语的意思是“将函数映射到以下数组”。不过,我需要它做(现在!),所以我希望你能运行通过数组。

我该如何跑步?

想象在你身后有一群野狼

在数组中运行就像遍历一个数组,只是可以跳过元素。是的,有时会很混乱,但是(通常)可以正常工作。您可能会问:“跳过了哪些元素?”。好吧,这是随机完成的。让我们逐步遍历整个数组!

  1. e是当前元素。
  2. 让我们在中random生成一个随机浮点数[0,1)。如果是random() < 0.5,则转到下一个元素,然后转到步骤1。(您可以通过其他方式生成数字,只要它们是(理想情况下)跳过和保留的机会相等即可。例如,您可以使用从一个元素中选择一个元素两人一组,并根据结果执行操作。)
  3. 否则,您将在f上执行功能e

目的

给定一个数组或列表/字符串(如A和)和一个数字K,遍历该数组,并添加K到所访问的每个成员中。输出/返回该数组。A将仅包含非负整数,并且K将永远是非负整数。这是一个,因此以字节为单位的最短程序获胜。

测试用例(示例)

K, A => possible K'
[1, 2, 3, 4], 0 => [1, 2, 3, 4]
[1, 2, 3, 4], 1 => [1, 3, 3, 5]
[0, 0, 0, 0], 2 => [2, 0, 0, 2]

[0,1)错字?还有2个要去的地方
Bald Bantha

5
是否必须通过浮点比较来确定随机选择,还是可以随机选择?
Alex A.

我可以发布程序,还是可以发布功能?它在Java中产生了非常明显的区别。
巴林特

1
@epicTCK这意味着一个半开区间,即,一个实数x,使得0 ≤ x < 1
Martin Ender

1
@Bálint两种表示法都存在。
Martin Ender

Answers:


3

佩斯,7

m+*O2vz

在这里尝试

使用随机选择而不是浮点比较,但是应该不能区分。

扩张:

m+*O2vz     ## implicitly, a d and Q are added to the end of the program
m+*O2vzdQ   ## Q = eval(input()), z= input()
m           ## map over each element d of Q
 +     d    ## add to d
  *O2vz     ## the product of eval(z) and a random number chosen from [0, 1]

使用浮点数:

m+*<.5O0vz

在这里尝试


2
浮点是浮点> :(
Leaky Nun

1
@KennyLau的变化微不足道,这只是高尔夫球手。我不认为这是必需的,只是行为是相同的。我将使用fp添加一个版本,并询问OP。
FryAmTheEggman '16

@KennyLau没有浮点数的语言呢?
2016年

@FryAmTheEggman是的,这只是一个例子-相等的概率很好。
科纳·奥布莱恩

@KennyLau OP已确认不需要浮点。
Alex A.

5

Clojure,41 37字节

(fn[a k](map #(+(*(rand-int 2)k)%)a))

通过乘以0或1并删除“ if”来删除几个字节。感谢大多数其他提交者!


在这种情况下,匿名函数就足够了,但是很好的答案。欢迎来到PPCG!

很多时候for是小于map,看到我的答案以供参考:)此外,它避免了内部匿名函数所以不是启动代码的(fn[a k],你可以使用#(
NikoNyrh '16

4

果冻,9 8 7个字节

87感谢@FryAmTheEggman

+2X’¤¡€

在线尝试!

说明

+2X’¤¡€
      €   Map over each argument...
 2X           Choose a random number from {1,2}
   ’          Minus 1
    ¤                (grammar stuff)
     ¡        Repeat that number of times...
+                 Add the second input (to the argument being mapped over).

您如何在he-double-L中成功使用这种语言进行键盘输入?
MonkeyZeus '16

@MonkeyZeus Dennis说,它可以在Linux上使用普通键盘输入。
巴林特

@Bálint情节变浓了,丹尼斯是谁?大声笑
MonkeyZeus 16'Apr

13
@MonkeyZeus Ahem。
丹尼斯

1
@Dennis预言已经┗(⊙.⊙)┛满足
MonkeyZeus

3

MATL,11个字节

tZy1$rEki*+

使用浮点随机数。

在线尝试!

说明

t      % implicit input (array). Duplicate
Zy     % size (array specifying number of rows and columns)
1$r    % random vector between 0 and 1 with that size
Ek     % duplicate, round down: gives 0 or 1 with the same probability
i      % input (number K to be added)
*      % multiply: gives either 0 or K for each element
+      % add element-wise

1
通过电话输入。稍后说明
Luis Mendo

@CatsAreFluffy :-)完成!
Luis Mendo

3

Japt,6个字节

®+V*Mq

测试一下


说明

数组U和整数的隐式输入V®在数组上映射(),并向每个元素添加V乘以Mq,然后随机生成01。结果数组的隐式输出。



2

朱莉娅,33 29 27字节

x->k->x+rand(0:1,endof(x))k

这是一个接受数组的匿名函数,而内部的匿名函数接受一个整数并返回一个数组。要调用它,请将其分配给一个变量,然后调用like f(x)(k)

我们生成一个长度与输入数组相同的数组,该数组由零和以相等概率随机选择的一个组成。我们将其乘以输入整数,然后将其添加到输入数组。

在线尝试!

感谢Dennis,节省了2个字节!


2

Python 2中,60 58个字节

from random import*
lambda a,k:[e+choice([0,k])for e in a]

这个程序真的很简单。除了显而易见的“ from module import*” 之外,这里没有很多打高尔夫球的花样,而是使用lambda而不是常规函数以及普遍缺乏空格。除此之外,它实际上是习惯用法。如果我是真正写这篇文章,我可能会以一种非常相似的方式来做:

import random
def running_addition(seq, k):
    return [e + random.choice([0, k]) for e in seq]

也许更花哨的东西:

import random
import operator
import functools

def run_through(seq, func):
    def random_func(arg):
        if random.randint(0, 1):
            return func(arg)
        return arg

    return [random_func(e) for e in seq]

def running_addition(seq, k):
    return run_through(seq, functools.partial(operator.add, k))

但这足以炫耀:)

这是使用浮点数进行随机性处理后的60字节版本:

from random import*
lambda a,k:[e+k*(random()<.5)for e in a]

对于列表的每个元素,添加k*(random()<.5)。Python布尔值的取值为0和1,因此这会为条件不成立的所有元素加0。

Python的random.random()收益浮动在中[0, 1),因此我不必为此担心。


1
@FryAmTheEggman如果浮点需求下降,我可以找出最好是完全忘记了乘法招,做e+choice([0,k])
undergroundmonorail

很好,避免乘法的好方法。也就是说,浮点要求已删除,因此您可以更改答案。
FryAmTheEggman '16

@FryAmTheEggman哦哈哈,我没注意到。我会做的,谢谢:)
Undergroundmonorail

1

JavaScript(ES6),38个字节

solution=

a=>k=>a.map(n=>Math.random()<.5?n:n+k)

document.write("<pre>"+
[ [[1,2,3,4], 0], [[1,2,3,4], 1], [[0,0,0,0], 2], [[4,22,65,32,91,46,18], 42] ]
.map(c=>"["+c[0]+"],"+c[1]+": "+solution(c[0])(c[1])).join`\n`)


我想参加挑战,并采取了JavaScript。认真地说,我会学习一元。
巴林特

@巴林特我敢肯定一元不能生成随机花车
undergroundmonorail

@undergroundmonorail我说,这是因为没有人使用它(原因很明显,喜欢的话可以不被张贴在这里,因为它太长)
巴林特

1

PowerShell v2 +,34个字节

param($a,$k)$a|%{$_+$k*(random 2)}

分别接受输入$a$k,数组和int。然后,我们通过阵列循环和每次循环迭代输出当前元素加$k时间(random 2)将执行Get-Random -Maximum 2(即,一个0或一个1)。这些都留在管道上,并作为隐式数组输出。



1

php 71字节

function f($s,$k){foreach($s as $v){$v+=rand(0,2)==0?k:0;echo $v.",";}}

1

k(12个字节)

{x+y*(#x)?2}

例如

k){x+y*(#x)?2}[0 0 0 0;2]
2 2 2 0

更一般而言,哪里f可以将其作为参数传递给16个字符

{@[x;&(#x)?2;y]}

例如

k){@[x;&(#x)?2;y]}[0 0 0 0;2+]
0 0 2 0

不错,包括普通版本!
Conor O'Brien

1

蟒3 152 110 98个字节

这是我的第一个代码高尔夫解决方案,所以我不知道任何技巧。我使用带有测试用例的main函数对此进行了测试。文件大小仅是此功能。

from random import*
def a(x,y):
 p=0
 for z in x:
  if random()>.5:x[p]=z+y
  p+=1
 print(x)

感谢@CᴏɴᴏʀO'Bʀɪᴇɴ对于删除空白的建议。@undergroundmonorail的额外称赞是节省了12个字节的建议。


1
我数了145个字节。你可以打高尔夫球它通过消除不必要的空格,如之间import *a(x, y)x[ptr]=z+y,等你也可以用一个空格代替4个空格
康纳尔奥布莱恩

您可以放在x[ptr]=z+y同一行上,if random()>0.5以节省3个字节的空格。在python 2 0.5中可以写为.5保存一个字节,但我不知道这在python 3中是否正确。如果重ptrp,你会保存在所有6个字节。另外,您在Windows上吗?Windows将换行符存储为两个字节,但是由于python不在乎换行符是一字节还是两个字节,因此您可以将换行符计算为1,从而使当前解决方案仅为103字节。顺便说一句,欢迎来到PPCG :)
Undergroundmonorail

1

Clojure,32个字节

#(for[i %](+(*(rand-int 2)%2)i))

谢谢您大卫的rand-int想法,绝对比这种if(>(rand)0.5)方法短。在这里for跳动map




0

Java,84个字节

int[]r(int[]A,int K){for(int i=0;i<A.length;A[i++]+=Math.random()>.5?0:K);return A;}

不打高尔夫球

int[] r(int[] A, int K) {
    for (int i = 0; 
         i < A.length; 
         A[i++] += Math.random() > .5 ? 0 : K);
    return A;
}

笔记

  • 循环的事后思考也可能是它的主体,大小没有差异。
  • 输入数组已修改,但该语句不包含有关此问题的限制。如果将修改后的数组算作“输出/返回”的形式,则可以通过删除删除另外9个字节return A;。返回类型需要从更改int[]void。但是,这不会节省额外的字节,因为void和之间需要额外的空间r

较短的版本(如注释中所述),75字节

void r(int[]A,int K){for(int i=0;i<A.length;)A[i++]+=Math.random()>.5?0:K;}

输出量

[1, 2, 3, 4], 0 => [1, 2, 3, 4]
[1, 2, 3, 4], 1 => [1, 3, 3, 4]
[1, 2, 3, 4], 2 => [3, 2, 3, 4]
[1, 2, 3, 4], 3 => [4, 5, 3, 7]
[1, 2, 3, 4], 4 => [5, 2, 3, 8]
[1, 2, 3, 4], 5 => [6, 2, 8, 9]

您的第二个版本无效,它既不输出也不返回任何内容。
巴林特

1
请阅读我的文章...
Marv 2016年


0

爪哇108 107 85 82个字节

void f(int[]s,int k){for(int i:s)System.out.print((i+=Math.random()<.5?k:0)+";");}

@TimmyD节省了14个字节


@TimmyD规则说您需要输出它。而该规则是不是这样的,当我写了答案
巴林特

我相信你可以删除后的空间mainString[]int[],救其他几个字节,通过改变nextFloat()>0.5next(1)==0
Fund Monica的诉讼

@QPaysTaxes我已经更改new java.util.Random().nextFloat()Math.random(),因为它要短得多。
巴林特

@TimmyD没看到由于
巴林特

在当前状态下不起作用。您无需修改s,只有i方法具有返回类型,void但您试图返回int[]。之后还缺少分号return s
2016年

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.