Ejecutar a través de una matriz


13

Todos a menudo escuchamos el modismo "caminar a través de la matriz" que significa "asignar la función sobre la siguiente matriz". Sin embargo, lo necesito hecho (¡ahora!), Así que quiero que ejecutes la matriz.

¿Cómo corro?

Imagina que hay una jauría salvaje de lobos detrás de ti

Correr a través de una matriz es como caminar a través de una, excepto que puede saltear elementos. Sí, a veces es desordenado, pero (en general) funciona. "¿Qué elementos se omiten?", Puede preguntar. Bueno, esto se hace al azar. ¡Caminemos corriendo por la matriz!

  1. Dejar eser el elemento actual.
  2. Deje randomgenerar un flotador aleatorio [0,1). Si random() < 0.5, entonces va al siguiente elemento y luego al paso 1. (Puede generar un número por otros medios, siempre que sea (idealmente) la misma posibilidad de saltar y permanecer. Por ejemplo, puede usar elegir un elemento de un conjunto de dos miembros y realizar la acción en función del resultado).
  3. De lo contrario, realiza la función fen e.

Objetivo

Dada una matriz / lista / cadena como cualquiera Ay un número K, ejecute la matriz, agregando Ka cada miembro accedido. Salida / retorno de esta matriz. Asolo contendrá enteros no negativos, y Ksolo serán enteros no negativos. Este es un , por lo que gana el programa más corto en bytes.

Casos de prueba (ejemplos)

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)¿error de tipografía? 2 más para ir ...
Bald Bantha

55
¿La elección aleatoria tiene que determinarse mediante comparación flotante o podemos elegir al azar?
Alex A.

¿Puedo publicar un programa o puede ser una función? Hace una diferencia muy distintiva en Java.
Bálint

1
@epicTCK Eso significa un intervalo medio abierto, es decir, un número real xtal que 0 ≤ x < 1.
Martin Ender

1
@ Bálint Ambas anotaciones existen.
Martin Ender

Respuestas:


3

Pyth, 7

m+*O2vz

Pruébalo aquí

Utiliza una elección aleatoria en lugar de una comparación de punto flotante, pero no debe distinguirse.

Expansión:

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]

Usando coma flotante:

m+*<.5O0vz

Pruébalo aquí


2
punto flotante es punto flotante> :(
Leaky Nun

1
@KennyLau el cambio es trivial, esto fue simplemente más golfista. No pensé que fuera necesario, solo que el comportamiento es el mismo. Agregaré una versión con fp y le preguntaré al OP.
FryAmTheEggman

@KennyLau ¿qué pasa con los idiomas sin puntos flotantes?
Ven

@FryAmTheEggman Sí, fue solo un ejemplo: igual probabilidad está bien.
Conor O'Brien

@KennyLau El OP ha confirmado que el punto flotante no es necesario.
Alex A.

5

Clojure, 41 37 bytes

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

Eliminó un par de bytes multiplicando por 0 o 1 y soltando el "si". ¡Crédito a la mayoría de todos los otros remitentes!


Una función anónima será suficiente en este caso, pero buena respuesta; bienvenido a PPCG!
gato

Muchas veces fores más corto que map, vea mi respuesta como referencia :) También evita tener una función anónima interna, por lo que en lugar de iniciar el código (fn[a k]puede usarlo #(.
NikoNyrh

4

Jalea, 9 8 7 bytes

De 8a 7gracias a @FryAmTheEggman .

+2X’¤¡€

Pruébalo en línea!

Explicación

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

¿Cómo en el he-double-L logras un teclado exitoso en este idioma?
MonkeyZeus

@MonkeyZeus Dennis dijo, se puede ingresar en Linux usando un teclado normal.
Bálint

@ Bálint La trama se complica, ¿quién es Dennis? lol
MonkeyZeus

13
@MonkeyZeus Ahem.
Dennis

1
@Dennis La profecía se ha cumplido ┗ (⊙ .⊙) ┛
MonkeyZeus

3

MATL , 11 bytes

tZy1$rEki*+

Utiliza números aleatorios de coma flotante.

Pruébalo en línea!

Explicación

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
Mecanografiado desde el teléfono. Explicación posterior
Luis Mendo

@CatsAreFluffy :-) ¡Listo!
Luis Mendo

3

Japt, 6 bytes

®+V*Mq

Pruébalo


Explicación

Entrada implícita de matriz Uy entero V. Map ( ®) sobre la matriz y, a cada elemento, suma Vmultiplicado por Mq, que genera aleatoriamente uno 0o 1. Salida implícita de la matriz resultante.



2

Julia, 33 29 27 bytes

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

Esta es una función anónima que acepta una matriz con una función anónima interna que acepta un entero y devuelve una matriz. Para llamarlo, asígnelo a una variable y llame comof(x)(k) .

Generamos una matriz con la misma longitud que la matriz de entrada que consta de ceros y unos elegidos al azar con igual probabilidad. Multiplicamos esto por el entero de entrada y lo agregamos a la matriz de entrada.

Pruébalo en línea!

¡Ahorré 2 bytes gracias a Dennis!


2

Python 2, 60 58 bytes

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

Este programa resultó realmente simple. No hay muchos trucos de golf allí, aparte del obvio " from module import*", usando una lambda en lugar de una función regular y la falta general de espacios en blanco. Aparte de eso, en realidad es bastante idiomático. Si estuviera escribiendo esto de verdad, probablemente lo haría de una manera muy similar:

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

