Jalankan melalui array


13

Kita semua sering mendengar ungkapan "berjalan melalui array" berarti "memetakan fungsi di atas array berikut". Namun, saya perlu melakukannya (sekarang!), Jadi saya ingin Anda menjalankan array.

Bagaimana saya berlari?

Bayangkan ada paket liar serigala belakang Anda

Menjalankan melalui array seperti berjalan melalui satu, kecuali Anda dapat melewatkan elemen. Ya, kadang-kadang berantakan, tetapi (umumnya) berfungsi. "Elemen mana yang dilewati?", Anda mungkin bertanya. Nah, ini dilakukan secara acak. Mari kita berjalan melintasi array!

  1. Membiarkan e menjadi elemen saat ini.
  2. Biarkan randommenghasilkan float acak di[0,1) . Jika random() < 0.5, maka Anda pergi ke elemen berikutnya dan kemudian ke langkah 1. (Anda dapat menghasilkan angka dengan cara lain, selama mereka adalah (idealnya) kesempatan yang sama untuk melompat dan tetap. Misalnya, Anda dapat menggunakan memilih elemen dari dua anggota mengatur dan melakukan tindakan berdasarkan hasil.)
  3. Jika tidak, Anda melakukan fungsi fpada e.

Objektif

Diberikan array / daftar / string seperti salah satu Adan nomor K, jalankan melalui array, menambah Ksetiap anggota yang diakses. Keluarkan / kembalikan array ini. Ahanya akan berisi bilangan bulat non-negatif, dan Khanya akan menjadi bilangan bulat non-negatif. Ini adalah , sehingga program terpendek dalam byte menang.

Uji kasus (contoh)

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)salah ketik? 2 lagi ...
Bald Bantha

5
Apakah pilihan acak harus ditentukan dengan perbandingan mengambang atau dapatkah kita memilih secara acak?
Alex A.

Bisakah saya memposting program, atau bisakah itu berfungsi? Itu membuat perbedaan yang sangat berbeda di java.
Bálint

1
@epicTCK Itu berarti interval setengah terbuka, yaitu bilangan real xsedemikian rupa 0 ≤ x < 1.
Martin Ender

1
@ Bálint Kedua notasi ada.
Martin Ender

Jawaban:


3

Pyth, 7

m+*O2vz

Coba di sini

Menggunakan pilihan acak alih-alih perbandingan floating point, tetapi harus bisa dibedakan.

Ekspansi:

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]

Menggunakan floating point:

m+*<.5O0vz

Coba di sini


2
floating point adalah floating point> :(
Leaky Nun

1
@ KennyLau perubahan itu sepele, ini hanya pegolf. Saya tidak berpikir itu dimaksudkan bahwa itu diperlukan, hanya saja perilakunya sama. Saya akan menambahkan versi dengan fp dan meminta OP.
FryAmTheEggman

@ KennyLau bagaimana dengan bahasa tanpa floating point?
Ven

@FryAmTheEggman Ya, itu hanya sebuah contoh - probabilitas yang sama baik-baik saja.
Conor O'Brien

@ KennyLau OP telah mengkonfirmasi bahwa floating point tidak diperlukan.
Alex A.

5

Clojure, 41 37 byte

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

Menghilangkan beberapa byte dengan mengalikannya dengan 0 atau 1 dan menjatuhkan "jika". Kredit untuk sebagian besar semua submitter lainnya!


Fungsi anonimouse akan cukup dalam hal ini, tetapi jawaban yang bagus; selamat datang di PPCG!
kucing

Banyak kali forlebih pendek daripada map, lihat jawaban saya untuk referensi :) Juga menghindari fungsi anonim batin sehingga alih-alih memulai kode dengan (fn[a k]Anda dapat menggunakan #(.
NikoNyrh

4

Jelly, 9 8 7 byte

Dari 8ke 7berkat @FryAmTheEggman .

+2X’¤¡€

Cobalah online!

Penjelasan

+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).

Bagaimana di he-double-L Anda berhasil menggunakan keyboard dalam bahasa ini ?!
MonkeyZeus

