Führen Sie durch ein Array


13

Wir alle hören oft die Redewendung "durch das Array gehen", um "die Funktion über das folgende Array abbilden" zu bedeuten. Ich muss es jedoch tun (jetzt!), Also möchte ich, dass du rennst durch das Array.

Wie laufe ich?

Stellen Sie sich vor, es gibt ein wildes Rudel Wölfe hinter sich

Das Durchlaufen eines Arrays entspricht dem Durchlaufen eines Arrays, mit der Ausnahme, dass Sie Elemente überspringen können. Ja, es ist manchmal chaotisch, aber es funktioniert (im Allgemeinen). "Welche Elemente werden übersprungen?", Können Sie fragen. Nun, das geschieht zufällig. Lassen Sie uns durch das Array laufen!

  1. Sei edas aktuelle Element.
  2. Lassen Sie randomeinen Zufallsgenerator einfließen [0,1). Wenn random() < 0.5ja, fahren Sie mit dem nächsten Element fort und fahren mit Schritt 1 fort. (Sie können eine Zahl auch auf andere Weise generieren, sofern dies eine (im Idealfall) gleiche Chance zum Überspringen und Verbleiben darstellt. Sie können beispielsweise ein Element aus a auswählen Zwei-Mitglieder-Set und Ausführen der Aktion basierend auf dem Ergebnis.)
  3. Andernfalls führen Sie die Funktion faus e.

Zielsetzung

Wenn Sie ein Array / eine Liste / eine Zeichenfolge wie Aeines oder eine Zahl haben K, durchlaufen Sie das Array und fügen Sie Kjedem Mitglied, auf das zugegriffen wird , etwas hinzu . Dieses Array ausgeben / zurückgeben. Awird nur nicht negative ganze Zahlen enthalten und Kwird immer nur eine nicht negative ganze Zahl sein. Dies ist ein , also gewinnt das kürzeste Programm in Bytes.

Testfälle (Beispiele)

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)Tippfehler? 2 mehr zu gehen ...
Bald Bantha

5
Muss die zufällige Auswahl durch Float-Vergleich ermittelt werden oder können wir zufällig auswählen?
Alex A.

Kann ich ein Programm posten oder kann es eine Funktion sein? Es macht einen sehr unterscheidbaren Unterschied in Java.
Bálint

1
@epicTCK Das bedeutet ein halboffenes Intervall, dh eine reelle Zahl, xso dass 0 ≤ x < 1.
Martin Ender

1
@ Bálint Beide Schreibweisen existieren.
Martin Ender

Antworten:


3

Pyth, 7

m+*O2vz

Probieren Sie es hier aus

Verwendet eine zufällige Auswahl anstelle eines Gleitkommavergleichs, sollte aber nicht unterscheidbar sein.

Erweiterung:

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]

Fließkomma verwenden:

m+*<.5O0vz

Probieren Sie es hier aus


2
Gleitkomma ist Gleitkomma> :(
Leaky Nun

1
@KennyLau die Änderung ist trivial, das war nur Golfspieler. Ich habe nicht gedacht, dass es so gemeint ist, dass es erforderlich ist, nur dass das Verhalten dasselbe ist. Ich werde eine Version mit fp hinzufügen und das OP fragen.
FryAmTheEggman

@KennyLau was ist mit Sprachen ohne Fließkomma?
Ven

@FryAmTheEggman Ja, es war nur ein Beispiel - gleiche Wahrscheinlichkeit ist in Ordnung.
Conor O'Brien

@KennyLau Das OP hat bestätigt, dass kein Gleitkomma erforderlich ist.
Alex A.

5

Clojure, 41 37 Bytes

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

Einige Bytes durch Multiplikation mit 0 oder 1 und Löschen des "if" abgeschlagen. Gutschrift an die meisten anderen Einreicher!


Eine Anonymusfunktion reicht in diesem Fall aus, aber eine nette Antwort; Willkommen bei PPCG!
Katze

Oftmals forist es kürzer als map, siehe meine Antwort als Referenz :) Außerdem vermeidet es, eine innere anonyme Funktion zu haben, sodass (fn[a k]Sie den Code nicht starten, sondern verwenden können #(.
NikoNyrh

4

Jelly, 9 8 7 Bytes

Von 8zu 7dank @FryAmTheEggman .

+2X’¤¡€

Probieren Sie es online!

Erläuterung

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

Wie im He-Double-L tasten Sie erfolgreich in dieser Sprache ?!
MonkeyZeus

@MonkeyZeus Dennis sagte, es kann unter Linux mit einer normalen Tastatur eingegeben werden.
Bálint

@ Bálint Die Handlung verdickt sich, wer ist Dennis? lol
MonkeyZeus

13
@MonkeyZeus Ahem.
Dennis

1
@ Tennis Die Prophezeiung wurde erfüllt fulfilled (⊙ .⊙) ┛
MonkeyZeus

3

MATL , 11 Bytes

tZy1$rEki*+

Verwendet Gleitkommazahlen.

Probieren Sie es online!

Erläuterung

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
Vom Telefon eingegeben. Erklärung später
Luis Mendo

@CatsAreFluffy :-) Fertig!
Luis Mendo

