วิ่งผ่านอาร์เรย์


13

เราทุกคนมักจะได้ยินสำนวน "เดินผ่านอาร์เรย์" เพื่อหมายถึง "แมปฟังก์ชั่นผ่านอาร์เรย์ต่อไปนี้" อย่างไรก็ตามฉันต้องการมัน (ตอนนี้!) ดังนั้นฉันต้องการให้คุณวิ่งผ่านอาร์เรย์

ฉันจะวิ่งได้อย่างไร

ลองนึกภาพว่ามีฝูงหมาป่าดุร้ายอยู่ข้างหลังคุณ

การวิ่งผ่านอาเรย์นั้นเหมือนกับการเดินผ่านหนึ่งยกเว้นคุณสามารถข้ามองค์ประกอบ ใช่บางครั้งมันก็ยุ่ง แต่ก็ใช้งานได้ (โดยทั่วไป) "องค์ประกอบใดที่ถูกข้ามไป" คุณอาจถาม ทีนี้นี่เป็นการสุ่ม เรามาเดินผ่านอาร์เรย์กันเถอะ!

  1. อนุญาตeเป็นองค์ประกอบปัจจุบัน
  2. อนุญาตสร้างลอยสุ่มrandom [0,1)หากrandom() < 0.5คุณไปที่องค์ประกอบถัดไปจากนั้นไปที่ขั้นตอนที่ 1 (คุณอาจสร้างตัวเลขด้วยวิธีอื่นตราบใดที่พวกเขายังมีโอกาสเท่ากันในการข้ามและยังคงอยู่เช่นคุณสามารถใช้เลือกองค์ประกอบจาก สมาชิกสองคนตั้งค่าและดำเนินการตามผลลัพธ์)
  3. มิฉะนั้นคุณปฏิบัติหน้าที่ในfe

วัตถุประสงค์

รับ array / list / string อย่างใดอย่างหนึ่ง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)typo? อีก 2 ไป ...
Bald Bantha

5
ตัวเลือกแบบสุ่มต้องถูกกำหนดโดยการเปรียบเทียบแบบลอยหรือเราสามารถเลือกแบบสุ่มได้หรือไม่?
Alex A.

ฉันสามารถโพสต์โปรแกรมหรือฟังก์ชั่นได้หรือไม่? มันทำให้ differebce distibguishable มากใน java
Bálint

1
@epicTCK นั่นหมายความว่าช่วงครึ่งเปิดคือจำนวนจริงดังกล่าวว่าx 0 ≤ x < 1
Martin Ender

1
@ Bálintมีเครื่องหมายทั้งสองอยู่
Martin Ender