@MonkeyZeus Dennis mengatakan, itu bisa dimasukkan di Linux menggunakan keyboard normal.
Bálint

@ Bálint Plot mengental, siapa Dennis? lol
MonkeyZeus

13
@MonkeyZeus Ahem.
Dennis

1
@Dennis Nubuatan telah digenapi ┗ (⊙ .⊙) ┛
MonkeyZeus

3

MATL , 11 byte

tZy1$rEki*+

Menggunakan angka acak floating point.

Cobalah online!

Penjelasan

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
Diketik dari ponsel. Penjelasan kemudian
Luis Mendo

@CatsAreFluffy :-) Selesai!
Luis Mendo

3

Japt, 6 byte

®+V*Mq

Menguji


Penjelasan

Input implisit dari array Udan integer V. Map ( ®) di atas array dan, untuk setiap elemen, tambahkan Vdikalikan dengan Mq, yang secara acak menghasilkan salah satu 0atau 1. Output implisit dari array yang dihasilkan.



2

Julia, 33 29 27 byte

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

Ini adalah fungsi anonim yang menerima array dengan fungsi anonim dalam yang menerima integer dan mengembalikan array. Untuk memanggilnya, tetapkan ke variabel dan panggil sepertif(x)(k) .

Kami menghasilkan array dengan panjang yang sama dengan array input yang terdiri dari nol dan yang dipilih secara acak dengan probabilitas yang sama. Kami mengalikannya dengan integer input dan menambahkannya ke array input.

Cobalah online!

Disimpan 2 byte berkat Dennis!


2

Python 2, 60 58 byte

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

Program ini ternyata sangat sederhana. Tidak ada banyak trik golf di sana, selain dari yang " from module import*" jelas , menggunakan lambda alih-alih fungsi reguler dan kurangnya ruang putih. Selain itu sebenarnya sangat idiomatis. Jika saya benar-benar menulis ini, saya mungkin akan melakukannya dengan cara yang sangat mirip:

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

Atau mungkin sesuatu yang lebih mewah:

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

Tapi itu cukup pamer :)

Ini adalah versi lama, 60 byte dari saat menggunakan float untuk keacakan diperlukan:

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

Untuk setiap elemen daftar, tambahkan k*(random()<.5). Boolean Python mengevaluasi ke 0 dan 1, jadi ini menambahkan 0 ke elemen apa pun yang kondisinya tidak benar.

Pengembalian Python random.random()mengapung [0, 1), jadi saya tidak perlu khawatir tentang itu.


1
@FryAmTheEggman Jika persyaratan floating point dijatuhkan, yang terbaik yang bisa saya pikirkan adalah melupakan trik multiplikasi sepenuhnya dan lakukane+choice([0,k])
undergroundmonorail

Ah benar sekali, cara yang bagus untuk menghindari perkalian. Yang mengatakan persyaratan floating point telah dihapus sehingga Anda dapat mengubah jawaban Anda sebagai gantinya.
FryAmTheEggman

@FryAmTheEggman Oh haha, saya tidak memperhatikan. Saya akan melakukannya sekarang, terima kasih :)
undergroundmonorail

1

JavaScript (ES6), 38 byte

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


Saya ingin berpartisipasi dalam tantangan dan ... javascript diambil. Serius, saya akan belajar unary.
Bálint

@ Bálint saya cukup yakin unary tidak dapat menghasilkan mengapung acak
undergroundmonorail

@undergroundmonorail Saya mengatakannya karena tidak ada yang menggunakannya (untuk alasan yang jelas, sepertinya tidak dapat diposting di sini karena terlalu lama)
Bálint

1

PowerShell v2 +, 34 byte

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

Mengambil input $adan $karray masing-masing dan int. Kami kemudian loop melalui array dan setiap iterasi loop menghasilkan elemen saat ini ditambah $kwaktu (random 2)yang akan mengeksekusi Get-Random -Maximum 2(yaitu, baik a 0atau a 1). Ini semua dibiarkan di pipeline dan output sebagai array implisit.


1

CJam, 10 byte

{f{2mr*+}}

