Кот снова съел ваш вклад!


30

Создайте программу cat, то есть программу, которая принимает входные данные и печатает их.

... Кроме того, программа будет случайным образом забирать символы из вашего ввода и печатать их вместо этого.

Каждый символ на входе должен иметь равные шансы для удаления с помощью программы, хотя, поскольку это трудно сделать, шансы для каждого символа могут варьироваться не более чем на 10%.

Ваша программа должна принять ввод, затем случайным образом удалить символы из ввода, а затем снова распечатать эту версию. (Вы можете печатать с последующими символами новой строки или другими символами, если ваш язык должен печатать символы новой строки.)

Если вход был BOOOWL, он не должен удалять все Os с равной вероятностью: каждый символ (не уникальный) должен рассматриваться, поэтому вместо каждого объединенного O, имеющего шанс 1/5 (например), каждый O должен иметь 1 / 5 шансов, так что , вместо того , чтобы там быть 1/5 шанс BWL, должно быть 1/5 шанс BOWL, BOOWL.

Вход ограничен STDIN или ближайшим эквивалентом.

Каждый персонаж должен иметь минимум 10% и максимум 30% вероятности быть удаленным.

Шансы каждого персонажа должны рассчитываться индивидуально.

Вы можете использовать любой компонент вашего языка, поддерживающий случайные действия, будь то функции или что-то другое.

Вывод должен быть через STDOUT или ближайший эквивалент. Если на вашем языке есть STDOUT, не выводите другим способом. Если ваш язык не может выводить строки в виде текста, используйте ближайший эквивалент (вывод массива символов C в порядке).

Это код гольф. Кратчайшая программа выигрывает.


4
Всегда ли должен быть от 10% до 30% шанс на удаление определенного персонажа? Или это только для примера?
attinat

2
что вы подразумеваете под "наборы одного персонажа"? если входные данные BOWL OF SOUPмогут Oбыть удалены все за один раз?
Роблогия

1
все ответы до сих пор используют фиксированный 20% шанс на удаление персонажа. Я не уверен, что вопрос заключается в том, чтобы у всех персонажей были одинаковые шансы.
Nzall

3
Output must be through STDOUT, as a text. Do not output a character array.<- у меня есть язык, который позволяет выводить массив символов (он выравнивается перед выводом). Это запрещено? Как насчет языков, таких как C, где строка - это в основном массив символов?
Исмаэль Мигель

1
Используйте ближайший эквивалент. Строки массива символов C в порядке, так как они являются наиболее близким эквивалентом текста.
Андрей

Ответы:


10

Japt -f , 2 байта

-fФлаг «запускает программу по каждому элементу в первом входе, выводит массив тех , которые возвращают значение truthy.» возвращает случайное число от 0 (включительно) до 5 (исключая). Как и JavaScript, 0 - это ложь в Japt.

Попытайся


2
Я возвращаюсь назад во времени, делаю язык, где o - это вызов, а затем возвращаюсь и отправляю свой ответ, или, возможно, создаю пустую строку, которая: p
Эндрю

Разве флаги командной строки не должны учитываться в байтах?
Даниэль Вестол

1
@ DanielVestøl Нажмите на -f, в заголовке.
Исмаэль Мигель


1
была шутка, но хорошо
Андрей

8

Python 3 , 63 байта

from random import*
for c in input():print(end=c[random()<.2:])

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

Python 2 , 67 65 байт

from random import*
print''.join(c for c in input()if.8>random())

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

Каждый персонаж с вероятностью 20% быть сброшенным.

Другой подход, одинаковая длина:

from random import*
print''.join(c[random()<.2:]for c in input())

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


63 байта в Python 2 с функцией
attinat

Правила прямо заявляют, что написать полную программу:Create a cat program, a.k.a a program that takes an input and prints it.
movatica

Это только читает первую строку ввода.
AKX

Проблема не утверждает, что он должен был прочитать несколько строк.
моватика

8

Древесный уголь , 4 байта

ΦS‽⁵

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

 S      Input a string
Φ       Filter where nonzero
  ‽⁵    Random number 0..4
        Implicitly print

