Uruchom przez tablicę

13

Wszyscy często słyszymy idiom „spacer po tablicy”, co oznacza „zamapuj funkcję na kolejnej tablicy”. Jednak muszę to zrobić (teraz!), Więc chcę, abyś przebiegł przez tablicę.

Jak mam biegać?

Wyobraź sobie, że to dziki paczka wilków za ciebie

Przebieganie przez tablicę jest jak przechodzenie przez jedną, tyle że można pominąć elementy. Tak, czasami jest bałagan, ale (ogólnie) działa. „Które elementy są pomijane?”, Możesz zapytać. Cóż, robi się to losowo. Przejdźmy przez przebieg tablicy!

  1. Niech ebędzie bieżącym elementem.
  2. Pozwól randomwygenerować losowy pływak [0,1). Jeśli random() < 0.5, to przejdziesz do następnego elementu, a następnie do kroku 1. (Możesz wygenerować liczbę w inny sposób, o ile istnieje (idealnie) równa szansa na pominięcie i pozostanie. Np. Możesz użyć wybrać element z zestaw dwóch członków i wykonaj akcję w oparciu o wynik).
  3. W przeciwnym razie wykonasz funkcję fna e.

Cel

Biorąc pod uwagę tablicę / listę / ciąg znaków jak dowolny z nich Ai liczbę K, przebiegnij przez tablicę, dodając Kdo każdego dostępnego elementu. Wyjdź / zwróć tę tablicę. Abędzie zawierać tylko nieujemne liczby całkowite i Kzawsze będzie nieujemnymi liczbami całkowitymi. To jest , więc wygrywa najkrótszy program w bajtach.

Przypadki testowe (przykłady)

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]
Conor O'Brien
źródło
[0,1)literówka?
Pozostały
5
Czy wybór losowy należy ustalić na podstawie porównania zmiennoprzecinkowego, czy możemy wybrać losowo?
Alex A.,
Czy mogę opublikować program, czy może to być funkcja? To bardzo odróżnia java.
Bálint
1
@epicTCK Oznacza to półotwarty przedział, tj. liczbę rzeczywistą xtaką, że 0 ≤ x < 1.
Martin Ender
1
@ Bálint Obie notacje istnieją.
Martin Ender

Odpowiedzi:

3

Pyth, 7

m+*O2vz

Wypróbuj tutaj

Wykorzystuje losowy wybór zamiast porównania zmiennoprzecinkowego, ale powinien być nie do odróżnienia.

Ekspansja:

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]

Za pomocą zmiennoprzecinkowego:

m+*<.5O0vz

Wypróbuj tutaj

FryAmTheEggman
źródło
2
zmiennoprzecinkowy jest zmiennoprzecinkowy> :(
Leaky Nun
1
@KennyLau zmiana jest trywialna, to była tylko gra w golfa. Nie sądziłem, że miało to oznaczać, że było to wymagane, tylko że zachowanie jest takie samo. Dodam wersję z fp i zapytam OP.
FryAmTheEggman
@KennyLau co z językami bez zmiennoprzecinkowych?
Ven
@FryAmTheEggman Tak, to był tylko przykład - równe prawdopodobieństwo jest w porządku.
Conor O'Brien
@KennyLau OP potwierdził, że zmiennoprzecinkowe nie jest konieczne.
Alex A.,
5

Clojure, 41 37 bajtów

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

Odrzucono kilka bajtów, mnożąc je przez 0 lub 1 i upuszczając „if”. Podziękowania dla większości pozostałych podmiotów przesyłających!

David Vail
źródło
W tym przypadku wystarczy funkcja anonimowa, ale ładna odpowiedź; Witamy w PPCG!
kot
Wiele razy forjest krótszy niż map, patrz moja odpowiedź w celach informacyjnych :) Również pozwala uniknąć wewnętrznej anonimowej funkcji, więc zamiast uruchamiać kod (fn[a k], możesz użyć #(.
NikoNyrh,
4

Galaretka, 9 8 7 bajtów

Od 8do 7dzięki @FryAmTheEggman .

+2X’¤¡€

Wypróbuj online!

Wyjaśnienie

+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).
Leaky Nun
źródło
Jak w he-double-L udaje ci się klawiaturę w tym języku ?!
MonkeyZeus
@MonkeyZeus Dennis powiedział, że można go wprowadzić w systemie Linux przy użyciu zwykłej klawiatury.
Bálint
@ Bálint Fabuła gęstnieje, kim jest Dennis? lol
MonkeyZeus
13
@MonkeyZeus Ahem.
Dennis
1
@Dennis Proroctwo się spełniło ┗ (⊙ .⊙) ┛
MonkeyZeus
3

