Con mèo đã ăn đầu vào của bạn một lần nữa!


30

Tạo một chương trình mèo, hay còn gọi là chương trình lấy đầu vào và in nó.

... Ngoại trừ, chương trình sẽ lấy ngẫu nhiên các ký tự khỏi đầu vào của bạn và in nó ra.

Tuy nhiên, mỗi ký tự trong đầu vào phải có tỷ lệ cược bằng nhau để được loại bỏ với chương trình, vì khó có thể thực hiện điều đó, tỷ lệ cược cho mỗi ký tự có thể thay đổi tối đa 10%.

Chương trình của bạn sẽ lấy đầu vào, sau đó xóa ngẫu nhiên các ký tự khỏi đầu vào, sau đó in lại phiên bản đó. (Bạn có thể in với các dòng mới hoặc các ký tự khác trong trường hợp ngôn ngữ của bạn phải in các dòng mới.)

Nếu đầu vào là BOOOWL, nó không nên loại bỏ tất cả Os có cơ hội như nhau: mỗi ký tự (không phải là duy nhất) nên được xem xét, vì vậy thay vì mỗi O kết hợp có 1/5 cơ hội (ví dụ), mỗi O nên có 1 / 5 cơ hội, vì vậy, thay vì có 1/5 cơ hội BWL, nên có 1/5 cơ hội BOWL, BOOWL.

Đầu vào được giới hạn ở STDIN hoặc tương đương gần nhất.

Mỗi nhân vật phải có tối thiểu 10% và tối đa 30% cơ hội được xóa.

Tỷ lệ cược của mỗi nhân vật nên được tính riêng.

Bạn có thể sử dụng bất kỳ thành phần nào trong ngôn ngữ của mình để hỗ trợ các hành động ngẫu nhiên, có thể là chức năng hoặc một cái gì đó khác.