Вы можете использовать любое число от 4до, 10чтобы получить шансы 25%на 10%соответственно.


7

Befunge-98 (PyFunge) , 11 байт

>#@~3j4???,

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

Каждый персонаж имеет 25% шанс быть удаленным. Это решение принято по трем ?инструкциям.

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

Есть два выхода из леса ?s: направо (вывод) и налево (нет вывода). Эта ситуация является симметричной, так что если начиная с середины ?, существует p2=1/2 вероятность вывода. Вероятность вывода , если начиная справа ?является p3=1/21+1/2p2=3/4 . Поэтому после прочтения символа мы переходим к крайнему правому краю, ?чтобы определить, выводить или нет.


5

октава , 23 байта

Создает массив того же размера, что и входные данные (строки в Octave являются символьными массивами), проверяет каждое из случайных чисел, превышает ли оно значение, 0.2и затем использует логическое индексирование для извлечения символов в соответствующих позициях.

@(s)s(rand(size(s))>.2)

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


5

Желе , 9 5 байт

5X’µƇ

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

Монада, которая принимает строку Jelly в качестве аргумента и возвращает обработанную строку Jelly. При использовании в качестве полной программы неявно печатает вывод. Каждый персонаж имеет 20% шанс быть удаленным.

объяснение

   µƇ | Filter using the following as a monad for each character:
5X    | - Random number between 1 and 5
  ’   | - Decreased by 1

5

Japt , 3 байта

Каждый персонаж имеет шанс 1 к 5 быть удаленным. 5Может быть изменен ни к чему между 4& 9, включительно, или Aдля , 10чтобы изменить шансы.

Æ5ö

Попытайся

Æ5ö     :Implicit input of string
Æ       :Filter by
 5ö     :  Random integer in the range [0,5), with 0 being falsey


5

05AB1E , 5 4 байта

ʒ₄Ω≠

-1 байт благодаря @Grimy .

Попробуйте онлайн или запустите ту же программу 10 раз .

Каждый персонаж имеет 25% -ое изменение выпадения.

Объяснение:

ʒ     # Filter the characters of the (implicit) input-string by:
     #  Push 1000
  Ω   #  Pop and push a random digit from it
     #  And check that it's NOT 1 (!=1)
      # (after which the result is output implicitly)

также может быть _( ==0).


2
5Lможет быть для -1 (изменяет шанс с 20% до 25%, что все еще приемлемо).
Grimmy

@ Грими Хороший, спасибо! :)
Кевин Круйссен

4

MATL , 9 байт

t&n&r.2>)

Exaplanation:

t         implicitly take input and duplicate it
 &n       compute the size of the input and...
   &r     generate a random array of that size
     .2>  check which entries of that array are greater than 0.2
        ) and use the result using logical indices to extract certain characters of the input

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


4

Pyth , 8 5 байтов

sfO4Q

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

sfO4Q   Implicit: Q=eval(input())
 f  Q   Filter characters of Q where the following is truthy:
  O4      Random number in the range [0-4)
          Any non-zero value is truthy, so this will drop characters 25% of the time
s       Concatenate into string, implicit print

Предыдущая версия, 8 байт:

s*Vm!!O4

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

s*Vm!!O4QQ   Implicit: Q=eval(input())
             Trailing QQ inferred
   m    Q    Map each character in Q using:
      O4       Choose random integer in [0-4)
    !!         Logical NOT twice - maps 0 to 0, anything else to 1
             The result is a list of 0s and 1s, with 0 having 25% chance to appear
 *V      Q   Vectorised multiplication of the above with Q
s            Concatenate into string, implicit print

