Kucing memakan input Anda lagi!


30

Buat program kucing, alias program yang mengambil input dan mencetaknya.

... Kecuali, program ini akan secara acak mengambil karakter dari input Anda dan mencetaknya.

Setiap karakter dalam input harus memiliki peluang yang secara umum sama untuk dihapus dengan program, meskipun, karena sulit untuk membuatnya, peluang untuk setiap karakter dapat bervariasi paling banyak 10%.

Program Anda harus mengambil input, lalu menghapus karakter secara acak dari input, lalu mencetak versi itu lagi. (Anda dapat mencetak dengan mengikuti baris baru atau karakter lain jika bahasa Anda harus mencetak baris baru.)

Jika inputnya adalah BOOOWL, seharusnya tidak menghapus semua Os dengan peluang yang sama: setiap karakter (tidak unik) harus dipertimbangkan, jadi alih-alih setiap O yang digabungkan memiliki peluang 1/5 (misalnya), masing-masing O harus memiliki 1 / 5 kesempatan, jadi, bukannya ada menjadi 1/5 kesempatan BWL, harus ada 1/5 kesempatan BOWL, BOOWL.

Input dibatasi untuk STDIN atau yang setara terdekat.

Setiap karakter harus memiliki minimal 10% dan kesempatan maksimum 30% untuk dihapus.

Peluang setiap karakter harus dihitung secara individual.

Anda dapat menggunakan komponen apa pun dari bahasa Anda yang mendukung tindakan acak, baik itu fungsi atau lainnya.

Output harus melalui STDOUT atau yang setara terdekat. Jika bahasa Anda memiliki STDOUT, jangan output dengan cara lain apa pun. Jika bahasa Anda tidak dapat menampilkan string sebagai teks, gunakan setara terdekat (output array karakter C OK di sini).

Ini kode golf. Kemenangan program terpendek.


4
Haruskah selalu ada peluang antara 10% dan 30% untuk karakter tertentu dihapus? Atau apakah itu hanya untuk tujuan contoh?
attinat

2
apa yang Anda maksud dengan "set satu karakter"? jika inputnya, BOWL OF SOUPmungkinkah semua Odihapus sekaligus?
roblogic

1
semua jawaban sejauh ini menggunakan kesempatan tetap 20% untuk menghapus karakter. Saya tidak yakin maksud pertanyaannya adalah agar semua karakter memiliki peluang yang sama.
Nzall

3
Output must be through STDOUT, as a text. Do not output a character array.<- Saya memiliki bahasa yang memungkinkan Anda untuk output array karakter (itu diratakan sebelum output). Apakah itu dilarang? Bagaimana dengan bahasa seperti C, di mana string pada dasarnya adalah array karakter?
Ismael Miguel

1
Gunakan padanan terdekat. String array karakter C adalah OK, karena setara dengan teks.
Andrew

Jawaban:


10

Japt -f , 2 byte

The -fbendera "menjalankan program pada setiap elemen pada input pertama, keluaran array mereka yang mengembalikan nilai truthy." mengembalikan angka acak antara 0 (inklusif) dan 5 (eksklusif). Seperti JavaScript, 0 salah di Japt.

Cobalah


2
Saya akan kembali ke masa lalu, membuat bahasa di mana o adalah tantangan ini dan kemudian kembali dan mengirimkan jawaban saya, atau mungkin membuat string kosong yang: p
Andrew

Bukankah bendera commandline seharusnya diperhitungkan dengan bytecount?
Daniel Vestøl

1
@ DanielVestøl Klik pada -f, pada judul.
Ismael Miguel


1
adalah lelucon tapi ok
Andrew

8

Python 3 , 63 byte

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

Cobalah online!

Python 2 , 67 65 byte

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

Cobalah online!

Setiap karakter memiliki peluang 20% ​​untuk jatuh.

Pendekatan berbeda, panjangnya sama:

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

Cobalah online!


63 byte dalam python 2 dengan fungsi
attinat

Aturan secara eksplisit menyatakan untuk menulis program lengkap:Create a cat program, a.k.a a program that takes an input and prints it.
movatica

Ini hanya membaca baris input pertama.
AKX

Masalahnya tidak menyatakan itu harus membaca beberapa baris.
movatica

8

Arang , 4 byte

ΦS‽⁵

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Anda dapat menggunakan nomor apapun dari 4ke 10untuk mendapatkan peluang 25%untuk 10%masing-masing.


7

Befunge-98 (PyFunge) , 11 byte

>#@~3j4???,

Cobalah online!

Setiap karakter memiliki peluang 25% untuk dihapus. Keputusan ini dibuat berdasarkan tiga ?instruksi.

?mengatur penghitung program ke salah satu dari empat arah, dengan probabilitas yang sama. Dalam hal ini, bungkus atas & bawah kembali ke instruksi yang sama, sehingga kita dapat mengabaikannya sebagai opsi.