O tal vez algo más elegante:

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

Pero eso es suficiente para presumir :)

Esta es la versión anterior de 60 bytes de cuando se requería usar un flotante para aleatoriedad:

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

Para cada elemento de la lista, agregue k*(random()<.5). Los booleanos de Python evalúan a 0 y 1, por lo que esto agrega 0 a cualquier elemento para el que la condición no sea verdadera.

El random.random()regreso de Python flota [0, 1), así que no tuve que preocuparme por eso.


1
@FryAmTheEggman Si se elimina el requisito de coma flotante, lo mejor que puedo entender es olvidar el truco de la multiplicación por completo y hacere+choice([0,k])
undergroundmonorail

Ah, muy bien, buena manera de evitar multiplicarse. Dicho esto, se eliminó el requisito de coma flotante para que pueda cambiar su respuesta a eso.
FryAmTheEggman

@FryAmTheEggman Oh, jaja, no me di cuenta. Lo haré ahora, gracias :)
undergroundmonorail

1

JavaScript (ES6), 38 bytes

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


Quiero participar en un desafío y ... se toma JavaScript. En serio, aprenderé unario.
Bálint

@ Bálint, estoy bastante seguro de que unario no puede generar flotaciones aleatorias
undergroundmonorail

@undergroundmonorail Lo dije porque nadie lo usa (por razones obvias, como que no se puede publicar aquí porque se hace demasiado largo)
Bálint

1

PowerShell v2 +, 34 bytes

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

Toma entrada $ay $k, la matriz y el int respectivamente. Luego recorremos la matriz y cada iteración del ciclo genera el elemento actual más las $kveces (random 2)que se ejecutará Get-Random -Maximum 2(es decir, a 0o a 1). Todos estos quedan en la tubería y la salida como una matriz está implícita.


1

CJam, 10 bytes

{f{2mr*+}}

Espera la matriz y el número en la parte superior de la pila en ese orden y los reemplaza con la nueva matriz.

Pruébalo aquí.


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}

p.ej

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

De manera más general, ¿dónde fse puede pasar como argumento para 16 caracteres?

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

p.ej

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

¡Agradable, incluida una versión general!
Conor O'Brien

1

Python 3 152 110 98 bytes

Esta es mi primera solución de código de golf, así que no conozco ningún truco. Probé esto usando una función principal con casos de prueba. El tamaño del archivo es solo esta función.

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

Gracias a @ Cᴏɴᴏʀ O'Bʀɪᴇɴ por los consejos para eliminar espacios en blanco. Elogios adicionales a @undergroundmonorail por consejos que ahorraron 12 bytes.


1
Cuento 145 bytes. Puede jugar al golf mediante la eliminación de espacios en blanco que no sean necesarios, por ejemplo, entre import *, a(x, y), x[ptr]=z+y, etc También puede reemplazar los 4 espacios con un solo espacio
Conor O'Brien

Puede poner x[ptr]=z+yen la misma línea if random()>0.5para ahorrar 3 bytes de espacio en blanco. En Python 2 0.5se puede escribir .5para guardar un byte, aunque no sé si eso es cierto en Python 3. Si cambia el nombre ptral pque se ahorrará 6 bytes en total. Además, ¿estás en Windows? Windows almacena nuevas líneas como dos bytes, pero dado que a python no le importa si la nueva línea es de un byte o dos, puede contarla como 1, lo que hace que su solución actual sea de solo 103 bytes. Por cierto, bienvenido a PPCG :)
undergroundmonorail

1

Clojure, 32 bytes

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

Gracias David por la rand-intidea, definitivamente más corta que el if(>(rand)0.5)enfoque. Aquí forlate 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;}

Sin golf

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

Notas

  • La idea de último momento del bucle también podría ser su cuerpo, no hay diferencia de tamaño.
  • La matriz de entrada se modifica pero la declaración no contiene una restricción con respecto a este problema. Si contara la matriz modificada como una forma de "Salida / retorno", podría eliminar otros 9 bytes eliminando return A;. El tipo de retorno necesitaría ser cambiado de int[]a void. Sin embargo, esto no ahorra bytes adicionales ya que se necesita un espacio adicional entre voidy r.

Versión más corta (como se menciona en la nota), 75 bytes

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

Salida

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

Su segunda versión no es válida, no genera ni devuelve nada.
Bálint

1
Por favor, lea mi publicación ...
Marv

0

Mathcad, bytes

enter image description here


Aún no se ha decidido el recuento de bytes formal como protocolo de recuento de Mathcad


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)+";");}

14 bytes guardados gracias a @TimmyD


@TimmyD Las reglas dicen que debes generarlo. Y esa regla no era así, cuando escribí la respuesta
Bálint

Creo que se puede quitar el espacio después de main, String[], int[], y salvar a otro pocos bytes cambiando nextFloat()>0.5a next(1)==0.
Fondo de la demanda de Mónica

@QPaysTaxes Ya cambio new java.util.Random().nextFloat()a Math.random(), ya que es mucho más corto.
Bálint

@TimmyD No vi eso, gracias
Bálint

Esto no funciona en su estado actual. No modifica s, solo el imétodo tiene el tipo de retorno, voidpero está tratando de regresar int[]. También hay un punto y coma que falta después return s.
Marv

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.