Executar através de uma matriz


13

Todos nós sempre ouvimos o idioma "percorrer a matriz" para significar "mapear a função sobre a matriz a seguir". No entanto, eu preciso fazê-lo (agora!), Então quero que você execute a matriz.

Como eu corro?

Imagine que há um bando selvagem de lobos atrás de você

Percorrer uma matriz é como percorrer uma, exceto que você pode pular os elementos. Sim, às vezes é confuso, mas (geralmente) funciona. "Quais elementos foram ignorados?", Você pode perguntar. Bem, isso é feito aleatoriamente. Vamos percorrer a matriz!

  1. Let eSer o elemento atual.
  2. Vamos randomgerar uma flutuação aleatória [0,1). E serandom() < 0.5 você for para o próximo elemento e depois para a etapa 1. (Você pode gerar um número por outros meios, desde que seja uma chance (idealmente) igual de pular e permanecer. Por exemplo, você pode escolher um elemento conjunto de dois membros e execute a ação com base no resultado.)
  3. Caso contrário, você executar a função fno e.

Objetivo

Dado um array / lista / string como um Ae um número K, percorra o array, adicionando Ka cada membro acessado. Saída / retorno desta matriz. Aconterá apenas números inteiros não negativos e Ksempre serão números inteiros não negativos. Este é um , portanto o programa mais curto em bytes vence.

Casos de teste (exemplos)

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)erro de digitação? 2 mais para onde ir ...
Bald Bantha

5
A escolha aleatória deve ser determinada por comparação de flutuação ou podemos escolher aleatoriamente?
Alex A.

Posso postar um programa ou pode ser uma função? Faz uma diferença muito distinta em java.
Bálint 29/04

1
@epicTCK Isso significa um intervalo semiaberto, ou seja, um número real xtal que 0 ≤ x < 1.
Martin Ender

1
@ Bálint Ambas as notações existem.
Martin Ender

Respostas:


3

Pitão, 7

m+*O2vz

Experimente aqui

Usa uma escolha aleatória em vez de comparação de ponto flutuante, mas deve ser indistinguível.

Expansão:

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 ponto flutuante:

m+*<.5O0vz

Experimente aqui


2
ponto flutuante é ponto flutuante> :(
Leaky Nun

1
@KennyLau a mudança é trivial, isso era apenas golfe. Não achei que isso fosse necessário, apenas que o comportamento é o mesmo. Vou adicionar uma versão com fp e perguntar ao OP.
FryAmTheEggman 29/04

@KennyLau e as línguas sem pontos flutuantes?
Ven

@FryAmTheEggman Sim, foi apenas um exemplo - probabilidade igual é boa.
Conor O'Brien

@KennyLau O OP confirmou que o ponto flutuante não é necessário.
Alex A.

5

Clojure, 41 37 bytes

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

Bateu alguns bytes multiplicando por 0 ou 1 e soltando o "se". Crédito para a maioria dos outros remetentes!


Uma função anônima será suficiente neste caso, mas uma boa resposta; bem-vindo ao PPCG!
cat

Muitas vezes foré mais curto do que map, veja minha resposta para referência :) Além disso, evita ter uma função anônima interna, portanto, em vez de iniciar o código, (fn[a k]você pode usar #(.
NikoNyrh

4

Geléia, 9 8 7 bytes

A partir 8de 7graças a @FryAmTheEggman .

+2X’¤¡€

Experimente online!

Explicação

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

Como no he-double-L você teclado com sucesso neste idioma ?!
MonkeyZeus

@MonkeyZeus Dennis disse, ele pode ser acessado no Linux usando um teclado normal.
Bálint

@ Bálint O enredo engrossa, quem é Dennis? lol
MonkeyZeus

13
@MonkeyZeus Ahem.
Dennis

1
@Dennis A profecia foi cumprida ┗ (⊙ .⊙) ┛
MonkeyZeus

3

MATL , 11 bytes

tZy1$rEki*+

Usa números aleatórios de ponto flutuante.

Experimente online!

Explicação

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
Digitado no telefone. Explicação posterior
Luis Mendo

@CatsAreFluffy :-) Done!
Luis Mendo

3

Japonês, 6 bytes

®+V*Mq

Teste-o


Explicação

Entrada implícita de matriz Ue número inteiro V. Mapeie ( ®) sobre a matriz e, para cada elemento, adicione Vmultiplicado por Mq, que gera aleatoriamente um 0ou 1. Saída implícita da matriz resultante.



2

Julia, 33 29 27 bytes

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

Esta é uma função anônima que aceita uma matriz com uma função anônima interna que aceita um número inteiro e retorna uma matriz. Para chamá-lo, atribua-o a uma variável e chame comof(x)(k) .

Geramos uma matriz com o mesmo comprimento que a matriz de entrada composta por zeros e aqueles escolhidos aleatoriamente com igual probabilidade. Nós multiplicamos isso pelo número inteiro de entrada e o adicionamos à matriz de entrada.

Experimente online!

Economizou 2 bytes graças a Dennis!


2

Python 2, 60 58 bytes

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

Este programa acabou realmente simples. Não há muitos truques de golfe lá, além do óbvio " from module import*", usando um lambda em vez de uma função regular e a falta geral de espaço em branco. Fora isso, é realmente bastante idiomático. Se eu estivesse escrevendo isso de verdade, provavelmente faria de uma maneira muito semelhante:

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

