Bir dizi üzerinden geç


13

Hepimiz sık sık "dizi üzerinden yürümek" deyimi "fonksiyonu aşağıdaki dizi üzerinden eşlemek" demek duyuyoruz. Ancak, ben (şimdi!) Yapılması gerekir, bu yüzden dizi üzerinden çalıştırmak istiyorum .

Nasıl koşarım?

Arkanda vahşi bir kurt sürüsü olduğunu hayal et

Bir dizi boyunca koşmak, bir öğe üzerinde yürümek gibidir, ancak öğeleri atlayabilirsiniz. Evet, bazen dağınık, ama (genellikle) işe yarıyor. “Hangi elemanlar atlanıyor?” Diye sorabilirsiniz. Bu rastgele yapılır. Dizide koşarak yürüyelim!

  1. Izin vermek egeçerli eleman olsun.
  2. Let randomrastgele bir şamandıra üretmek [0,1). Eğer bir random() < 0.5sonraki öğeye giderseniz ve sonra 1. adıma gidersiniz. (Başka bir yolla bir sayı üretebilirsiniz, ancak (ideal olarak) eşit atlama ve kalma şansı olduğu sürece. Örneğin, bir iki üyeli eylemi sonuca göre ayarlar ve gerçekleştirir.)
  3. Aksi takdirde, işlevi façık olarak gerçekleştirirsiniz e.

Amaç

Herhangi bir dizi / liste / dize Ave bir sayı Kverildiğinde, Kerişilen her üyeye ekleyerek dizi boyunca ilerleyin . Bu diziyi çıktılar / döndürür. Ayalnızca negatif olmayan tamsayılar içerir ve Kyalnızca negatif olmayan bir tamsayı olur. Bu bir , bu yüzden bayttaki en kısa program kazanıyor.

Test senaryoları (örnekler)

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? Gitmek için 2 daha ...
Bald Bantha

5
Rastgele seçim float karşılaştırması ile mi belirlenmeli yoksa rastgele seçebilir miyiz?
Alex

Bir program yayınlayabilir miyim veya bir işlev olabilir mi? Java'da çok belirgin bir fark yaratıyor.
Bálint

1
başka bir deyişle yarı açık aralık @epicTCK örneğin, bir reel sayı xolduğu gibi 0 ≤ x < 1.
Martin Ender

1
@ Bálint Her iki gösterim de vardır.
Martin Ender

Yanıtlar:


3

Pyth, 7

m+*O2vz

Burada deneyin

Kayan nokta karşılaştırması yerine rastgele bir seçim kullanır, ancak ayırt edilemez olmalıdır.

Genişleme:

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]

Kayan noktayı kullanma:

m+*<.5O0vz

Burada deneyin


2
kayan nokta kayan nokta> :(
Leaky Nun

1
@KennyLau değişiklik önemsiz, bu sadece golfçü oldu. Bunun gerekli olduğunu düşünmedim, sadece davranış aynı. Fp ile bir sürüm ekleyeceğim ve OP'ye soracağım.
FryAmTheEggman

@KennyLau kayan nokta olmayan diller ne olacak?
Ven

@FryAmTheEggman Evet, bu sadece bir örnektir - eşit olasılık iyidir.
Conor O'Brien

@KennyLau OP, kayan noktanın gerekli olmadığını doğruladı.
Alex

5

Clojure, 41 37 bayt

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

0 veya 1 ile çarpıp "if" i bırakarak birkaç bayt çaldı. Diğer tüm gönderenlerin çoğuna kredi!


Bu durumda bir anonim işlev yeterli olacaktır, ancak güzel bir cevap; PPCG'ye hoş geldiniz!
kedi

Birçok kez fordaha kısadır map, referans için cevabım bakın :) Ayrıca iç anonim bir fonksiyona sahip olmaktan kaçınır, böylece kodu başlatarak (fn[a k]kullanabilirsiniz #(.
NikoNyrh

4

Jöle, 9 8 7 bayt

Gönderen 8etmek 7sayesinde @FryAmTheEggman .

+2X’¤¡€

Çevrimiçi deneyin!

açıklama

+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'de bu dilde nasıl başarılı bir şekilde klavye kullanıyorsunuz ?!
MonkeyZeus

@MonkeyZeus Dennis, normal bir klavye kullanarak Linux'a girilebileceğini söyledi.
Bálint

@ Bálint Arsa kalınlaşıyor, Dennis kim? lol
MonkeyZeus

13
@MonkeyZeus Ahem.
Dennis

1
@Dennis Kehanet yerine getirildi ┗ (⊙ .⊙) ┛
MonkeyZeus

3

MATL , 11 bayt

tZy1$rEki*+

Kayan nokta rasgele sayıları kullanır.

Çevrimiçi deneyin!

açıklama

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
Telefondan yazılmıştır. Daha sonra açıklama
Luis Mendo

@CatsAreFluffy :-) Tamam!
Luis Mendo

