Пробігся через масив


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.
Балінт

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 зміна банальна, це був просто гольфіст. Я не думав, що це мається на увазі, що це потрібно, просто те, що поведінка однакова. Я додам версію з fp і попрошу OP.
FryAmTheEggman

@KennyLau, що робити з мовами без плаваючих точок?
Вен

@FryAmTheEggman Так, це був лише приклад - однакова ймовірність нормальна.
Conor O'Brien

@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

@ Bálint Сюжет згущується, хто такий Денніс? lol
MonkeyZeus

13
@MonkeyZeus Ahem.
Денніс

1
@Dennis Пророцтво виконано ┗ (⊙ .⊙) ┛
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. Мапуйте ( ®) через масив і до кожного елемента додайте Vпомножене на Mq, що генерує випадковим чином 0або 1. Неявний вихід результуючого масиву.



2

Джулія, 33 29 27 байт

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

Це анонімна функція, яка приймає масив із внутрішньою анонімною функцією, яка приймає ціле число та повертає масив. Щоб його зателефонувати, призначте його змінній та схожий дзвінок 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-байтна версія, коли для використання випадкових операцій float потрібна:

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

Ну цілком правильний, приємний спосіб уникнути множення. Це означає, що вимога з плаваючою крапкою була вилучена, і ви можете замість цього змінити свою відповідь.
FryAmTheEggman

@FryAmTheEggman О, ха-ха, я не помітив. Зробимо це зараз, спасибі :)
undergroundmonorail

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

@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

k (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

Приємно, включаючи загальну версію!
Conor O'Brien

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

Безумовно

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
Будь ласка , прочитайте мій пост ...
Марв

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 Правила говорять, що потрібно вивести його. І це правило було не таким, коли я написав відповідь
Балінт

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

@QPaysTaxes я вже змінити new java.util.Random().nextFloat()до Math.random(), так як це набагато набагато коротше.
Балінт

@TimmyD Не бачив цього, дякую
Bálint

Це не працює в його нинішньому стані. Ви не змінюєте s, лише iметод має тип повернення, voidале ви намагаєтесь повернути його int[]. Також відсутня крапка з комою return s.
Марв

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.