MATL , 11 bajtów

tZy1$rEki*+

Wykorzystuje liczby losowe zmiennoprzecinkowe.

Wypróbuj online!

Wyjaśnienie

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
Luis Mendo
źródło
1
Wpisany z telefonu. Wyjaśnienie później
Luis Mendo
@CatsAreFluffy :-) Gotowe!
Luis Mendo
3

Japt, 6 bajtów

®+V*Mq

Sprawdź to


Wyjaśnienie

Domniemane wprowadzanie tablicy Ui liczby całkowitej V. Map ( ®) nad tablicą i do każdego elementu dodaj Vpomnożoną przez Mq, która losowo generuje jeden 0lub 1. Niejawne wyjście wynikowej tablicy.

Kudłaty
źródło
2

Rubinowy, 28 bajtów

->a,k{a.map{|e|e+k*rand(2)}}
Wartość tuszu
źródło
2

Julia, 33 29 27 bajtów

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

Jest to anonimowa funkcja, która akceptuje tablicę z wewnętrzną anonimową funkcją, która akceptuje liczbę całkowitą i zwraca tablicę. Aby go wywołać, przypisz go do zmiennej i wywołaj podobnie f(x)(k).

Generujemy tablicę o tej samej długości co tablica wejściowa złożona z zer i zer wybranych losowo z jednakowym prawdopodobieństwem. Mnożymy to przez wejściową liczbę całkowitą i dodajemy to do tablicy wejściowej.

Wypróbuj online!

Zaoszczędzono 2 bajty dzięki Dennisowi!

Alex A.
źródło
2

Python 2, 60 58 bajtów

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

Ten program okazał się bardzo prosty. Nie ma tu wielu sztuczek golfowych, oprócz oczywistego „ from module import*”, używania lambda zamiast zwykłej funkcji i ogólnego braku białych znaków. Poza tym jest to dość idiomatyczne. Gdybym pisał to naprawdę, prawdopodobnie zrobiłbym to w bardzo podobny sposób:

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

A może coś bardziej wymyślnego:

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

Ale to wystarczy popisać się :)

To jest stara, 60-bajtowa wersja, kiedy wymagane było użycie zmiennoprzecinkowe dla losowości:

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

Dla każdego elementu listy dodaj k*(random()<.5). Booleany Pythona oceniają na 0 i 1, więc dodaje 0 do wszystkich elementów, dla których warunek nie jest spełniony.

random.random()Zwroty Pythona napływają [0, 1), więc nie musiałem się tym martwić.

podziemny monorail
źródło
1
@FryAmTheEggman Jeśli wymóg zmiennoprzecinkowy zostanie odrzucony, najlepiej wymyślić, aby całkowicie zapomnieć o pomnożeniu i zrobiće+choice([0,k])
undergroundmonorail
Ach, całkiem słuszny, fajny sposób na uniknięcie pomnożenia. To powiedziawszy wymóg zmiennoprzecinkowy został usunięty, więc możesz zamiast tego zmienić swoją odpowiedź.
FryAmTheEggman 30.04.16
@FryAmTheEggman O haha, nie zauważyłem. Zrobię to teraz, dzięki :)
undergroundmonorail
1

JavaScript (ES6), 38 bajtów

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

użytkownik 81655
źródło
Chcę wziąć udział w wyzwaniu i ... javascript jest zajęty. Poważnie, nauczę się jedności.
Bálint
@ Bálinta Jestem całkiem pewien, jednoskładnikowa, nie może generować losowe pływaków
undergroundmonorail
@undergroundmonorail Powiedziałem to, ponieważ nikt go nie używa (z oczywistych powodów, jak nie można go tutaj opublikować, ponieważ staje się zbyt długi)
Bálint
1

PowerShell v2 +, 34 bajty

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

Pobiera odpowiednio dane wejściowe $aoraz $ktablicę i liczbę całkowitą. Następnie wykonujemy pętlę przez tablicę i każda iteracja pętli generuje bieżący element plus $kczasy, (random 2)które zostaną wykonane Get-Random -Maximum 2(tj. A 0lub a 1). Wszystkie są pozostawione w potoku i wyprowadzane jako niejawna tablica.

AdmBorkBork
źródło
1

CJam, 10 bajtów

{f{2mr*+}}

Oczekuje tablicy i liczby na górze stosu w tej kolejności i zastępuje je nową tablicą.

Sprawdź to tutaj.