Đầu ra phải thông qua STDOUT hoặc tương đương gần nhất. Nếu ngôn ngữ của bạn không có STDOUT, không xuất ra theo bất kỳ cách nào khác. Nếu ngôn ngữ của bạn không thể xuất chuỗi dưới dạng văn bản, hãy sử dụng tương đương gần nhất (đầu ra mảng ký tự C 'OK ở đây).

Đây là mã golf. Chương trình ngắn nhất sẽ thắng.


4
Có nên luôn luôn có từ 10% đến 30% cơ hội cho một nhân vật cụ thể bị loại bỏ? Hay đó chỉ là mục đích của ví dụ?
attinat

2
"Bộ một ký tự" nghĩa là gì? nếu đầu vào BOWL OF SOUPOthể bị xóa tất cả trong một lần?
roblogic

1
tất cả các câu trả lời cho đến nay đều sử dụng 20% ​​cơ hội cố định cho một ký tự bị xóa. Tôi không chắc mục đích câu hỏi là cho tất cả các nhân vật có cùng tỷ lệ cược.
Nzall

3
Output must be through STDOUT, as a text. Do not output a character array.<- Tôi có một ngôn ngữ cho phép bạn xuất ra một mảng ký tự (nó được làm phẳng trước khi xuất). Điều đó không được phép? Làm thế nào về các ngôn ngữ như C, trong đó một chuỗi về cơ bản là một mảng ký tự?
Ismael Miguel

1
Sử dụng tương đương gần nhất. Chuỗi mảng ký tự của C là OK, vì chúng gần nhất với văn bản.
Andrew

Câu trả lời:


10

Japt -f , 2 byte

Các -fcờ "chạy chương trình trên mỗi phần tử trong đầu vào đầu tiên, xuất ra một mảng của những người mà trả về một giá trị truthy." trả về một số ngẫu nhiên trong khoảng từ 0 (đã bao gồm) đến 5 (độc quyền). Giống như JavaScript, 0 là giả mạo trong Japt.

Thử nó


2
Tôi sẽ quay ngược thời gian, tạo ra một ngôn ngữ trong đó o là thử thách này và sau đó quay lại và gửi câu trả lời của tôi, hoặc có thể tạo ra chuỗi trống: p
Andrew

Các cờ dòng lệnh không được tính vào bytecount?
Daniel Vestøl

1
@ DanielVestøl Nhấp vào -f, trong tiêu đề.
Ismael Miguel


1
là trò đùa nhưng ok
Andrew

8

Python 3 , 63 byte

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

Hãy thử trực tuyến!

Python 2 , 67 65 byte

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

Hãy thử trực tuyến!

Mỗi nhân vật có 20% cơ hội thả ong.

Cách tiếp cận khác nhau, cùng chiều dài:

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

Hãy thử trực tuyến!


63 byte trong python 2 có chức năng
attinat

Các quy tắc nêu rõ để viết một chương trình đầy đủ:Create a cat program, a.k.a a program that takes an input and prints it.
Movatica

Điều này chỉ đọc dòng đầu tiên.
AKX

Vấn đề không nêu nó đã phải đọc nhiều dòng.
Movatica

8

Than , 4 byte

ΦS‽⁵

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

Bạn có thể sử dụng bất kỳ số từ 4để 10để có được cơ hội 25%để 10%tương ứng.


7

Befunge-98 (PyFunge) , 11 byte

>#@~3j4???,

Hãy thử trực tuyến!

Mỗi nhân vật có 25% cơ hội bị loại bỏ. Quyết định này được thực hiện tại ba ?hướng dẫn.

?đặt bộ đếm chương trình theo một trong bốn hướng, với xác suất bằng nhau. Trong trường hợp này, lên & xuống bọc lại theo cùng một hướng dẫn, vì vậy chúng ta có thể bỏ qua những tùy chọn này.

Có hai cách ra khỏi rừng ?s: bên phải (đầu ra) và bên trái (không có đầu ra). Tình trạng này là đối xứng, vì vậy nếu bắt đầu từ giữa ?, có một p2=1/2 cơ hội xuất ra. Cơ hội xuất ra nếu bắt đầu từ bên phải ?p3=1/21+1/2p2=3/4 . Do đó, sau khi đọc một ký tự, chúng ta nhảy sang bên phải ?để xác định xem có xuất ra hay không.


5

Octave , 23 byte

Tạo một mảng có cùng kích thước với đầu vào (chuỗi trong Octave là mảng ký tự), kiểm tra từng số ngẫu nhiên xem nó có lớn hơn không 0.2và sau đó sử dụng lập chỉ mục logic để trích xuất các ký tự ở các vị trí tương ứng.

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

Hãy thử trực tuyến!


5

Thạch , 9 5 byte

5X’µƇ

Hãy thử trực tuyến!

Một đơn vị lấy chuỗi Jelly làm đối số và trả về chuỗi Jelly đã xử lý. Khi được sử dụng như một chương trình đầy đủ, ngầm in ra đầu ra. Mỗi nhân vật có 20% cơ hội bị loại bỏ.

Giải trình

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

5

Japt , 3 byte

Mỗi nhân vật có 1 trong 5 cơ hội bị loại bỏ. Các 5có thể thay đổi bất cứ điều gì giữa 4& 9, bao gồm, hoặc Acho 10đến thay đổi tỷ lệ cược.

Æ5ö

Thử nó

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


5

05AB1E , 5 4 byte

ʒ₄Ω≠

-1 byte nhờ @Grimy .

Hãy thử trực tuyến hoặc chạy cùng một chương trình 10 lần .

Mỗi nhân vật có 25% thay đổi bị loại bỏ.

Giải trình:

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

cũng có thể là _( ==0).


2
5Lcó thể là -1 (thay đổi cơ hội từ 20% thành 25%, vẫn có thể chấp nhận được).
Grimmy

@Grimy Đẹp một cái, cảm ơn! :)
Kevin Cruijssen

4

MATL , 9 byte

t&n&r.2>)

Biểu hiện:

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

Hãy thử trực tuyến!


4

Bình thường , 8 5 byte

sfO4Q

Hãy thử trực tuyến!

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

Phiên bản trước, 8 byte:

s*Vm!!O4

Hãy thử trực tuyến!

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

