Kot ponownie zjadł twój wkład!


30

Utwórz program cat, czyli program, który pobiera dane wejściowe i drukuje je.

... Z wyjątkiem tego, że program losowo odbierze znaki od tekstu i wydrukuje je.

Każda postać na wejściu powinna mieć jednakowo równe szanse na usunięcie z programem, ponieważ trudno to zrobić, szanse dla każdej postaci mogą się różnić maksymalnie o 10%.

Twój program powinien pobrać dane wejściowe, a następnie losowo usunąć z nich znaki, a następnie ponownie wydrukować tę wersję. (Możesz drukować z końcowymi znakami nowej linii lub innymi znakami na wypadek, gdyby Twój język musiał drukować znaki nowej linii).

Jeśli dane wejściowe BOOOWLbyłyby, nie powinno to usuwać wszystkich Os z równą szansą: każda postać (nie unikalna) powinna być brana pod uwagę, więc zamiast każdego O połączonego z szansą 1/5 (na przykład), każdy O powinien mieć 1 / 5 szansa, więc, zamiast tam będąc 1/5 szansa BWL, nie powinno być 1/5 szansa BOWL, BOOWL.

Dane wejściowe są ograniczone do STDIN lub najbliższego odpowiednika.

Każda postać musi mieć minimum 10% i maksimum 30% szans na usunięcie.

Szanse każdej postaci należy obliczać indywidualnie.

Możesz użyć dowolnego elementu swojego języka obsługującego akcje losowe, niezależnie od tego, czy jest to funkcja czy coś innego.

Dane wyjściowe muszą być przesyłane przez STDOUT lub najbliższy odpowiednik. Jeśli twój język ma STDOUT, nie wysyłaj w żaden inny sposób. Jeśli twój język nie może wyprowadzać ciągów jako tekstu, użyj najbliższego odpowiednika (tutaj wyjście z tablicy znaków C jest OK).

To jest kod golfowy. Najkrótszy program wygrywa.


4
Czy zawsze powinna istnieć od 10% do 30% szans na usunięcie określonej postaci? Czy to tylko na potrzeby przykładu?
attinat

2
co rozumiesz przez „zestawy jednej postaci”? jeśli dane wejściowe BOWL OF SOUPmogą Obyć usunięte za jednym razem?
roblogic

1
wszystkie dotychczasowe odpowiedzi mają ustaloną 20% szansę na usunięcie postaci. Nie jestem pewien, czy celem pytania jest, aby wszystkie postacie miały takie same szanse.
Nzall,

3
Output must be through STDOUT, as a text. Do not output a character array.<- Mam język, który pozwala wypisać tablicę znaków (jest spłaszczona przed wyjściem). Czy to jest niedozwolone? Co powiesz na języki takie jak C, gdzie ciąg znaków jest w zasadzie tablicą znaków?
Ismael Miguel

1
Użyj najbliższego odpowiednika. Ciągi znaków w tablicy C są OK, ponieważ są najbliższym odpowiednikiem tekstu.
Andrew

Odpowiedzi:


10

Japt -f , 2 bajty

-fFlaga „uruchamia program na każdym elemencie w pierwszym wejściu, wyprowadzanie tablicę tych, które zwracają wartość truthy”. zwraca losową liczbę od 0 (włącznie) do 5 (wyłącznie). Podobnie jak JavaScript, 0 jest fałszem w Japt.

Spróbuj


2
Cofam się w czasie, tworzę język, w którym o to wyzwanie, a następnie wracam i przesyłam odpowiedź, a może robię pusty ciąg, który: p
Andrew

Czy flagi linii poleceń nie powinny się liczyć do bajtecount?
Daniel Vestøl

1
@ DanielVestøl Kliknij -f, w tytule.
Ismael Miguel

1
@Andrew Używanie
Jo King

1
był żart, ale ok
Andrew

8

Python 3 , 63 bajty

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

Wypróbuj online!

Python 2 , 67 65 bajtów

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

Wypróbuj online!

Każda postać ma 20% szans na upuszczenie.

Inne podejście, ta sama długość:

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

Wypróbuj online!


63 bajty w python 2 z funkcją
attinat

Reguły wyraźnie mówią o napisaniu pełnego programu:Create a cat program, a.k.a a program that takes an input and prints it.
movatica

Odczytuje to tylko pierwszy wiersz danych wejściowych.
AKX

Problem nie mówi, że musiał odczytać wiele wierszy.
movatica

8

Węgiel drzewny , 4 bajty

ΦS‽⁵

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Możesz użyć dowolnego numeru z 4 do, 10aby uzyskać szansę 25%na 10%odpowiednio.


7

Befunge-98 (PyFunge) , 11 bajtów