Qвыдаст ошибку, если ввод не python-esque. Ошибки например от [1или a/b. Q, wи zбудет работать только для однострочного ввода, поэтому, вероятно, лучшим вариантом будетj.z
ar4093

4

Cubix , 20 байтов

u$w\A|UDw@?;...>o._U

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

Дольше, чем я надеялся, так как у меня было много неактивных операций, от которых я не могу избавиться. Шанс уронить персонажа составляет 25%. Я полагаю, это нормально.

    u $
    w \
A | U D w @ ? ;
. . . > o . _ U
    . .
    . .

Смотреть это беги

Краткое объяснение:

  • A|A это инициализирует стек, вводит все, отражает обратно, вводит все (только EOI -1)
  • ;? поп в стек, тест на EOI (-1).
  • _?@ если отрицательный, отразить обратно в тест и закончить при остановке
  • $Dпрыгать \в случайном направлении установщика.
    • от установщика направления 3 направления ведут к oвыходу for, затем обратно в цикл, один пропускает oего путь и идет прямо в цикл.

3

APL (dzaima / APL) , 10 9 байтов SBCS

Функция анонимного молчаливого префикса. Каждый персонаж имеет точно 20% шанс быть удаленным.

⊢⌿⍨4≥∘?5¨

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

 ноль для каждого символа

? диапазон случайных целых чисел 1–5 для каждого символа

4≥ Булева маска для тех целых чисел, которые меньше или равны 4

⊢⌿⍨ фильтровать аргумент, используя эту маску


3

Сетчатка , 15 байт

/./_?(`.







Попробуйте онлайн! Объяснение:

/./_

Обработайте каждого персонажа индивидуально.

?(`

Произведите замену наугад. Первая замена удаляет символ, в то время как остальные три оставляют его без изменений, что дает 25%возможность удалить символ. Это может быть уменьшено по мере необходимости, добавляя дополнительные пары новых строк.


3

R , 32 23 байта

function(x)x[rt(x,3)<1]

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

Функция, принимающая вектор символов в качестве входных данных и возвращающая обработанный символьный вектор. Каждый персонаж имеет 20% шанс быть удаленным.

Спасибо @Roland и @Giueseppe за помощь в сохранении 7 байтов и @JDL за еще 2!


1
function(x)x[!rbinom(x,1,0.2)]
Роланд

по той же схеме , как @Roland, function(x)x[rf(x,1,1)>1]; df(1,1,1)о том, 0.16что делает трюк.
Джузеппе

или rt(x,3)>1(с вероятностью около 20%)
JDL

2
@JDL это так <1, но спасибо! Еще 2 сохранено.
Ник Кеннеди

3

T-SQL 2012, 83 байта

Циклический ввод справа налево, удаление 0 или 1 символа.

25% -й шанс на удаление каждого персонажа.

DECLARE @i varchar(max)='The cat ate my homework'

DECLARE @ int=len(@i)WHILE @>0SELECT
@i=stuff(@i,@,str(rand()*2)/2,''),@-=1PRINT @i

Объяснение:

rand()*2 возвращает число с плавающей запятой, которое нельзя использовать в stuff команде.

strПреобразует это в VARCHAR после округления до ближайшего целого числа. Поплавок конвертируется в varchar (который не разрешен в качестве третьего параметра вstuff ).

Этот varchar имеет шанс 25% быть '2', шанс 50% быть '1', шанс 25% быть '0'. Деление на 2, с вероятностью 25% результат равен 1. Это деление превращает varchar в целое число.

Целое число - это ожидаемый третий параметр в stuffфункции.

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


Очень хороший трюк STR, мне придется запомнить это. Не уверен, что это справедливо - использовать ваш (не учтенный) DECLAREв вашем (подсчитанном) коде; но изменение этого будет стоить вам всего 1 байт, так как вы можете устранить лишнее SETс помощьюDECLARE @ INT=len(@i)
BradC

@BradC Я согласен, и я постараюсь помнить, чтобы не
совмещать

2

J , 10 байт

#~5>6?@$~#

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

Аналогично ответу Адама на APL, хотя я и написал его, прежде чем посмотреть на его.

  • 6.. $~ #Возьмите длину ввода #и сформируйте $~число 6 в этот длинный список.
  • ?@Рассматривайте каждую шестерку в этом списке как кубик и бросайте ?его.
  • >5Является ли матрица меньше 5 (возможные значения 0..5)? Используйте этот логический результат для создания битовой маски.
  • #~ Отфильтруйте вход с этой маской.


2

Javascript,  46   44  51 байт

i=>alert([...i].filter(c=>Math.random()>.2).join``)

+7 байт из-за добавленного требования STDOUT

-2 байта спасибо Бирджолаксеву


оригинальный ответ: 44 байта без требования STDOUT

i=>[...i].filter(c=>Math.random()>.2).join``

Поскольку вы не используете имя функции, вы можете просто предоставить саму функцию . Удаление f=приводит к уменьшению до 44 байтов. Вы также можете вводить / выводить как массив, что должно немного сэкономить.
Биржолаксев

@Birjolaxew Я не уверен, но, насколько я понимаю, этот вопрос запрещает использование массива char, если в языке есть строка
jonatjano

Да, Андрей отредактировал вопрос с дополнительными требованиями после моего комментария. Это, как правило, вызывает недовольство, поскольку оно делает недействительными ответы, которые были ранее действительными (в этом случае даже можно обсуждать, соответствует ли ваш первоначальный ответ требованию «Вывод должен быть выполнен через STDOUT»).
Биржолаксев

Что join``значит? Не могу найти его в спецификации (потому что я действительно не знаю, что это)
Ник Зоум

1
@nickzoum в es6 это эквивалентноjoin("") mdn revelent page
jonatjano

2

Scala , 51 46 30 байт

s=>s.flatMap(x=>if(math.random>.2)Some(x)else None)

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

PS. Как и во многих других решениях, вероятность выпадения полукокса составляет 20%.

Обновить:

-5 байт, используя String вместо Option [String] в flatMap

s=>s.flatMap(x=>if(math.random>.2)x+""else "")

30 байт с использованием фильтра

s=>s.filter(x=>math.random>.2)

1
Вы можете сбрить 7 байт путем изменения scala.math.randomв math.randomи 0.2к .2. Хороший трюк, использующий ^ как этот.
Кжетил С.

@ KjetilS, спасибо. Я также разместил функциональные литералы вместо определения функций в качестве решения. Это приемлемо в соответствии с этим: codegolf.stackexchange.com/questions/3885/…
д-р Y Wit

2

C # (интерактивный компилятор Visual C #) , 71 байт

var y=new Random();foreach(var k in ReadLine())if(y.Next(5)<4)Write(k);

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


Я думаю, что <1 ест слишком много. Возможно, <3 или <4 соответствует параметрам задачи. В любом случае это не меняет длину кода.
Лука

Я давно не программировал на C #, но почему это new Random().Next(5)невозможно?
Кевин Круйссен

1
@KevinCruijssen Потому что тогда для каждого номера будет использоваться одно и то же семя, поэтому каждое число будет одинаковым. Просто попробуйте new Random().Next(5), все, что вы получите, это весь ввод или ничего.
воплощение невежества

1
@KevinCruijssen при использовании new Random(), начальное значение по умолчанию - Environment.TickCount, которое увеличивается каждую миллисекунду. Если они все созданы в одном и том же миллисекундном тике, у них будет одинаковое начальное число. В ответе используется только один экземпляр Random, и когда он вызывается, он обновляет внутреннее начальное значение - поэтому каждый раз, когда вызывается Next (), он создает другое выходное значение. Однако .Net Core использует одноэлементный ГСЧ для генерации начального числа, поэтому у него нет этой проблемы
Зак Фарагер

1
@BenjaminUrquhart Исправлено, но добавлено 26 байт. Кроме того, можно утверждать, что входные данные не должны быть из STDIN, но restricted to STDIN or closest equivalentаргументы функций могут быть ближайшим эквивалентом, но я не собираюсь этого делать
Embodiment of Ignorance


1

C (GCC) , 50 байтов

Эта программа с 20% -ной вероятностью выбросит письмо. К сожалению, генератор случайных чисел не засеян, поэтому вы получаете одну и ту же последовательность при каждом запуске. По сути, единственный трюк - инвертировать входной символ, чтобы остановить цикл в EOF.

main(c){for(;c=~getchar();rand()%5&&putchar(~c));}

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

C (gcc) , 64 59 байт

Благодаря потолку catcat за -5 байтов.

Если вы хотите, чтобы RNG высевался при каждом запуске.

main(c){for(srand(&c);c=~getchar();rand()%5&&putchar(~c));}

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


Вам не нужно использовать main()для представления Code Golf, вы также можете определить произвольную функцию, которая делает то, что требуется. Так что вы можете написать f(c){...}.
Г. Слипен

1

Луа , 69 68 байт

for c in io.lines(nil,1)do io.write(math.random()>.2 and c or '')end

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

Вроде простая, но, похоже, самая короткая версия: перебираем stdin char за char (с io.lines … это имя вводит в заблуждение), затем на основе случайного значения выведите одну или пустую строку (например, ничего).


1

Джава

Не прекращается: 82 байта

v->{for(int i;;i=System.in.read(),System.out.print(Math.random()<.2?"":(char)i));}

Завершение (TIO): 105 байт

v->{var n=System.in;for(int i;n.available()>0;i=n.read(),System.out.print(Math.random()<.2?"":(char)i));}

Действительно ли нужно иметь дело с stdout? Другие ответы только создают функцию, просто конвертирующую строку. Кажется несправедливым по отношению к Java. Если это решение C # является действительным, то s->s.filter(c->Math.random()<.2)тоже.
Хольгер

@ Холгер Input is restricted to STDIN or closest equivalent.и Output must be through STDOUT or the closest equivalent. If your language does have STDOUT, do not output in any other way.так нет, этот ответ недействителен
Бенджамин Уркхарт

1

Zsh , 53 41 байт

-12 , благодаря GammaFunction

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

Преобразует входные данные в массив символов, затем пытается распечатать каждый элемент c, если только он не будет получен ((RANDOM%4))оценкой в ​​значение false!

for c (${(s::)1})((RANDOM%4))&&echo $c\\c

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

Более простая, но многословная итерация по длине строки.

for ((;i<$#1;i++)){((RANDOM%4>0))&&echo "${1[i]}\c";}

1
Умное использование \c, я бы не вспомнил об этом! Еще предстоит сделать несколько оптимизаций ...
GammaFunction

Хорошее, умное использование RANDOMи преобразование массива
roblogic

1

Zsh , 50 байтов

for c (${(s::)"$(<&0)"})
((RANDOM%5))&&echo -nE $c

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

Аналогичен ответу RobLogic, но более точно следует требованиям ввода и работает для входов с обратной косой чертой.

"$(<&0)"вместо "<&0"или $(<&0)потому что первый не работает в подстановках, а второй ест новые строки. Эти -nEфлаги необходимы , чтобы предотвратить обратную косую черту от быть разобрано как управляющие последовательности, а также для предотвращения новой строки вставляется.

echo -nE


1

MathGolf , 5 байтов

æƒ√∞*

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

объяснение

æ       foreach character...
 ƒ      random float in range [0,1)
  √     take square root (making P(x < 0.5) = 0.25)
   ∞    pop a, push 2*a
    *   repeat character int(x) times

Каждый символ будет повторяться 0 или 1 раз, в зависимости от случайного значения. Поскольку ожидаемое значение после смещения квадратного корня смещается на 25%, вероятность удаления каждого символа равна 25%.

Альтернатива 5-ти байтовая

gÉ;4w

Отфильтруйте символы по случайному числу в [0, 4]. Из-за того, как работает фильтрация, я должен отбросить фактический символ в цикле фильтра, который добавляет 1 байт.


0

GFortran , 120 байт

Неплохо, если мы используем устаревшую RAN()функцию, которая является псевдослучайной , то есть вы получаете одну и ту же последовательность каждый раз. Правильный способ для генерации случайных чисел в GFortran есть с CALL RANDOM_SEED()и , CALL RANDOM_NUMBER(R)но это много байт!

character(99)S;read(*,'(A)')S;do i=1,len_trim(S)
if(ran(0)*5.gt.1)then;write(*,'(A)',advance="no")S(i:i)
endif;enddo;end

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


1
Допускается псевдослучайность, если это самый близкий способ заставить случайные действия вступить в силу.
Андрей

0

Oracle SQL, 133 байта

select listagg(decode(sign(dbms_random.value-0.2),1,substr(x,level,1)))within group(order by level)from t connect by level<=length(x)

Он работает с предположением, что входные данные хранятся в таблице t (x), например

with t(x) as (select 'The cat ate my homework' from dual)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.