Запустить через массив


13

Мы все часто слышим идиому «пройтись по массиву», означающую «сопоставить функцию со следующим массивом». Однако мне нужно, чтобы это было сделано (сейчас!), Поэтому я хочу, чтобы вы пробежались по массиву.

Как я бегу?

Представь, что позади тебя дикая стая волков

Пробежка по массиву похожа на пробежку по нему, за исключением того, что вы можете пропустить элементы. Да, это иногда грязно, но это (как правило) работает. «Какие элементы пропущены?», Спросите вы. Ну, это сделано наугад. Давайте пройдемся по пробежке по массиву!

  1. Позвольте eбыть текущим элементом.
  2. Пусть randomгенерирует случайное число с плавающей точкой [0,1). Если random() < 0.5, тогда вы переходите к следующему элементу, а затем к шагу 1. (Вы можете сгенерировать число другими способами, при условии, что их (в идеале) равные шансы пропустить и остаться. Например, вы можете использовать выбор элемента из двух членов установить и выполнить действие в зависимости от результата.)
  3. В противном случае вы выполняете функцию fна e.

Задача

Учитывая массив / список / строку, как и любой, Aи число K, бегите через массив, добавляя Kк каждому доступному члену. Вывести / вернуть этот массив. Aбудет содержать только неотрицательные целые числа и Kвсегда будет неотрицательными целыми числами. Это , поэтому выигрывает самая короткая программа в байтах.

Контрольные примеры (примеры)

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)опечатка? Еще 2, чтобы пойти ...
Лысая банта

5
Должен ли случайный выбор быть определен путем сравнения с плавающей запятой, или мы можем выбрать случайным образом?
Алекс А.

Могу ли я опубликовать программу или это может быть функция? Это делает очень различий в Java.
Bálint

1
@epicTCK Это означает полуоткрытый интервал, то есть действительное число, xтакое что 0 ≤ x < 1.
Мартин Эндер

1
@ Bálint Обе записи существуют.
Мартин Эндер

Ответы:


3

Пиф, 7

m+*O2vz

Попробуй здесь

Использует случайный выбор вместо сравнения с плавающей запятой, но должен быть неразличимым.

Расширение:

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]

Использование плавающей запятой:

m+*<.5O0vz

Попробуй здесь


2
с плавающей запятой с плавающей запятой> :(
Leaky Nun

1
@KennyLau изменение тривиально, это было просто в гольф. Я не думал, что это означало, что это требовалось, просто то же самое поведение. Я добавлю версию с фп и спрошу ОП.
FryAmTheEggman

@KennyLau как насчет языков без плавающей запятой?
Ven

@FryAmTheEggman Да, это был просто пример - равная вероятность - это хорошо.
Конор О'Брайен

@KennyLau ОП подтвердил, что с плавающей запятой нет необходимости.
Алекс А.

5

Clojure, 41 37 байт

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

Отбил пару байтов умножением на 0 или 1 и отбрасыванием «если». Благодарим большинство всех других участников!


В этом случае будет достаточно анонимной функции, но хороший ответ; Добро пожаловать в PPCG!
кот

Во много раз forкороче map, см. Мой ответ для справки :) Также он позволяет избежать внутренней анонимной функции, поэтому вместо запуска кода (fn[a k]вы можете использовать #(.
NikoNyrh

4

Желе, 9 8 7 байт

От 8до 7благодаря @FryAmTheEggman .

+2X’¤¡€

Попробуйте онлайн!

объяснение

+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 вы успешно пользуетесь клавиатурой на этом языке ?!
MonkeyZeus

@MonkeyZeus Деннис сказал, что это может быть введено в Linux с помощью обычной клавиатуры.
Белинт

@ Bálint Сюжет сгущается, кто такой Денис? LOL
MonkeyZeus

13
@MonkeyZeus Гм.
Деннис

1
@ Денис Пророчество сбылось ┗ (⊙ .⊙) ┛
MonkeyZeus

3

MATL , 11 байт

tZy1$rEki*+

Использует случайные числа с плавающей запятой.

Попробуйте онлайн!

объяснение

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
Печатается с телефона. Объяснение позже
Луис Мендо

@CatsAreFluffy :-) Готово!
Луис Мендо

3

Japt, 6 байт

®+V*Mq

Проверь это


объяснение

Неявный ввод массива Uи целого числа V. Map ( ®) над массивом и, к каждому элементу, добавить Vумноженное на Mq, что случайным образом генерирует либо 0или 1. Неявный вывод результирующего массива.



2

Юлия, 33 29 27 байт

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

Это анонимная функция, которая принимает массив с внутренней анонимной функцией, которая принимает целое число и возвращает массив. Чтобы вызвать его, назначьте его переменной и вызовите like f(x)(k).

Мы генерируем массив такой же длины, что и входной массив, состоящий из нулей и случайным образом выбранных с равной вероятностью. Мы умножаем это на входное целое число и добавляем это во входной массив.

Попробуйте онлайн!

Сохранено 2 байта благодаря Денису!


2

Python 2, 60 58 байт

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