คำตอบ:


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
จุดลอยตัวเป็นจุดลอยตัว> >(
แม่ชีที่รั่ว

1
@KennyLau การเปลี่ยนแปลงเล็กน้อยมากนี่เป็นเพียงนักกอล์ฟ ฉันไม่คิดว่ามันหมายความว่ามันเป็นสิ่งจำเป็น แต่เพียงว่าพฤติกรรมนั้นเหมือนกัน ฉันจะเพิ่มเวอร์ชันด้วย fp และถาม OP
FryAmTheEggman

@KennyLau แล้วภาษาที่ไม่มีคะแนนแบบลอยตัวล่ะ
Ven

@FryAmTheEggman ใช่มันเป็นเพียงตัวอย่าง - ความน่าจะเป็นที่เท่ากันนั้นใช้ได้
Conor O'Brien

@KennyLau OP ได้ยืนยันว่าไม่จำเป็นต้องมีจุดลอย
Alex A.

5

Clojure, 41 37 ไบต์

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

เคาะออกสองสามไบต์โดยการคูณด้วย 0 หรือ 1 และวาง "ถ้า" ให้เครดิตแก่ผู้ส่งอื่น ๆ มากที่สุด!


ฟังก์ชั่นไม่ระบุชื่อจะพอเพียงในกรณีนี้ แต่คำตอบที่ดี; ยินดีต้อนรับสู่ PPCG!
แมว

หลายครั้งที่forสั้นกว่าmapดูคำตอบของฉันสำหรับการอ้างอิง :) นอกจากนี้ยังหลีกเลี่ยงการมีฟังก์ชั่นที่ไม่ระบุชื่อภายในดังนั้นแทนที่จะเริ่มต้นรหัสโดยคุณสามารถใช้(fn[a k] #(
NikoNyrh

4

เยลลี่9 8 7 ไบต์

จากการ8ที่จะ7ต้องขอบคุณ@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

@MonkeyZeus Dennis กล่าวว่าสามารถป้อนบน Linux โดยใช้แป้นพิมพ์ปกติ
Bálint

@ Bálintพล็อตที่มีความหนาเดนนิสคือใคร? lol
MonkeyZeus

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ซึ่งสุ่มสร้างอย่างใดอย่างหนึ่งหรือ0 1เอาต์พุตโดยนัยของอาร์เรย์ผลลัพธ์



2

Julia, 33 29 27 bytes

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

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่ยอมรับอาร์เรย์ที่มีฟังก์ชั่นที่ไม่ระบุชื่อภายในที่รับจำนวนเต็มและส่งกลับอาร์เรย์ f(x)(k)เรียกว่ากำหนดให้ตัวแปรและโทรเช่น

เราสร้างอาร์เรย์ที่มีความยาวเท่ากับอาร์เรย์อินพุตซึ่งประกอบด้วยศูนย์และอันที่เลือกแบบสุ่มโดยมีความน่าจะเป็นเท่ากัน เราคูณนี่ด้วยจำนวนเต็มอินพุทและเพิ่มเข้าไปในอาเรย์ใส่

ลองออนไลน์!

บันทึก 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 booleans ประเมินเป็น 0 และ 1 ดังนั้นสิ่งนี้จะเพิ่ม 0 ให้กับองค์ประกอบใด ๆ ที่เงื่อนไขไม่เป็นจริง

Python random.random()กลับมาลอย[0, 1)ดังนั้นฉันไม่ต้องกังวลเกี่ยวกับสิ่งนั้น


1
@FryAmTheEggman หากความต้องการจุดลอยน้ำลดลงสิ่งที่ดีที่สุดที่ฉันคิดได้ก็คือลืมเคล็ดลับการคูณอย่างสิ้นเชิงและทำได้e+choice([0,k])
undergroundmonorail

ค่อนข้างถูกวิธีที่ดีในการหลีกเลี่ยงการทวีคูณ ที่กล่าวว่าความต้องการจุดลอยตัวถูกลบออกเพื่อให้คุณสามารถเปลี่ยนคำตอบของคุณเป็นแทน
FryAmTheEggman

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


ฉันต้องการมีส่วนร่วมในการท้าทายและ ... จาวาสคริปต์ถูกใช้งานแล้ว อย่างจริงจังฉันจะเรียนรู้เอก
Bálint

@ Bálintฉันค่อนข้างมั่นใจว่า unary ไม่สามารถสร้างทุ่นแบบสุ่มได้
undergroundmonorail

@undergroundmonorail ฉันพูดเพราะไม่มีใครใช้ (ด้วยเหตุผลที่ชัดเจนเช่นไม่สามารถโพสต์ที่นี่เพราะมันยาวเกินไป)
Bálint

1

PowerShell v2 +, 34 ไบต์

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

รับอินพุต$aและ$kอาร์เรย์และ int ตามลำดับ จากนั้นเราวนลูปผ่านอาร์เรย์และวนซ้ำแต่ละครั้งจะส่งเอาต์พุตองค์ประกอบปัจจุบันบวก$kเวลา(random 2)ที่จะดำเนินการGet-Random -Maximum 2(เช่น a 0หรือ a 1) สิ่งเหล่านี้ถูกทิ้งไว้บนไพพ์ไลน์และเอาท์พุทเนื่องจากอาเรย์นั้นมีความหมาย




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

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ʀɪᴇɴสำหรับคำแนะนำในการลบช่องว่าง สรรเสริญเพิ่มเติมจาก @undergroundmonorail สำหรับคำแนะนำที่ช่วยประหยัด 12 ไบต์


1
ฉันนับ 145 ไบต์ คุณสามารถกอล์ฟมันโดยการลบช่องว่างที่ไม่จำเป็นเช่นระหว่างimport *, a(x, y), x[ptr]=z+yฯลฯ นอกจากนี้คุณยังสามารถแทนที่ 4 พื้นที่ที่มีพื้นที่เดียว
Conor โอไบรอัน

คุณสามารถใส่x[ptr]=z+yในบรรทัดเดียวif random()>0.5กับการบันทึกช่องว่าง 3 ไบต์ ใน python 2 0.5สามารถเขียน.5เพื่อบันทึก byte ฉันไม่ทราบว่าเป็นจริงในหลาม 3 หากคุณเปลี่ยนชื่อptrเป็นpคุณจะประหยัดได้ 6 ไบต์ คุณอยู่บน Windows หรือไม่ Windows เก็บบรรทัดใหม่เป็นสองไบต์ แต่เนื่องจาก python ไม่สนใจว่า newline เป็นหนึ่งไบต์หรือสองคุณสามารถนับเป็น 1 ทำให้โซลูชันปัจจุบันของคุณมีเพียง 103 ไบต์ ยังไงก็ตามยินดีต้อนรับสู่ PPCG :)
undergroundmonorail