3

Japt, 6 Bytes

®+V*Mq

Probier es aus


Erläuterung

Implizite Eingabe von Array Uund Ganzzahl V. Ordnen Sie ( ®) dem Array zu und addieren Sie zu jedem Element Vmultipliziert mit Mq, was entweder 0oder zufällig erzeugt 1. Implizite Ausgabe des resultierenden Arrays.



2

Julia, 33 29 27 Bytes

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

Dies ist eine anonyme Funktion, die ein Array mit einer inneren anonymen Funktion akzeptiert, die eine Ganzzahl akzeptiert und ein Array zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu und rufen Sie like auf f(x)(k).

Wir erzeugen ein Array mit der gleichen Länge wie das Eingangsarray, bestehend aus Nullen und Einsen, die mit gleicher Wahrscheinlichkeit zufällig ausgewählt werden. Wir multiplizieren dies mit der Eingabe-Ganzzahl und fügen diese dem Eingabe-Array hinzu.

Probieren Sie es online!

2 Bytes gespart dank Dennis!


2

Python 2, 60 58 Bytes

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

Dieses Programm hat sich als sehr einfach erwiesen. Es gibt nicht viele Golf-Tricks, abgesehen von dem offensichtlichen " from module import*", bei dem ein Lambda anstelle einer regulären Funktion verwendet wird, und dem allgemeinen Mangel an Leerzeichen. Davon abgesehen ist es eigentlich ziemlich idiomatisch. Wenn ich das wirklich schreiben würde, würde ich es wahrscheinlich auf sehr ähnliche Weise tun:

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

Oder vielleicht etwas ausgefalleneres:

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

Aber das ist genug, um anzugeben :)

Dies ist die alte 60-Byte-Version, ab der ein Float für die Zufälligkeit benötigt wurde:

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

Fügen Sie für jedes Element der Liste hinzu k*(random()<.5) . Python-Boolesche Werte werden mit 0 und 1 ausgewertet. Dadurch wird allen Elementen, für die die Bedingung nicht erfüllt ist, 0 hinzugefügt.

Pythons random.random()Renditen fließen ein [0, 1), darum musste ich mir keine Sorgen machen.


1
@FryAmTheEggman Wenn die Fließkomma-Anforderung gesunken ist, ist das Beste, was ich herausfinden kann, den Multiplikationstrick vollständig zu vergessen und zu tune+choice([0,k])
undergroundmonorail

Ah ganz richtig, schöner Weg, um eine Vermehrung zu vermeiden. Das heißt, die Fließkomma-Anforderung wurde entfernt, sodass Sie stattdessen Ihre Antwort darauf ändern können.
FryAmTheEggman