>#@~3j4???,

Wypróbuj online!

Każda postać ma 25% szans na usunięcie. Ta decyzja jest podejmowana na trzech? instrukcji.

?ustawia licznik programu na jeden z czterech kierunków, z jednakowym prawdopodobieństwem. W takim przypadku w górę i w dół zawiń ponownie do tej samej instrukcji, abyśmy mogli je zignorować jako opcje.

Istnieją dwa wyjścia z lasu ?s: w prawo (wyjście) i w lewo (brak wyjścia). Sytuacja ta jest symetryczna, więc jeśli zaczynając od środka ?, jest p2=1/2 szansa na wyjście. Prawdopodobieństwo, że na wyjściu, gdy wychodząc od prawego ?jest p3=1/21+1/2p2=3/4 . Dlatego po przeczytaniu znaku przeskakujemy do skrajnej prawej strony, ?aby ustalić, czy wypisać dane.


5

Oktawa , 23 bajty

Generuje tablicę tego samego rozmiaru co dane wejściowe (łańcuchy w Octave są tablicami znaków), sprawdza każdą z liczb losowych, czy jest większa niż, 0.2a następnie używa indeksowania logicznego, aby wyodrębnić znaki z odpowiednich pozycji.

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

Wypróbuj online!


5

Galaretka , 9 5 bajtów

5X’µƇ

Wypróbuj online!

Monada, która przyjmuje argument Jelly jako argument i zwraca przetworzony ciąg Jelly. Gdy jest używany jako pełny program, domyślnie drukuje dane wyjściowe. Każda postać ma 20% szans na usunięcie.

Wyjaśnienie

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

5

Japt , 3 bajty

Każda postać ma szansę na usunięcie 1 na 5. 5Można zmienić na coś pomiędzy 4i 9włącznie, lub Ana 10zmianę kursów.

Æ5ö

Spróbuj

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


5

05AB1E , 5 4 bajtów

ʒ₄Ω≠

-1 bajt dzięki @Grimy .

Wypróbuj online lub uruchom ten sam program 10 razy .

Każda postać ma 25% zmiany upuszczenia.

Wyjaśnienie:

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

może być również _( ==0).


2
5Lmoże wynosić -1 (zmienia szansę z 20% na 25%, co jest nadal dopuszczalne).
Grimmy,

@Grimy Fajny, dzięki! :)
Kevin Cruijssen

4

MATL , 9 bajtów

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

Wypróbuj online!


4

Pyth , 8 5 bajtów

sfO4Q

Wypróbuj online!

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

Poprzednia wersja, 8 bajtów:

s*Vm!!O4

Wypróbuj online!

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