1

Clojure 32 ไบต์

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

ขอขอบคุณคุณ David ที่ให้rand-intความคิดสั้นกว่าif(>(rand)0.5)แนวทาง นี่เต้นformap




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

Ungolfed

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อย่างไรก็ตามเรื่องนี้ไม่ได้บันทึกไบต์เพิ่มเติมตั้งแต่พื้นที่เพิ่มเติมเป็นสิ่งจำเป็นระหว่างและ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]

รุ่นที่สองของคุณไม่ถูกต้อง แต่จะไม่ส่งออกหรือส่งคืนสิ่งใด
Bálint

1
โปรดอ่านโพสต์ของฉัน ...
Marv

0

Mathcad, ไบต์

ป้อนคำอธิบายรูปภาพที่นี่


ไม่มีการนับไบต์อย่างเป็นทางการเป็นโปรโตคอลการนับ Mathcad ที่จะต้องตัดสินใจ


0

Java 108 107 85 85 82 ไบต์

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

บันทึก 14 ไบต์ด้วย @TimmyD


@ TimmyD กฎบอกว่าคุณต้องแสดงมันออกมา และกฎนั้นก็ไม่ได้เป็นเช่นนั้นเมื่อฉันเขียนคำตอบ
Bálint

ผมเชื่อว่าคุณสามารถเอาพื้นที่หลังmain, String[], int[]และประหยัดไม่กี่ไบต์อื่นโดยการเปลี่ยนไปnextFloat()>0.5 next(1)==0
คดีฟ้องร้องกองทุนโมนิก้า

@QPaysTaxes ฉันเปลี่ยนnew java.util.Random().nextFloat()ไปMath.random()แล้วเนื่องจากสั้นกว่ามาก
Bálint

@ TimmyD ไม่เห็นว่าขอบคุณ
Bálint

สิ่งนี้ไม่ทำงานในสถานะปัจจุบัน คุณไม่แก้ไขsเพียงiวิธีการที่มีประเภทการกลับมาแต่คุณกำลังพยายามที่จะกลับมาvoid นอกจากนี้เธอเอาใจใส่อัฒภาคหายไปหลังจากที่int[] return s
Marv

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.