Ou talvez algo mais chique:

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

Mas isso é o suficiente para mostrar :)

Esta é a versão antiga de 60 bytes de quando era necessário usar um float para aleatoriedade:

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

Para cada elemento da lista, adicione k*(random()<.5). Os booleanos Python são avaliados como 0 e 1, portanto, adiciona 0 a qualquer elemento cuja condição não seja verdadeira.

Os random.random()retornos do Python flutuam [0, 1), então eu não precisava me preocupar com isso.


1
@FryAmTheEggman Se a exigência de ponto flutuante é descartado, o melhor que posso descobrir é esquecer o truque multiplicação inteiramente e fazere+choice([0,k])
undergroundmonorail

Ah, bem, boa maneira de evitar a multiplicação. Dito isto, o requisito de ponto flutuante foi removido para que você possa alterar sua resposta.
FryAmTheEggman

@FryAmTheEggman Oh haha, eu não percebi. Eu vou fazer isso agora, obrigado :) #
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`)


Quero participar de um desafio e ... o javascript é usado. Sério, eu vou aprender unário.
Bálint 29/04

@ Bálint eu tenho certeza unário não pode gerar carros alegóricos aleatórios
undergroundmonorail

@undergroundmonorail eu disse isso porque ninguém usa-lo (por razões óbvias, como ele não pode ser postado aqui porque se torna demasiado longo)
Bálint

1

PowerShell v2 +, 34 bytes

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

Pega entrada $ae $k, a matriz e o int respectivamente. Em seguida, passamos pela matriz e cada iteração de loop gera o elemento atual mais os $ktempos (random 2)que serão executados Get-Random -Maximum 2(ou seja, a 0ou a 1). Tudo isso é deixado no pipeline e a saída é implícita.


1

CJam, 10 bytes

{f{2mr*+}}

Espera a matriz e o número no topo da pilha nessa ordem e os substitui pela nova matriz.

Teste aqui.


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}

por exemplo

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

De maneira mais geral, onde fpode ser passado como argumento para 16 caracteres

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

por exemplo

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

Bom, incluindo uma versão geral!
Conor O'Brien

1

Python 3 152 110 98 bytes

Esta é a minha primeira solução de código de golfe, então não conheço nenhum truque. Eu testei isso usando uma função principal com casos de teste. O tamanho do arquivo é apenas essa função.

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

Obrigado a @ Cᴏɴᴏʀ O'Bʀɪᴇɴ pelo conselho sobre a remoção de espaços em branco. Elogios adicionais a @undergroundmonorail por conselhos que salvaram 12 bytes.


1
Eu conto 145 bytes. Você pode golfe-lo removendo espaços em branco desnecessários, como entre import *, a(x, y), x[ptr]=z+y, etc. Você também pode substituir os 4 espaços com um único espaço
Conor O'Brien

Você pode colocar x[ptr]=z+yna mesma linha if random()>0.5para salvar 3 bytes de espaço em branco. No python 2, 0.5pode-se escrever .5para salvar um byte, mas não sei se isso é verdade no python 3. Se você renomear ptrpara, pvocê salvará 6 bytes ao todo. Além disso, você está no Windows? O Windows armazena novas linhas como dois bytes, mas como o python não se importa se a nova linha é de um ou dois bytes, você pode contá-la como 1, tornando sua solução atual apenas 103 bytes. A propósito, bem-vindo ao PPCG :) #
undergroundmonorail

1

Clojure, 32 bytes

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

Obrigado David pela rand-intideia, definitivamente mais curto que a if(>(rand)0.5)abordagem. Aqui forbatemap .


0

Oitava, 28 bytes

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

Amostra executada em ideone .



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

Notas

  • A reflexão tardia do loop também pode ser seu corpo, não há diferença de tamanho.
  • A matriz de entrada é modificada, mas a instrução não contém uma restrição sobre esse problema. Se você contar a matriz modificada como uma forma de "Saída / retorno", poderá remover outros 9 bytes removendo return A;. O tipo de retorno precisaria ser alterado de int[]para void. No entanto, isso não salva bytes adicionais, pois é necessário um espaço adicional entre voide r.

Versão mais curta (conforme mencionado na nota), 75 bytes

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

Resultado

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

Sua segunda versão não é válida, não gera nem retorna nada.
Bálint

1
Por favor, leia o meu post ...
Marv

0

Mathcad, bytes

insira a descrição da imagem aqui


Ainda não há uma contagem formal de bytes como protocolo de contagem do Mathcad a ser decidido.


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 salvos graças a @TimmyD


@ TimmyD As regras dizem que você precisa produzi-lo. E essa regra não era assim, quando escrevi a resposta
Bálint

Eu acredito que você pode remover o espaço depois main, String[], int[], e salvar mais alguns bytes, alterando nextFloat()>0.5a next(1)==0.
Fund Monica's Lawsuit

@QPaysTaxes Eu já mudo new java.util.Random().nextFloat()para Math.random(), pois é muito mais curto.
Bálint

@TimmyD não viu que, graças
Bálint

Isso não funciona no estado atual. Você não modifica s, apenas o imétodo tem tipo de retorno, voidmas você está tentando retornar int[]. Também há um ponto e vírgula ausente depois return s.
Marv

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.