Qzwróci błąd, jeśli dane wejściowe nie są python-esque. Błędy na przykład z [1lub a/b. Q, wi zbędzie działać tylko w przypadku wprowadzania jednowierszowego, więc najlepszą opcją prawdopodobnie byłbyj.z
ar4093

4

Cubix , 20 bajtów

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

Wypróbuj online!

Dłużej, niż się spodziewałem, ponieważ miałem wiele operacji, których nie mogę się pozbyć. Szansa na upuszczenie postaci wynosi 25%. Zakładam, że to w porządku.

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

Zobacz, jak biegnie

Krótkie wyjaśnienie:

  • A|A to inicjuje stos, Wprowadź wszystko, odbij z powrotem, Wprowadź wszystko (tylko EOI -1)
  • ;? pop to of stack, test EOI (-1).
  • _?@ w przypadku wartości ujemnej, powróć do testu i zakończ przy zatrzymaniu
  • $Dwskocz \do setera losowego kierunku.
    • z selektora kierunku 3 kierunki prowadzą do owyjścia, a następnie wracają do pętli, jeden omija ościeżkę i idzie prosto do pętli.

3

APL (dzaima / APL) , 10 9 bajtów SBCS

Anonimowa ukryta funkcja prefiksu. Każda postać ma dokładnie 20% szans na usunięcie.

⊢⌿⍨4≥∘?5¨

Wypróbuj online!

 zero dla każdego znaku

? losowy zakres liczb całkowitych 1–5 dla każdego znaku

4≥ Maska logiczna dla liczb całkowitych, które są mniejsze lub równe 4

⊢⌿⍨ odfiltruj argument za pomocą tej maski


3

Siatkówka , 15 bajtów

/./_?(`.







Wypróbuj online! Wyjaśnienie:

/./_

Przetwarzaj każdą postać osobno.

?(`

Wykonaj podstawienie losowo. Pierwsze zastąpienie usuwa postać, podczas gdy pozostałe trzy pozostawiają ją bez zmian, co daje 25%szansę na usunięcie postaci. W razie potrzeby można to zmniejszyć, dodając dodatkowe pary znaków nowej linii.


3

R , 32 23 bajty

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

Wypróbuj online!

Funkcja przyjmująca wektor znaków jako dane wejściowe i zwracająca przetworzony wektor znaków. Każda postać ma 20% szans na usunięcie.

Dzięki @Roland i @Giueseppe za pomoc w oszczędzaniu 7 bajtów oraz @JDL za kolejne 2!


1
function(x)x[!rbinom(x,1,0.2)]
Roland

wzdłuż tych samych linii co @Roland function(x)x[rf(x,1,1)>1]; df(1,1,1)chodzi o to, 0.16co robi lewę.
Giuseppe,

lub rt(x,3)>1(około 20% szansy)
JDL

2
@JDL to <1, ale dzięki! Kolejne 2 zapisane.
Nick Kennedy

3

T-SQL 2012, 83 bajty

Pętla przechodzi przez wejście od prawej do lewej, usuwając 0 lub 1 znak.

25% szansy na usunięcie każdej postaci.

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

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

Wyjaśnienie:

rand()*2 zwraca liczbę zmiennoprzecinkową, której nie można użyć w stuff poleceniu.

strZamienia to na varchar po zaokrągleniu do najbliższej liczby całkowitej. Element zmiennoprzecinkowy jest konwertowany na varchar (co nie jest dozwolone jako trzeci parametr wstuff żadnym z nich).

Ten varchar ma 25% szans na bycie „2”, 50% szans na bycie „1”, 25% szans na bycie „0”. Dzieląc przez 2, istnieje 25% szans na wynik równy 1. Podział ten przekształca varchar na liczbę całkowitą.

Liczba całkowita jest oczekiwanym trzecim parametrem stufffunkcji.

Wypróbuj online


Bardzo fajna sztuczka STR, muszę o tym pamiętać. Nie jestem pewien, czy sprawiedliwe jest nakładanie na siebie (niepoliczonego DECLARE) kodu (policzonego); ale zmiana tego kosztowałaby cię tylko 1 bajt, ponieważ możesz wyeliminować dodatkowy SETprzy pomocyDECLARE @ INT=len(@i)
BradC

@BradC Zgadzam się i postaram się pamiętać, aby w przyszłości nie być na barana
t-clausen.dk

2

J , 10 bajtów

#~5>6?@$~#

Wypróbuj online!

Podobne do odpowiedzi APL Adama, chociaż napisałem ją przed spojrzeniem na jego.

  • 6.. $~ #Weź długość danych wejściowych #i ukształtuj $~liczbę 6 na tak długą listę.
  • ?@Traktuj każdą szóstkę z tej listy jako kość i rzuć ?nią.
  • >5Czy matryca jest mniejsza niż 5 (możliwe wartości to 0..5)? Użyj tego wyniku logicznego, aby utworzyć maskę bitową.
  • #~ Filtruj dane wejściowe za pomocą tej maski.


2

JavaScript,  46   44  51 bajtów

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

+7 bajtów z powodu dodanego wymagania STDOUT

-2 bajty dzięki Birjolaxew


oryginalna odpowiedź: 44 bajty bez wymagania STDOUT

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

Ponieważ nie używasz nazwy funkcji, możesz po prostu podać samą funkcję . Usunięcie f=prowadzi do 44 bajtów. Możesz także wprowadzać / wyprowadzać dane jako tablicę, co powinno znacznie cię zaoszczędzić.
Birjolaxew

@ Birjolaxew Nie jestem pewien, ale jak rozumiem, pytanie nie zezwala na użycie tablicy char, jeśli język ma ciąg znaków
jonatjano

Tak, Andrew zredagował pytanie z dodatkowymi wymaganiami po moim komentarzu. Na ogół jest to niezadowolone, ponieważ unieważnia odpowiedzi, które były wcześniej ważne (w tym przypadku można nawet zastanawiać się, czy twoja początkowa odpowiedź odpowiada wymaganiu „Wyjście musi odbywać się poprzez STDOUT”).
Birjolaxew

Co join``znaczy Nie mogę tego znaleźć w specyfikacji (bo tak naprawdę nie wiem, co to jest)
nick zoum

1
@nickzoum w es6 jest to odpowiednikjoin("") mdn revelent page
jonatjano

2

Scala , 51 46 30 bajtów

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

Wypróbuj online!

PS. Podobnie jak w wielu innych rozwiązaniach prawdopodobieństwo upuszczenia zwęglenia wynosi 20%.

Aktualizacja:

-5 bajtów za pomocą ciągu zamiast opcji [ciąg] w płaskiej mapie

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

30 bajtów przy użyciu filtra

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

1
Możesz ogolić 7 bajtów, zmieniając scala.math.randomna math.randomi 0.2na .2. Fajna sztuczka, używając ^ w ten sposób.
Kjetil S.

@KjetilS, dziękuję. Jako rozwiązanie opublikowałem również literały funkcji zamiast definicji funkcji. Jest to dopuszczalne zgodnie z tym: codegolf.stackexchange.com/questions/3885/…
Dr Y Wit

2

C # (interaktywny kompilator Visual C #) , 71 bajtów

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

Wypróbuj online!


I think that < 1 is eating too much. Maybe <3 or < 4 matches the parameters of the problem. Anyway this does not change the length of the code.
Luca

I haven't programmed in C# in a while, but why is't new Random().Next(5) directly possible?
Kevin Cruijssen

1
@KevinCruijssen Because then the same seed will be used for each number, so each number be the same. Just try it with new Random().Next(5), all you will get is the whole input or nothing.
Embodiment of Ignorance

1
@KevinCruijssen when using new Random(), the default seed value is Environment.TickCount, which increments every millisecond. If they're all created in the same millisecond tick, they will all have the same seed. The answer is only using a single instance of Random, and when it's called it updates the internal seed value - so each time Next() is called, it creates a different output value. .Net Core however uses a singleton RNG to generate the seed, so it doesn't have this problem
Zac Faragher

1
@BenjaminUrquhart Fixed, but added 26 bytes. Also, one can argue doesn't say input has to be from STDIN, but restricted to STDIN or closest equivalent, and function arguments may be the closest equivalent, but I'm not going to do that
Embodiment of Ignorance


1

C (gcc), 50 bytes

This program has a 20% chance of dropping a letter. Unfortunately the random number generator isn't seeded so you get the same sequence on each run. Basically the only trick is inverting the input character to halt the loop on EOF.

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

Try it online!

C (gcc), 64 59 bytes

Thanks to ceilingcat for the -5 bytes.

If you want the RNG seeded on each run.

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

Try it online!


You don't have to use main() for Code Golf submissions, you can also define an arbitrary function that does what is required. So you can write f(c){...}.
G. Sliepen

1

Lua, 69 68 bytes

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

Try it online!

Kinda straightforward, but seems to be shortest version: iterate over stdin char by char (with io.lines… that name is misleading), then based on random value either print one or empty string (e.g. nothing).


1

Java

Non-terminating: 82 bytes

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

Terminating (TIO): 105 bytes

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

Is dealing with stdout really necessary? Other answers only create a function just converting a string. Seems unfair towards Java. If this C# solution is valid, then s->s.filter(c->Math.random()<.2) is too.
Holger

@Holger Input is restricted to STDIN or closest equivalent. and Output must be through STDOUT or the closest equivalent. If your language does have STDOUT, do not output in any other way. So no, that answer is not valid
Benjamin Urquhart

1

Zsh, 53 41 bytes

-12, thanks to GammaFunction

41 bytes: try it online!

Converts the input to an array of characters, then tries to print each element c, unless it's eaten by the ((RANDOM%4)) evaluating to false!

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

53 bytes: try it online!

A more straightforward, but verbose, iteration over string-length.

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

1
Smart use of \c, I would not have remembered that! There's still a few optimizations to be made...
GammaFunction

Nice, clever use of RANDOM and array conversion
roblogic

1

Zsh, 50 bytes

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

Try it online!

Similar to RobLogic's answer, but following the input requirements more closely, and works for inputs with backslashes.

"$(<&0)" instead of "<&0" or $(<&0) because the first doesn't work in substitutions, and the second eats newlines. The -nE flags are necessary to prevent backslashes from being parsed as escape sequences, and to prevent newlines being inserted.

echo -nE


1

MathGolf, 5 bytes

æƒ√∞*

Try it online!

Explanation

æ       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

Each character will be repeated 0 or 1 times, depending on the random value. Since the expected value after the square root is shifted, there is a 25% probability that each character is removed.

Alternative 5-byter

gÉ;4w

Filter the characters by a random number in [0, 4]. Due to how filtering works, I have to discard the actual character within the filter loop, which adds 1 byte.


0

GFortran, 120 bytes

Not too bad, if we use the deprecated RAN() function, which is pseudo-random, i.e. you get the same sequence each time. The proper way to generate random numbers in GFortran is with CALL RANDOM_SEED() and CALL RANDOM_NUMBER(R) but that's a lot of bytes!

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

Try it online!


1
Pseudo randomness is allowed, if that is the closest way you have to making random actions take hold.
Andrew

0

Oracle SQL, 133 bytes

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)

It works with an assumption that input data is stored in a table t(x), e.g.

with t(x) as (select 'The cat ate my homework' from dual)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.