Martin Ender
źródło
1

php 71 bajtów

function f($s,$k){foreach($s as $v){$v+=rand(0,2)==0?k:0;echo $v.",";}}
Bálint
źródło
1

k (12 bajtów)

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

na przykład

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

Mówiąc bardziej ogólnie, gdzie fmożna podać jako argument za 16 znaków

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

na przykład

k){@[x;&(#x)?2;y]}[0 0 0 0;2+]
0 0 2 0
skeevey
źródło
Fajnie, w tym wersja ogólna!
Conor O'Brien
1

Python 3 152 110 98 bajtów

To jest moje pierwsze rozwiązanie do gry w golfa, więc nie znam żadnych sztuczek. Przetestowałem to za pomocą głównej funkcji z przypadkami testowymi. Rozmiar pliku to tylko ta funkcja.

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

Podziękowania dla @ Cᴏɴᴏʀ O'Bʀɪᴇɴ za porady dotyczące usuwania białych znaków. Dodatkowe pochwały dla @undergroundmonorail za porady, które pozwoliły zaoszczędzić 12 bajtów.

pochodnia
źródło
1
Liczę 145 bajtów. Można golf, usuwając niepotrzebne spacje, takich jak między import *, a(x, y), x[ptr]=z+y, itd. Można też wymienić 4 spacje z jednego miejsca
Conor O'Brien
Możesz umieścić x[ptr]=z+yw tym samym wierszu, if random()>0.5aby zapisać 3 bajty białych znaków. W Pythonie 2 0.5można zapisać jako .5zapisanie bajtu, ale nie wiem czy to prawda w Pythonie 3. W przypadku zmiany nazwy ptrdo pciebie będzie zaoszczędzić 6 bajtów we wszystkich. Jesteś też w systemie Windows? Windows przechowuje nowe wiersze jako dwa bajty, ale ponieważ python nie dba o to, czy nowy wiersz ma jeden bajt, czy dwa, można go policzyć jako 1, dzięki czemu obecne rozwiązanie ma tylko 103 bajty. Przy okazji, witamy w PPCG :)
metro
1

Clojure, 32 bajty

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

Dziękuję Davidowi za rand-intpomysł, zdecydowanie krótszy niż if(>(rand)0.5)podejście. Tutaj forbije map.

NikoNyrh
źródło
0

Oktawa, 28 bajtów

@(A,R)R*(rand(size(A))<.5)+A

Próbka uruchomiona na ideone .

zlewka
źródło
0

Java, 84 bajty

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

Nie golfił

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

Notatki

  • Myślą pętli może być również jej ciało, nie ma różnicy w rozmiarze.
  • Tablica wejściowa została zmodyfikowana, ale instrukcja nie zawiera ograniczeń dotyczących tego problemu. Jeśli policzyłbyś zmodyfikowaną tablicę jako formę „Output / return”, możesz zgolić kolejne 9 bajtów poprzez usunięcie return A;. Typ zwrotu musiałby zostać zmieniony z int[]na void. Nie oszczędza to jednak dodatkowych bajtów, ponieważ pomiędzy voidi jest potrzebne dodatkowe miejsce r.

Krótsza wersja (jak wspomniano w nocie), 75 bajtów

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

Wynik

[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]
Marv
źródło
Druga wersja jest niepoprawna, niczego nie wyświetla ani nie zwraca.
Bálint
1
Proszę przeczytać mój post ...
Marv
0

Mathcad, bajty

wprowadź opis zdjęcia tutaj


Nie ma jeszcze formalnego liczenia bajtów jako protokołu zliczania Mathcada, który ma zostać jeszcze ustalony.

Stuart Bruff
źródło
0

Java 108 107 85 82 bajtów

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

14 bajtów zapisanych dzięki @TimmyD

Bálint
źródło
@ TimmyD Reguły mówią, że musisz to wydrukować. I ta zasada nie była taka, kiedy napisałem odpowiedź
Bálint
Wierzę, że można usunąć spację po main, String[], int[], i zapisz kolejne kilka bajtów zmieniając nextFloat()>0.5się next(1)==0.
Pozew Fund Moniki w dniu
@QPaysTaxes już zmienić new java.util.Random().nextFloat()się Math.random(), ponieważ jest o wiele krótszy.
Bálint
@TimmyD Nie widziałem tego, dzięki
Bálint
To nie działa w obecnym stanie. Nie modyfikujesz s, tylko imetoda ma typ zwracany, voidale próbujesz zwrócić int[]. Brakuje również średnika return s.
Marv