??p2=1/2?p3=1/21+1/2p2=3/4?


5

Oktaf , 23 byte

Menghasilkan array dengan ukuran yang sama dengan input (string dalam Oktaf adalah array karakter), memeriksa setiap angka acak apakah lebih besar dari 0.2dan kemudian menggunakan pengindeksan logis untuk mengekstraksi karakter pada posisi yang sesuai.

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

Cobalah online!


5

Jelly , 9 5 byte

5X’µƇ

Cobalah online!

Monad yang menggunakan string Jelly sebagai argumennya dan mengembalikan string Jelly yang diproses. Ketika digunakan sebagai program lengkap, secara implisit mencetak hasilnya. Setiap karakter memiliki peluang 20% ​​untuk dihapus.

Penjelasan

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

5

Japt , 3 byte

Setiap karakter memiliki peluang 1 dalam 5 dihapus. The 5dapat diubah ke apapun antara 4& 9, inklusif, atau Auntuk 10mengubah peluang.

Æ5ö

Cobalah

Æ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 terima kasih kepada @Grimy .

Cobalah online atau jalankan program yang sama 10 kali .

Setiap karakter memiliki perubahan 25% saat dijatuhkan.

Penjelasan:

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

bisa juga menjadi _( ==0).


2
5Lbisa untuk -1 (mengubah peluang dari 20% menjadi 25%, yang masih dapat diterima).
Grimmy

@Grimy Bagus, terima kasih! :)
Kevin Cruijssen

4

MATL , 9 byte

t&n&r.2>)

Penjelajahan:

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

Cobalah online!


4

Pyth , 8 5 byte

sfO4Q

Cobalah 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

Versi sebelumnya, 8 byte:

s*Vm!!O4

Cobalah 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