Mengharapkan array dan nomor di atas tumpukan dalam urutan itu dan menggantinya dengan array baru.

Uji di sini.


1

php 71 byte

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

1

k (12 byte)

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

misalnya

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

Lebih umum, di mana fdapat dilewatkan sebagai argumen untuk 16 karakter

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

misalnya

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

Bagus, termasuk versi umum!
Conor O'Brien

1

Python 3 152 110 98 byte

Ini adalah solusi golf kode pertama saya jadi saya tidak tahu trik apa pun. Saya menguji ini menggunakan fungsi utama dengan kasus uji. Ukuran file hanya fungsi ini.

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

Terima kasih kepada @Cᴏɴᴏʀ O'Bʀɪᴇɴ untuk saran tentang menghapus spasi putih. Pujian tambahan untuk @undergroundmonorail untuk saran yang menyelamatkan 12 byte.


1
Saya menghitung 145 byte. Anda dapat golf dengan menghapus spasi yang tidak diperlukan, seperti antara import *, a(x, y), x[ptr]=z+y, dll Anda juga dapat mengganti 4 ruang dengan spasi tunggal
Conor O'Brien

Anda dapat menggunakan x[ptr]=z+ybaris yang sama if random()>0.5untuk menghemat 3 byte spasi. Dalam python 2 0.5dapat ditulis .5untuk menyimpan byte, saya tidak tahu apakah itu benar dalam python 3. Jika Anda mengganti nama ptrmenjadi pAnda akan menyimpan 6 byte di semua. Juga, apakah Anda menggunakan Windows? Windows menyimpan baris baru sebagai dua byte, tetapi karena python tidak peduli jika baris baru satu atau dua byte Anda dapat menghitungnya sebagai 1, membuat solusi Anda saat ini hanya 103 byte. Ngomong-ngomong, selamat datang di PPCG :)
undergroundmonorail

1

Clojure, 32 byte

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

Terima kasih David untuk rand-intgagasannya, pasti lebih pendek dari if(>(rand)0.5)pendekatannya. Di sini forberdetak map.




0

Java, 84 byte

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

Tidak disatukan

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

Catatan

  • Pikiran dari loop juga bisa menjadi tubuh itu, tidak ada perbedaan ukuran.
  • Array input dimodifikasi tetapi pernyataan tidak mengandung batasan terkait masalah ini. Jika Anda akan menghitung array yang diubah sebagai bentuk "Output / return", Anda bisa memotong 9 byte lainnya dengan menghapus return A;. Jenis kembali harus diubah dari int[]menjadi void. Namun ini tidak menyimpan byte tambahan karena ruang tambahan diperlukan antara voiddan r.

Versi lebih pendek (Seperti disebutkan dalam catatan), 75 byte

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

Keluaran

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

Versi kedua Anda tidak valid, tidak menghasilkan atau mengembalikan apa pun.
Bálint

1
Silakan baca posting saya ...
Marv

0

Mathcad, byte

masukkan deskripsi gambar di sini


Belum ada byte formal yang dihitung sebagai protokol penghitungan Mathcad yang belum diputuskan.


0

Java 108 107 85 82 byte

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

14 byte disimpan berkat @TimmyD


@TimmyD Aturannya mengatakan Anda harus meng-output-nya. Dan aturan itu tidak seperti itu, ketika saya menulis jawabannya
Bálint

Saya percaya Anda dapat menghapus ruang setelah main, String[], int[], dan menyimpan beberapa byte lain dengan mengubah nextFloat()>0.5ke next(1)==0.
Dana Gugatan Monica

@QPaysTaxes saya sudah berubah new java.util.Random().nextFloat()ke Math.random(), karena jauh lebih pendek.
Bálint

@TimmyD Tidak melihat itu, terima kasih
Bálint

Ini tidak berfungsi dalam kondisi saat ini. Anda tidak memodifikasi s, hanya saja i, metode ini memiliki tipe pengembalian voidtetapi Anda mencoba untuk mengembalikan int[]. Juga ada titik koma yang hilang setelah return s.
Marv

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.