3

Japt, 6 bayt

®+V*Mq

Dene


açıklama

Örtülü dizi Uve tamsayı girişi V. ®Dizi ( ) öğesini dizinin üzerinde eşleştirin ve her öğeye, Vçarparak ekleyin Mq, bu da rastgele birini 0veya oluşturur 1. Ortaya çıkan dizinin örtük çıktısı.



2

Julia, 33 29 27 bayt

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

Bu, bir tamsayı kabul eden ve bir dizi döndüren iç anonim işlevli bir diziyi kabul eden anonim bir işlevdir. Onu çağırmak için bir değişkene atayın ve şöyle çağırın f(x)(k).

Sıfırlarla ve eşit olasılıkla rastgele seçilenlerden oluşan giriş dizisiyle aynı uzunlukta bir dizi üretiyoruz. Bunu girdi tamsayı ile çarpar ve girdi dizisine ekleriz.

Çevrimiçi deneyin!

Dennis sayesinde 2 bayt tasarruf!


2

Python 2, 60 58 bayt

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

Bu program gerçekten basit çıktı. Orada pek çok golf hilesi, dışında bariz " from module import*", yerine bir lambda kullanarak düzenli bir işlev ve genel boşluk eksikliği. Bunun dışında aslında oldukça deyimsel. Bunu gerçek için yazsaydım, muhtemelen çok benzer bir şekilde yapardım:

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

Ya da belki daha süslü bir şey:

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

Ama bu gösteriş için yeterli :)

Bu, rasgelelik için bir şamandıra kullanıldığında gelen eski, 60 baytlık sürümdür:

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

Listenin her öğesi için ekleyin k*(random()<.5). Python booleans 0 ve 1 olarak değerlendirilir, böylece bu durumun doğru olmadığı herhangi bir öğeye 0 ekler.

Python'un random.random()geri dönüşleri yüzer [0, 1), bu yüzden bunun için endişelenmem gerekmiyordu.


1
@FryAmTheEggman Kayan nokta gereksinimi düşerse, anlayabileceğim en iyi şey çarpma hilesini tamamen unutmak ve yapmaktıre+choice([0,k])
undergroundmonorail

Ah oldukça doğru, çoğalmayı önlemek için güzel bir yol. Bu, kayan nokta gereksiniminin kaldırıldığını söyledi, böylece bunun yerine cevabınızı değiştirebilirsiniz.
FryAmTheEggman

@FryAmTheEggman Oh haha, fark etmedim. Bunu şimdi yapacağım, teşekkürler :)
undergroundmonorail

1

JavaScript (ES6), 38 bayt

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


Bir yarışmaya katılmak istiyorum ve ... javascript alınır. Cidden, tekli öğreneceğim.
Bálint

@ Bálint eminim unary rastgele yüzer üretemez eminim
undergroundmonorail

@undergroundmonorail Kimseyi kullanmadığı için söyledim (çok uzun olduğu için burada yayınlanamayacağı gibi)
Bálint

1

PowerShell v2 +, 34 bayt

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

Girdi $ave $ksırasıyla dizi ve int alır. Daha sonra dizi boyunca döngü yaparız ve her döngü yinelemesi geçerli öğeyi artı yürütecek $ksüreleri (yani, a veya a ) çıkarır . Bunların tümü boru hattında bırakılır ve bir dizi örtük olarak çıktılanır.(random 2)Get-Random -Maximum 201