Эта программа оказалась действительно простой. Там не так много трюков в гольфе, кроме очевидного " from module import*", использующего лямбду вместо обычной функции и общего недостатка пробелов. Кроме этого это на самом деле довольно идиоматично. Если бы я писал это по-настоящему, я бы сделал это очень похожим образом:

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

Или, может быть, что-то более причудливое:

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

Но хватит хвастаться :)

Это старая 60-байтовая версия, когда при использовании плавающей запятой для случайности требовалось:

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

Для каждого элемента списка добавьте k*(random()<.5). Булево значение Python оценивается как 0 и 1, так что это добавляет 0 к любым элементам, для которых условие не выполняется.

random.random()Возвращает Python [0, 1), поэтому мне не пришлось об этом беспокоиться.


1
@FryAmTheEggman Если требование с плавающей запятой отброшено, лучшее, что я могу выяснить, это полностью забыть трюк умножения и выполнитьe+choice([0,k])
андерграундмонорельс

Ах, совершенно верно, хороший способ избежать умножения. При этом требование с плавающей запятой было удалено, поэтому вы можете изменить свой ответ на него.
FryAmTheEggman

@FryAmTheEggman О, ха-ха, я не заметил. Я сделаю это сейчас, спасибо :)
подземный

1

JavaScript (ES6), 38 байт

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


Я хочу принять участие в конкурсе и ... JavaScript взят. Серьезно, я выучу унар.
Bálint

@ Балинт, я уверен, что унарный не может генерировать случайные поплавки
подземный

@undergroundmonorail Я сказал это, потому что никто не использует его (по понятным причинам, например, его нельзя публиковать здесь, потому что он становится слишком длинным)
Bálint

1

PowerShell v2 +, 34 байта

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

Принимает входной сигнал $aи $kмассив и INT соответственно. Затем мы перебираем массив и каждая итерация цикла выдает текущий элемент плюс $kвремя, (random 2)которое будет выполнено Get-Random -Maximum 2(т. Е. A 0или a 1). Все они остаются в конвейере и выводятся в виде неявного массива.




1

к (12 байт)

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

например

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

В более общем случае, где fможно передать в качестве аргумента 16 символов

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

например

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

Ницца, в том числе общая версия!
Конор О'Брайен

1

Python 3 152 110 98 байт

Это мое первое решение для игры в гольф, поэтому я не знаю никаких хитростей. Я проверил это, используя основную функцию с тестовыми примерами. Размер файла - только эта функция.

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

Спасибо @ Cᴏɴᴏʀ O'Bʀɪᴇɴ за совет по удалению пробелов. Дополнительная похвала @undergroundmonorail за совет, который сэкономил 12 байтов.


1
Я считаю 145 байтов. Вы можете играть в гольф, удалив ненужные пробелы, например, между import *, a(x, y), x[ptr]=z+yи т.д. Вы можете также заменить 4 пространства с одним пробелом
Конор О'Брайен

Вы можете поставить x[ptr]=z+yв ту же строку, что и if random()>0.5для сохранения 3 байта пробела. В Python 2 0.5можно написать как .5для сохранения байта, хотя я не знаю, правда ли это в Python 3. Если переименовать ptrв pвас спасу 6 байт во всем. Кроме того, вы на Windows? Windows хранит символы новой строки в виде двух байтов, но поскольку python не заботится о том, является ли символ новой строки одним или двумя байтами, вы можете считать его как 1, что делает ваше текущее решение только 103 байтами. Кстати, добро пожаловать в PPCG :)
подземный

1

Clojure, 32 байта

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

Спасибо тебе, Дэвид, за rand-intидею, определенно короче, чем if(>(rand)0.5)подход. Здесь forбьет map.




0

Java, 84 байта

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

Примечания

  • Задним числом цикла также может быть его тело, разницы в размерах нет.
  • Входной массив изменен, но инструкция не содержит ограничения в отношении этой проблемы. Если бы вы считали измененный массив как форму «Вывод / возврат», вы могли бы сбрить еще 9 байтов, удалив return A;. Тип возврата должен быть изменен с int[]на void. Это, однако, не сохраняет дополнительные байты, так как между voidи r.

Укороченная версия (как указано в примечании), 75 байт

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

Выход

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

Ваша вторая версия недействительна, она не выводит и не возвращает ничего.
Балтин

1
Пожалуйста, прочитайте мой пост ...
Marv

0

Mathcad, байты

введите описание изображения здесь


Официальный подсчет байтов в качестве протокола подсчета Mathcad еще не определен.


0

Java 108 107 85 82 байта

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

14 байтов сохранено благодаря @TimmyD


@TimmyD Правила говорят, что вам нужно вывести его. И это правило не было таким, когда я написал ответ
Bálint

Я считаю , что вы можете удалить пробел после main, String[], int[]и сохранить еще несколько байтов, изменяя nextFloat()>0.5к next(1)==0.
Фонд Моника иск

@QPaysTaxes я уже изменить new java.util.Random().nextFloat()к Math.random(), так как это намного намного короче.
Белинт

@TimmyD Не видел, спасибо
Балинт

Это не работает в его текущем состоянии. Вы не изменяете s, только iметод имеет тип возвращаемого значения, voidно вы пытаетесь его вернуть int[]. Также есть точка с запятой, пропущенная после return s.
Марв

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.