配列を実行する


13

「配列をウォークスルーする」というイディオムをよく耳にしますが、これは「次の配列に関数をマッピングする」という意味です。しかし、私はそれを行う必要があります(今!)ので、アレイを実行してほしいです。

どうやって走るの?

あなたの後ろにオオカミの野生のパックがあると想像してください

配列を実行することは、要素をスキップできることを除いて、配列をたどることに似ています。はい、それは時々乱雑ですが、(一般的に)動作します。「どの要素がスキップされますか?」と尋ねることができます。さて、これはランダムに行われます。アレイを実行してみましょう!

  1. Letをe現在の要素にします。
  2. randomランダムフロートを生成しましょう[0,1)。の場合random() < 0.5、次の要素に進み、ステップ1に進みます(スキップして残りの(理想的に)等しいチャンスである限り、他の手段で数値を生成できます。たとえば、 2メンバーで設定し、結果に基づいてアクションを実行します。)
  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以上を
白頭バンサ

5
ランダム選択は、フロート比較によって決定する必要がありますか、またはランダムに選択できますか?
アレックスA.

プログラムを投稿できますか、それとも機能になりますか?それは、Javaで非常に区別可能な差異を作ります。
バリント

1
@epicTCKこれは、半開区間、つまりのxような実数を意味し0 ≤ x < 1ます。
マーティンエンダー

1
@Bálint両方の表記が存在します。
マーティンエンダー

回答:


3

Pyth、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

@KennyLau浮動小数点のない言語はどうですか?
ヴェン

@FryAmTheEggmanはい、それは単なる例でした。等確率は問題ありません。
コナーオブライエン

@KennyLau OPは、浮動小数点が必要ないことを確認しました。
アレックスA.

5

Clojure、41 37バイト

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

0または1を掛けて「if」をドロップすることにより、数バイトをノックオフしました。他のほとんどすべての提出者の功績です!


この場合、anonymouse関数で十分ですが、いい答えです。PPCGへようこそ!

多くのfor場合map、より短いですが、参考のために私の答えを参照して(fn[a k]ください#(
ニコニー16

4

ゼリー、9 8 7バイト

から@FryAmTheEggman87感謝します

+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

@MonkeyZeus Dennisは、通常のキーボードを使用してLinuxで入力できると述べました。
バリント

@Bálintデニスはだれですか?lol
MonkeyZeus

13
@MonkeyZeusエヘム。
デニス

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
電話から入力。後で説明
ルイスメンドー

@CatsAreFluffy :-)完了!
ルイスメンドー

3

Japt、6バイト

®+V*Mq

試して


説明

配列Uと整数の暗黙的な入力V。(地図®各要素に、追加アレイ上)とVを乗じたMqランダムのいずれかで発生する、0または1。結果の配列の暗黙的な出力。



2

ジュリア、33 29 27バイト

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

これは、整数を受け入れて配列を返す内部匿名関数とともに配列を受け入れる匿名関数です。呼び出すには、変数に割り当てて次のように呼び出しますf(x)(k)

等しい確率でランダムに選択されたゼロと1で構成される入力配列と同じ長さの配列を生成します。これに入力整数を掛けて、入力配列に追加します。

オンラインでお試しください!

デニスのおかげで2バイト節約できました!


2

Pythonの2、60の 58バイト

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

このプログラムは本当にシンプルでした。from module import*通常の関数の代わりにラムダを使用し、一般的な空白がないことを除けば、明らかな「」を除き、ゴルフのトリックはあまりありません。それ以外は、実際には非常に慣用的です。これを実際に書いていたら、おそらく非常によく似た方法でそれをしたでしょう。

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

@FryAmTheEggmanああ、ハハ、気付かなかった。私は今それをします、ありがとう:)
地下

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が取得されます。真剣に、私は単項を学びます。
バリント

@Bálint私は単項式がランダムなフロートを生成できないと確信しています
地下

誰の用途にそれをするので(明白な理由のためにそれはあまりにも長くなるので、それがここに掲載することができないように、)私はそれを言っ@undergroundmonorail
バリント

1

PowerShell v2 +、34バイト

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

入力$a$k配列、配列と整数をそれぞれ受け取ります。我々は次に、アレイをループし、各ループ反復出力電流素子プラス$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

ニース、一般的なバージョンを含む!
コナーオブライエン

1

Pythonの3 152 110 98のバイト

これは私の最初のコードゴルフソリューションですので、トリックは知りません。これをテストケース付きのメイン関数を使用してテストしました。ファイルサイズはこの機能のみです。

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ʀɪᴇɴに感謝します。12バイトを節約するためのアドバイスを@undergroundmonorailに追加で賞賛します。


1
145バイトを数えます。あなたなどの間など、不要な空白を除去することにより、ゴルフ、それを、することができimport *a(x, y)x[ptr]=z+yなどを、あなたはまた、単一のスペースと4つのスペースを置き換えることができます
コナー・オブライエン

3バイトの空白を節約x[ptr]=z+yするのと同じ行に置くことができif random()>0.5ます。Python 2 では、バイトを節約する0.5ように書くことができますが.5、Python 3でそれが本当かどうかはわかりません。名前ptrを変更するpと、全部で6バイト節約できます。また、Windowsを使用していますか?Windowsは改行を2バイトとして保存しますが、Pythonは改行が1バイトか2バイトかを気にしないので、1としてカウントすることができ、現在のソリューションは103バイトになります。ところで、PPCGへようこそ:)
地下

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

ノート

  • ループの再考は、それが本体である可能性もあり、サイズに違いはありません。
  • 入力配列は変更されますが、ステートメントにはこの問題に関する制限が含まれていません。変更された配列を「Output / return」の形式としてカウントする場合、を削除することでさらに9バイトを削ることができますreturn A;。戻り値の型から変更する必要があるだろうint[]void。しかし、これは追加のスペースが間に必要ですので、追加のバイトを保存しませんvoidr

短いバージョン(注で説明)、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]

2番目のバージョンは無効で、出力も何も返しません。
バリント

1
私の投稿を読んでください
...-Marv


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.5しますnext(1)==0
ファンドモニカの訴訟

@QPaysTaxes はるかに短いので、すでにに変更new java.util.Random().nextFloat()Math.random()ています。
バリント

@TimmyDそれを見なかった、ありがとう
バリント

これは現在の状態では機能しません。あなたは変更しないsだけで、iこの方法は、戻り値の型を持ってvoidいますが、返却しようとしていますint[]。また、後にセミコロンがありませんreturn s
-Marv

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.