1

php 71 bayt

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

1

k (12 bayt)

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

Örneğin

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

Daha genel olarak, f16 karakter için argüman olarak geçilebilir

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

Örneğin

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

Güzel, genel bir sürüm dahil!
Conor O'Brien

1

Python 3 152 110 98 bayt

Bu benim ilk kod golf çözümü bu yüzden hile bilmiyorum. Bunu test senaryolarıyla bir ana işlev kullanarak test ettim. Dosya boyutu sadece bu işlevdir.

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

Boşluğu kaldırmayla ilgili tavsiyeler için @ Cᴏɴᴏʀ O'Bʀɪᴇɴ'ye teşekkürler. 12 bayt tasarruf tavsiye için @ undergroundmonorail ek övgü.


1
145 bayt sayıyorum. Aralığında gibi gereksiz boşluk kaldırarak yapabilirsiniz golf onu import *, a(x, y), x[ptr]=z+yvb Ayrıca tek kapasiteli 4 boşlukların yerine edebilirsiniz
Conor O'Brien

3 bayt boşluk kaydetmek x[ptr]=z+yiçin aynı satıra koyabilirsiniz if random()>0.5. Python 2'de bir bayt kaydetmek 0.5için yazılabilir .5, python 3'te bunun doğru olup olmadığını bilmiyorum. Eğer yeniden adlandırırsanız ptriçin phepinize 6 bayt kaydedeceğiz. Ayrıca, Windows'da mısınız? Windows yeni satırları iki bayt olarak saklar, ancak python yeni satırın bir bayt mı yoksa iki bayt mı olduğunu umursamadığı için 1 olarak sayabilirsiniz ve mevcut çözümünüzü yalnızca 103 bayt yapar. Bu arada, PPCG'ye hoş geldiniz :)
undergroundmonorail

1

Clojure, 32 bayt

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

David'e rand-intfikir için teşekkürler , if(>(rand)0.5)yaklaşımdan kesinlikle daha kısa . İşte foratıyor map.




0

Java, 84 bayt

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

notlar

  • Döngünün sonradan düşünülmesi de vücudu olabilir, boyutta bir fark yoktur.
  • Girdi dizisi değiştirildi, ancak ifade bu sorunla ilgili bir kısıtlama içermiyor. Değiştirilmiş diziyi bir "Çıktı / dönüş" biçimi olarak sayarsanız, kaldırarak başka bir 9 bayt tıraş edebilirsiniz return A;. Dönüş türü değiştirilebilir gerekir int[]için void. Ancak bu, voidve arasında ek bir alan gerektiğinden ek bayt tasarrufu yapmaz r.

Daha kısa versiyon (Notta belirtildiği gibi), 75 bayt

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

Çıktı

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

İkinci sürümünüz geçerli değil, çıktı almıyor veya hiçbir şey döndürmüyor.
Bálint

1
Lütfen
yazımı

0

Mathcad, bayt

resim açıklamasını buraya girin


Mathcad sayma protokolü olarak henüz resmi bir bayt sayımına karar verilmemiştir.


0

Java 108 107 85 82 bayt

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

@TimmyD sayesinde 14 bayt kaydedildi


@TimmyD Kurallar, çıktıyı almanız gerektiğini söylüyor. Ve cevabı yazdığımda bu kural böyle değildi
Bálint

Sana sonra boşluk kaldırmak inanıyoruz main, String[], int[], ve başka birkaç bayt tasarruf değiştirerek nextFloat()>0.5için next(1)==0.
Monica'nın Davası

@QPaysTaxes Çok daha kısa olduğu new java.util.Random().nextFloat()için zaten değiştiriyorum Math.random().
29/16

@TimmyD Görmedim, teşekkürler
Bálint

Bu, şu anki durumunda çalışmaz. sYalnızca iyöntemin dönüş türünü değiştirmezsiniz , ancak geri dönmeye voidçalışıyorsunuzdur int[]. Ayrıca sonra noktalı virgül eksik return s.
Marv

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.