Qakan melempar kesalahan jika inputnya bukan python-esque. Kesalahan misalnya dari [1atau a/b. Q, wdan zhanya akan bekerja untuk input single-line, jadi opsi terbaik mungkinj.z
ar4093

4

Cubix , 20 byte

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

Cobalah online!

Lebih lama daripada yang saya harapkan karena saya memiliki sejumlah no-op yang sepertinya tidak bisa saya hilangkan. Peluang untuk menjatuhkan karakter adalah 25%. Saya menganggap ini baik-baik saja.

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

Lihat saja

Penjelasan singkat:

  • A|A ini menginisialisasi tumpukan, Masukan semua, pantulkan kembali, Masukan semua (hanya EOI -1)
  • ;? pop to of stack, uji untuk EOI (-1).
  • _?@ jika negatif, refleksikan kembali ke tes dan akhiri
  • $Dlompat \ke setter arah acak.
    • dari setter arah, 3 arah mengarah ke ooutput lalu kembali ke loop, satu meleset odi jalur itu dan langsung ke loop.

3

APL (dzaima / APL) , 10 9 byte SBCS

Fungsi awalan diam-diam anonim. Setiap karakter memiliki peluang 20% ​​untuk dihapus.

⊢⌿⍨4≥∘?5¨

Cobalah online!

 nol untuk setiap karakter

? rentang integer acak 1-5 untuk setiap karakter

4≥ Topeng Boolean untuk bilangan bulat yang kurang dari atau sama dengan 4

⊢⌿⍨ saring argumen menggunakan topeng itu


3

Retina , 15 byte

/./_?(`.







Cobalah online! Penjelasan:

/./_

Memproses setiap karakter secara individual.

?(`

Lakukan penggantian secara acak. Substitusi pertama menghapus karakter, sementara tiga lainnya membiarkannya tidak berubah, sehingga memberikan 25%kesempatan untuk menghapus karakter. Ini dapat dikurangi seperlunya dengan menambahkan pasangan baris baru.


3

R , 32 23 byte

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

Cobalah online!

Fungsi mengambil vektor karakter sebagai input dan mengembalikan vektor karakter yang diproses. Setiap karakter memiliki peluang 20% ​​untuk dihapus.

Terima kasih kepada @Roland dan @Giueseppe karena membantu menghemat 7 byte, dan @JDL untuk 2 lebih lanjut!


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

sepanjang baris yang sama seperti @Roland, function(x)x[rf(x,1,1)>1]; df(1,1,1)adalah tentang 0.16yang melakukan trik.
Giuseppe

atau rt(x,3)>1(sekitar 20% kemungkinan)
JDL

2
@ JDL <1, tapi terima kasih! 2 lainnya disimpan.
Nick Kennedy

3

T-SQL 2012, 83 byte

Looping melalui input dari kanan ke kiri menghapus 0 atau 1 karakter.

Kesempatan 25% untuk setiap karakter dihapus.

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

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

Penjelasan:

rand()*2mengembalikan float, yang tidak bisa digunakan dalam stuffperintah.

The strmengkonversi ini menjadi varchar setelah pembulatan ke angka terdekat. Float sedang dikonversi ke varchar (yang juga tidak diizinkan sebagai parameter ketiga stuff).

Varchar ini memiliki peluang 25% menjadi '2', 50% peluang menjadi '1', 25% peluang menjadi '0'. Dibagi dengan 2, ada kemungkinan hasil 25% menjadi 1. Divisi ini mengubah varchar menjadi integer.

Integer adalah parameter ketiga yang diharapkan dalam stufffungsi.

Cobalah online


Trik yang sangat bagus STR, saya harus ingat itu. Tidak yakin adil untuk membonceng Anda (tidak terhitung) DECLAREdalam kode (terhitung) Anda; tetapi mengubah itu hanya akan dikenakan biaya 1 byte, karena Anda dapat menghilangkan ekstra SETdenganDECLARE @ INT=len(@i)
BradC

@BradC Saya setuju, dan saya akan mencoba untuk mengingat untuk tidak mendukung di masa depan
t-clausen.dk

2

J , 10 byte

#~5>6?@$~#

Cobalah online!

Mirip dengan jawaban APL Adam, meskipun saya benar-benar menulisnya sebelum melihatnya.

  • 6.. $~ #Ambil panjang input #dan bentuk $~angka 6 ke dalam daftar yang panjang.
  • ?@Perlakukan masing-masing enam dalam daftar itu sebagai dadu dan gulung ?.
  • >5Apakah die kurang dari 5 (nilai yang mungkin adalah 0..5)? Gunakan hasil boolean itu untuk membuat topeng bit.
  • #~ Saring input dengan mask itu.


2

Javascript,  46   44  51 byte

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

+7 byte karena persyaratan STDOUT yang ditambahkan

-2 byte terima kasih kepada Birjolaxew


jawaban asli: 44 byte tanpa persyaratan STDOUT

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

Karena Anda tidak menggunakan nama fungsi, Anda diizinkan untuk hanya menyediakan fungsi itu sendiri . Menghapus f=membuat Anda turun ke 44 byte. Anda juga dapat input / output sebagai array, yang seharusnya menghemat sedikit.
Birjolaxew

@Birjolaxew Saya tidak yakin tapi seperti yang saya mengerti pertanyaannya melarang penggunaan array char jika bahasa memiliki string
jonatjano

Ya, Andrew mengedit pertanyaan dengan persyaratan tambahan setelah komentar saya. Ini umumnya disukai karena itu membatalkan jawaban yang sebelumnya valid (dalam hal ini bahkan dapat diperdebatkan apakah jawaban awal Anda cocok dengan persyaratan "Output harus melalui STDOUT").
Birjolaxew

Apa join``artinya Tidak dapat menemukannya di spec (karena saya tidak tahu apa itu)
nick zoum

1
@nickzoum di es6 itu setara denganjoin("") mdn revelent page
jonatjano

2

Scala , 51 46 30 byte

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

Cobalah online!

PS. Seperti di banyak solusi lain, probabilitas menjatuhkan char adalah 20%.

Memperbarui:

-5 byte dengan menggunakan String sebagai ganti Option [String] di flatMap

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

30 byte dengan menggunakan filter

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

1
Anda dapat mengurangi 7 byte dengan mengubah scala.math.randomke math.randomdan 0.2ke .2. Trik yang bagus menggunakan ^ seperti itu.
Kjetil S.

@ KLILILS, terima kasih. Saya juga memposting literal fungsi alih-alih definisi fungsi sebagai solusi. Hal ini dapat diterima sesuai dengan ini: codegolf.stackexchange.com/questions/3885/…
Dr Y Wit

2

C # (Visual C # Interactive Compiler) , 71 byte

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

Cobalah online!


Saya pikir <1 makan terlalu banyak. Mungkin <3 atau <4 cocok dengan parameter masalah. Pokoknya ini tidak mengubah panjang kode.
Luca

Saya belum diprogram dalam C # dalam beberapa saat, tetapi mengapa tidak new Random().Next(5)secara langsung mungkin?
Kevin Cruijssen

1
@KevinCruijssen Karena dengan begitu benih yang sama akan digunakan untuk setiap nomor, sehingga setiap nomor sama. Coba saja dengan new Random().Next(5), semua yang akan Anda dapatkan adalah seluruh input atau tidak sama sekali.
Perwujudan Ketidaktahuan

1
@KevinCruijssen saat menggunakan new Random(), nilai seed default adalah Environment.TickCount, yang menambah setiap milidetik. Jika mereka semua dibuat dalam centang milidetik yang sama, mereka semua akan memiliki benih yang sama. Jawabannya hanya menggunakan satu contoh Acak, dan ketika itu disebut pembaruan nilai seed internal - jadi setiap kali Next () dipanggil, ia menciptakan nilai output yang berbeda. Net. Namun Core menggunakan RNG singleton untuk menghasilkan benih, sehingga tidak memiliki masalah ini
Zac Faragher

1
@BenjaminUrquhart Tetap, tetapi menambahkan 26 byte. Juga, orang dapat berdebat tidak mengatakan input harus dari STDIN, tetapi restricted to STDIN or closest equivalent, dan argumen fungsi mungkin setara terdekat, tapi saya tidak akan melakukan itu
Perwujudan Ketidaktahuan


1

C (gcc) , 50 byte

Program ini memiliki peluang 20% ​​untuk menjatuhkan surat. Sayangnya generator angka acak tidak diunggulkan sehingga Anda mendapatkan urutan yang sama pada setiap putaran. Pada dasarnya satu-satunya trik adalah membalik karakter input untuk menghentikan loop pada EOF.

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

Cobalah online!

C (gcc) , 64 59 byte

Berkat ceilingcat untuk -5 byte.

Jika Anda ingin RNG diunggulkan di setiap putaran.

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

Cobalah online!


Anda tidak harus menggunakan main()untuk pengiriman Code Golf, Anda juga dapat mendefinisikan fungsi arbitrer yang melakukan apa yang diperlukan. Jadi kamu bisa menulis 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

Cobalah online!

Agak langsung, tetapi tampaknya versi terpendek: iterate over stdin char oleh char (dengan io.lines... nama itu menyesatkan), kemudian berdasarkan nilai acak baik cetak satu atau string kosong (misalnya tidak ada).


1

Jawa

Non-terminating: 82 byte

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

Terminating (TIO): 105 byte

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

Apakah berurusan dengan stdout benar-benar diperlukan? Jawaban lain hanya membuat fungsi hanya mengonversi string. Tampaknya tidak adil terhadap Jawa. Jika solusi C # ini valid, maka s->s.filter(c->Math.random()<.2)itu juga.
Holger

@ Holger Input is restricted to STDIN or closest equivalent.dan Output must be through STDOUT or the closest equivalent. If your language does have STDOUT, do not output in any other way.Jadi tidak, jawaban itu tidak valid
Benjamin Urquhart

1

Zsh , 53 41 byte

-12 , terima kasih untuk GammaFunction

41 byte: coba online!

Mengonversi input ke array karakter, lalu mencoba untuk mencetak setiap elemen c, kecuali jika dimakan oleh ((RANDOM%4))evaluasi menjadi false!

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

53 byte: coba online!

Iterasi yang lebih mudah, tetapi verbose, melebihi panjang string.

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

1
Penggunaan cerdas \c, saya tidak akan ingat itu! Masih ada beberapa optimasi yang harus dilakukan ...
GammaFunction

Bagus, penggunaan pintar RANDOMdan konversi array
roblogic

1

Zsh , 50 byte

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

Cobalah online!

Mirip dengan jawaban RobLogic, tetapi mengikuti persyaratan input lebih dekat, dan bekerja untuk input dengan garis miring terbalik.

"$(<&0)"bukannya "<&0"atau $(<&0)karena yang pertama tidak berfungsi dalam pergantian, dan yang kedua makan baris baru. The -nEbendera diperlukan untuk mencegah backslashes dari yang diuraikan sebagai escape sequence, dan untuk mencegah baris yang dimasukkan.

echo -nE


1

MathGolf , 5 byte

æƒ√∞*

Cobalah online!

Penjelasan

æ       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

Setiap karakter akan diulang 0 atau 1 kali, tergantung pada nilai acak. Karena nilai yang diharapkan setelah akar kuadrat digeser, ada kemungkinan 25% bahwa setiap karakter dihapus.

Alternatif 5-byter

gÉ;4w

Saring karakter dengan angka acak dalam [0, 4]. Karena cara kerja penyaringan, saya harus membuang karakter aktual dalam loop filter, yang menambahkan 1 byte.


0

GFortran , 120 byte

Tidak terlalu buruk, jika kita menggunakan RAN()fungsi yang sudah tidak digunakan lagi , yaitu pseudo -random, yaitu Anda mendapatkan urutan yang sama setiap kali. Cara yang tepat untuk menghasilkan angka acak di GFortran adalah dengan CALL RANDOM_SEED()dan CALL RANDOM_NUMBER(R)tapi itu banyak byte!

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

Cobalah online!


1
Keacakan pseudo diperbolehkan, jika itu cara terdekat Anda untuk melakukan tindakan acak.
Andrew

0

Oracle SQL, 133 byte

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)

Ia bekerja dengan asumsi bahwa data input disimpan dalam tabel t (x), misalnya

with t(x) as (select 'The cat ate my homework' from dual)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.