@FryAmTheEggman Oh haha, ich habe es nicht bemerkt. Ich mache das jetzt, danke :)
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`)


Ich möchte an einer Herausforderung teilnehmen und ... Javascript wird angenommen. Im Ernst, ich werde unärgerlich lernen.
Bálint

@ Bálint Ich bin mir ziemlich sicher, dass Unary keine zufälligen Floats erzeugen kann
undergroundmonorail

@undergroundmonorail Ich sagte es, weil niemand es benutzt (aus offensichtlichen Gründen, wie es hier nicht gepostet werden kann, weil es zu lang wird)
Bálint

1

PowerShell v2 +, 34 Byte

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

Übernimmt die Eingabe $aund $k, das Array bzw. das Int. Wir durchlaufen dann das Array und geben bei jeder Schleifeniteration das aktuelle Element plus die $kZeiten aus, (random 2)die ausgeführt werden Get-Random -Maximum 2(dh entweder a 0oder a 1). Diese verbleiben alle in der Pipeline und werden implizit als Array ausgegeben.


1

CJam, 10 Bytes

{f{2mr*+}}

Erwartet das Array und die Nummer oben auf dem Stapel in dieser Reihenfolge und ersetzt sie durch das neue Array.

Teste es hier.


1

PHP 71 Bytes

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

1

k (12 Bytes)

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

z.B

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

Im Allgemeinen, wo f kann als Argument für 16 Zeichen übergeben werden

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

z.B

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

Schön, einschließlich einer allgemeinen Version!
Conor O'Brien

1

Python 3 152 110 98 Bytes

Dies ist meine erste Code-Golf-Lösung, daher kenne ich keine Tricks. Ich habe dies mit einer Hauptfunktion mit Testfällen getestet. Die Dateigröße ist nur diese Funktion.

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

Vielen Dank an @ Cᴏɴᴏʀ O'Bʀɪᴇɴ für den Rat zum Entfernen von Leerzeichen. Zusätzliches Lob an @undergroundmonorail für Ratschläge, die 12 Byte einsparen.


1
Ich zähle 145 Bytes. Sie kann Golf spielen es durch unnötigen Leerzeichen zu entfernen, wie zwischen import *, a(x, y), x[ptr]=z+yusw. Sie können auch die vier Räume mit einem einzigen Raum ersetzen
Conor O'Brien

Sie können x[ptr]=z+ydieselbe Zeile if random()>0.5einfügen, um 3 Bytes Leerzeichen zu sparen. In Python 2 0.5kann geschrieben werden .5, um ein Byte zu speichern, ich weiß jedoch nicht, ob dies in Python 3 zutrifft. Wenn Sie auf umbenennen ptr, psparen Sie insgesamt 6 Byte. Bist du auch auf Windows? Windows speichert Newlines als zwei Bytes, aber da es Python egal ist, ob die Newline ein oder zwei Bytes enthält, können Sie sie als 1 zählen, sodass Ihre aktuelle Lösung nur 103 Bytes umfasst. Übrigens, willkommen bei PPCG :)
undergroundmonorail

1

Clojure, 32 Bytes

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

Danke David für die rand-intIdee, definitiv kürzer als der if(>(rand)0.5)Ansatz. Hier forschlägt map.




0

Java, 84 Bytes

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

Anmerkungen

  • Der nachträgliche Gedanke der Schleife könnte auch sein Körper sein, es gibt keinen Größenunterschied.
  • Das Eingabearray wurde geändert, die Anweisung enthält jedoch keine Einschränkung in Bezug auf dieses Problem. Wenn Sie das geänderte Array als eine Form von "Ausgabe / Rückgabe" zählen würden, könnten Sie durch Entfernen weitere 9 Bytes einsparen return A;. Die Art Rückkehr müßte von geändert werden , int[]zu void. Dies spart jedoch keine zusätzlichen Bytes, da zwischen voidund ein zusätzlicher Speicherplatz benötigt wird r.

Kürzere Version (wie im Hinweis erwähnt), 75 Bytes

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

Ausgabe

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

Ihre zweite Version ist ungültig, sie gibt nichts aus oder gibt nichts zurück.
Bálint

1
Bitte lies meinen Beitrag ...
Marv

0

Mathcad, Bytes

Bildbeschreibung hier eingeben


Es ist noch keine formale Byteanzahl als Mathcad-Zählprotokoll zu bestimmen.


0

Java 108 107 85 82 Bytes

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

Dank @TimmyD werden 14 Bytes gespeichert


@TimmyD Die Regeln besagen, dass Sie es ausgeben müssen. Und diese Regel war nicht so, als ich die Antwort schrieb
Bálint

Ich glaube, Sie können den Raum danach entfernen main,String[] , int[]und speichern Sie noch ein paar Bytes durch eine Änderung nextFloat()>0.5an next(1)==0.
Fund Monica Klage

@QPaysTaxes ich ändern bereits new java.util.Random().nextFloat()zu Math.random(), da es viel viel kürzer ist.
Bálint

@ TimyD nicht gesehen, danke
Bálint

Dies funktioniert im aktuellen Zustand nicht. Sie ändern nicht s, nur die iMethode hat den Rückgabetyp, voidaber Sie versuchen zurückzugeben int[]. Auch ein Semikolon fehlt danach return s.
Marv

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.