Qsẽ đưa ra một lỗi nếu đầu vào không phải là python-esque. Lỗi ví dụ từ [1hoặc a/b. Q, wzsẽ chỉ làm việc cho đầu vào dòng đơn, vì vậy lựa chọn tốt nhất có lẽ làj.z
ar4093

4

Cubix , 20 byte

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

Hãy thử trực tuyến!

Lâu hơn tôi đã hy vọng khi tôi có một số no-op mà tôi dường như không thể thoát khỏi. Cơ hội để thả một nhân vật là 25%. Tôi cho rằng điều này là ổn.

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

Xem nó chạy

Giải thích ngắn gọn:

  • A|A cái này khởi tạo ngăn xếp, Nhập tất cả, phản ánh lại, Nhập tất cả (chỉ là EOI -1)
  • ;? bật lên ngăn xếp, kiểm tra EOI (-1).
  • _?@ nếu âm tính, phản ánh trở lại vào thử nghiệm và kết thúc tạm dừng
  • $D nhảy \ vào setter hướng ngẫu nhiên.
    • từ trình thiết lập hướng, 3 hướng dẫn đến ođầu ra cho rồi quay lại vòng lặp, một người bỏ lỡ ođường dẫn của nó và đi thẳng vào vòng lặp.

3

APL (dzaima / APL) , 10 9 byte SBCS

Chức năng tiền tố ẩn danh. Mỗi nhân vật có chính xác 20% cơ hội bị loại bỏ.

⊢⌿⍨4≥∘?5¨

Hãy thử trực tuyến!

 không cho mỗi nhân vật

? phạm vi số ngẫu nhiên 1 L55 cho mỗi ký tự

4≥ Mặt nạ Boolean cho các số nguyên nhỏ hơn hoặc bằng 4

⊢⌿⍨ lọc đối số bằng mặt nạ đó


3

Võng mạc , 15 byte

/./_?(`.







Hãy thử trực tuyến! Giải trình:

/./_

Xử lý từng nhân vật.

?(`

Thực hiện thay thế một cách ngẫu nhiên. Sự thay thế đầu tiên xóa nhân vật, trong khi ba người còn lại không thay đổi, do đó tạo 25%cơ hội xóa nhân vật. Điều này có thể được giảm khi cần thiết bằng cách nối thêm các cặp dòng mới.


3

R , 32 23 byte

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

Hãy thử trực tuyến!

Một hàm lấy một vectơ ký tự làm đầu vào và trả về một vectơ ký tự được xử lý. Mỗi nhân vật có 20% cơ hội bị loại bỏ.

Cảm ơn @Roland và @Giueseppe vì đã giúp lưu 7 byte và @JDL để có thêm 2!


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

cùng dòng với @Roland , function(x)x[rf(x,1,1)>1]; df(1,1,1)là về 0.16cái mà lừa
Giuseppe

hoặc rt(x,3)>1(khoảng 20% ​​cơ hội)
JDL

2
@JDL đó <1, nhưng cảm ơn! Thêm 2 lưu.
Nick Kennedy

3

T-SQL 2012, 83 byte

Vòng qua đầu vào từ phải sang trái loại bỏ 0 hoặc 1 ký tự.

25% cơ hội cho mỗi nhân vật bị loại bỏ.

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

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

Giải trình:

rand()*2trả về một float, không thể được sử dụng trong stufflệnh.

Việc strchuyển đổi này thành một varchar sau khi làm tròn thành số nguyên gần nhất. Phao đang được chuyển đổi thành một varchar (không được phép làm tham số thứ ba trongstuff cả hai).

Varchar này có 25% cơ hội là '2', 50% cơ hội là '1', 25% cơ hội là '0'. Chia cho 2, có 25% cơ hội kết quả là 1. Phân chia này chuyển đổi varchar thành một số nguyên.

Số nguyên là tham số thứ ba dự kiến ​​trong stuffchức năng.

Dùng thử trực tuyến


Thủ thuật rất hay với STR, tôi sẽ phải nhớ điều đó. Không chắc chắn là công bằng khi cõng bạn ra (không DECLAREtính) trong mã (được tính) của bạn; nhưng việc thay đổi sẽ chỉ khiến bạn tốn 1 byte, vì bạn có thể loại bỏ phần bổ sung SETbằngDECLARE @ INT=len(@i)
BradC

@BradC Tôi đồng ý và tôi sẽ cố gắng nhớ không cõng trong tương lai
t-clausen.dk

2

J , 10 byte

#~5>6?@$~#

Hãy thử trực tuyến!

Tương tự như câu trả lời APL của Adam, mặc dù tôi thực sự đã viết nó trước khi nhìn vào câu trả lời của anh ấy.

  • 6.. $~ #Lấy độ dài của đầu vào #và định hình $~số 6 thành một danh sách dài.
  • ?@Hãy coi mỗi sáu người trong danh sách đó là một người chết và lăn ?nó.
  • >5Là khuôn nhỏ hơn 5 (giá trị có thể là 0..5)? Sử dụng kết quả boolean đó để tạo mặt nạ bit.
  • #~ Lọc đầu vào với mặt nạ đó.


2

Javascript,  46   44  51 byte

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

+7 byte vì yêu cầu STDOUT được thêm vào

-2 byte cảm ơn Birjolaxew


câu trả lời gốc: 44 byte không có yêu cầu STDOUT

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

Vì bạn không sử dụng tên của hàm, bạn được phép chỉ cung cấp hàm đó . Việc xóa f=sẽ giúp bạn giảm xuống còn 44 byte. Bạn cũng có thể nhập / xuất dưới dạng một mảng, điều này sẽ giúp bạn tiết kiệm khá nhiều.
Birjolaxew

@Birjolaxew Tôi không chắc nhưng vì tôi hiểu câu hỏi không cho phép sử dụng mảng char nếu ngôn ngữ có chuỗi
jonatjano

Có, Andrew đã chỉnh sửa câu hỏi với các yêu cầu bổ sung sau bình luận của tôi. Điều này thường được tán thành vì nó vô hiệu hóa các câu trả lời trước đây là hợp lệ (trong trường hợp này thậm chí còn tranh cãi liệu câu trả lời ban đầu của bạn có phù hợp với yêu cầu "Đầu ra phải thông qua STDOUT" hay không).
Birjolaxew

join``nghĩa là gì? Không thể tìm thấy nó trong thông số kỹ thuật (vì tôi thực sự không biết nó là gì)
nick zoum

1
@nickzoum trong es6 nó tương đương vớijoin("") mdn revelent page
jonatjano

2

Scala , 51 46 30 byte

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

Hãy thử trực tuyến!

Tái bút Giống như trong nhiều giải pháp khác, xác suất bỏ char là 20%.

Cập nhật:

-5 byte bằng cách sử dụng Chuỗi thay vì Tùy chọn [Chuỗi] trong FlatMap

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

30 byte bằng cách sử dụng bộ lọc

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

1
Bạn có thể cạo 7 byte bằng cách thay đổi scala.math.randomđể math.random0.2để .2. Thủ thuật hay bằng cách sử dụng ^ như thế.
Kjetil S.

@KjetilS, cảm ơn bạn. Tôi cũng đăng các chức năng bằng chữ thay vì định nghĩa hàm như một giải pháp. Nó được chấp nhận theo điều này: codegolf.stackexchange.com/questions/3885/ Khăn
Dr Y Wit

2

C # (Trình biên dịch tương tác Visual C #) , 71 byte

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

Hãy thử trực tuyến!


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 khi sử dụng new Random(), giá trị hạt giống mặc định là Môi trường.TickCount , tăng lên mỗi mili giây. Nếu tất cả chúng được tạo ra trong cùng một mili giây, tất cả chúng sẽ có cùng một hạt giống. Câu trả lời chỉ sử dụng một trường hợp ngẫu nhiên duy nhất và khi được gọi là cập nhật giá trị hạt giống bên trong - vì vậy mỗi lần Next () được gọi, nó sẽ tạo ra một giá trị đầu ra khác nhau. Tuy nhiên, Core Core sử dụng RNG đơn lẻ để tạo hạt giống, do đó, nó không gặp phải vấn đề này
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

Chương trình này có 20% cơ hội bỏ thư. Thật không may, trình tạo số ngẫu nhiên không được tạo mầm để bạn có được chuỗi tương tự trên mỗi lần chạy. Về cơ bản, mẹo duy nhất là đảo ngược ký tự đầu vào để tạm dừng vòng lặp trên EOF.

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

Hãy thử trực tuyến!

C (gcc) , 64 59 byte

Nhờ trần nhà cho -5 byte.

Nếu bạn muốn RNG gieo hạt trên mỗi lần chạy.

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

Hãy thử trực tuyến!


Bạn không phải sử dụng main()để gửi Code Golf, bạn cũng có thể xác định một hàm tùy ý thực hiện những gì được yêu cầu. Vì vậy, bạn có thể viết f(c){...}.
G. Sliepen

1

Lua , 69 68 byte

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

Hãy thử trực tuyến!

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.