Kedi tekrar girişini yedi!


30

Bir kedi programı oluşturun, yani girdi alan ve basan bir program.

... Bunun dışında, program rasgele karakterleri girişinizden uzağa alır ve bunun yerine yazdırır.

Girişteki her karakter, programla kaldırılmak için genellikle eşit oranlara sahip olmalıdır, ancak bunu yapmak zor olduğundan, her karakter için oran en çok% 10 değişebilir.

Programınız girişi almalı, ardından girişten karakterleri rasgele kaldırmalı ve ardından bu sürümü tekrar yazdırmalıdır. (Dilinizin yeni satırları yazdırması gerekebileceği durumlarda takip eden yeni satırlarla veya diğer karakterlerle yazdırabilirsiniz.)

Girdi olsaydı, BOOOWLtüm Os'ları eşit şansla kaldırmamalıydı: her karakter (benzersiz değil) düşünülmeli, bu nedenle 1/5 şansı olan her O'nun yerine (örneğin), her O'nun 1 olması gerekir. / 5 şans, bu yüzden yerine orada olmanın bir 1/5 şans BWLbir 1/5 şans olmalı BOWL, BOOWL.

Giriş, STDIN veya en yakın eşdeğeri ile sınırlıdır.

Her karakter olmalıdır % 10 minimum ve% 30 şans maksimum kaldırılmalıdır.

Her karakterin oranları ayrı ayrı hesaplanmalıdır.

Dilinizin herhangi bir bileşenini, işlev görür ya da başka bir şey yapıp, rastgele eylemleri destekleyerek kullanabilirsiniz.

Çıktı STDOUT ya da en yakın eşdeğerde olmalıdır. Dilinizde STDOUT varsa, hiçbir şekilde çıkış yapmayın. Diliniz metin olarak metin çıkarıyorsa, en yakın eşdeğerini kullanın (C'nin karakter dizisi çıktısı burada TAMAM).

Bu kod golfü. En kısa program kazanır.


4
Belirli bir karakterin çıkarılması için her zaman% 10 ile% 30 arasında bir şans olmalı mı? Yoksa bu sadece örnek amaçlı mı?
Attika

2
"bir karakter kümeleri" ile ne kastediyorsunuz? girdi bir kerede BOWL OF SOUPtüm Osilinmiş olabilir mi?
roblogic

1
Şimdiye kadarki tüm cevaplar, bir karakterin çıkarılması için% 20 sabit bir şans kullandı. Sorunun amacının tüm karakterlerin aynı olasılıklara sahip olduğundan emin değilim.
Nzall

3
Output must be through STDOUT, as a text. Do not output a character array.<- Bir karakter dizisi çıkarmanıza izin veren bir dilim var (çıkıştan önce düzleştirilmiştir). Bu izin verilmedi mi? Bir dize temelde bir karakter dizisi olan C gibi dillere ne dersiniz?
Ismael Miguel,

1
En yakın eşdeğerini kullanın. C'nin karakter dizileri, metne en yakın eşdeğer oldukları için TAMAM.
Andrew,

Yanıtlar:


10

Japt -f , 2 bayt

Bu -fbayrak "programı ilk girişteki her bir öğe üzerinde çalıştırır, bir truthy değeri döndürenlerin bir dizisini çıkarır." 0 (dahil) ve 5 (özel) arasında rasgele bir sayı döndürür. JavaScript gibi, 0 da Japt’da sahtedir.

Dene


2
Zamanda geriye gidiyorum, bu sorunun nerede olduğu bir dil yapıyorum ve sonra geri dönüp cevabımı gönderiyorum ya da belki boş bir dize yapmıştım: p
Andrew

Komut satırı bayrakları bayt saymak sayılmaz mı?
Daniel Vestøl

1
@ DanielVestøl -fBaşlıktaki, üstüne tıklayın .
Ismael Miguel,


1
şaka oldu ama tamam
Andrew

8

Python 3 , 63 bayt

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

Çevrimiçi deneyin!

Python 2 , 67 65 bayt

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

Çevrimiçi deneyin!

Her karakterin% 20 arı yetiştirme şansı düştü.

Farklı yaklaşım, aynı uzunluk:

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

Çevrimiçi deneyin!


63 bayt bir işlevle piton 2'de
attinat

Kurallar açıkça bir program Create a cat program, a.k.a a program that takes an input and prints it.
yazmayı belirtir

Bu sadece girişin ilk satırını okur.
AKX

Problem birden fazla satır okumak zorunda olduğu anlamına gelmiyor.
movatica

8

Kömür , 4 bayt

ΦS‽⁵

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

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

Sen herhangi bir numarayı kullanabilirsiniz 4için 10şansını elde etmek 25%için 10%sırasıyla.


7

Befunge-98 (PyFunge) , 11 bayt

>#@~3j4???,

Çevrimiçi deneyin!

Her karakterin kaldırılma şansı% 25'tir. Bu karar üç ?talimatla verilir.

?program sayacını eşit olasılıkla dört yönden birine ayarlar. Bu durumda, yukarı ve aşağı aynı talimatlara geri sarılır, böylece bunları seçenek olarak görmezden gelebiliriz.

?S ormanından çıkmanın iki yolu vardır : sağa (çıkış) ve sola (çıkış yok). Bu durum, bu nedenle ortadan başlayarak ise, simetrik ?bir orada p2=1/2 çıkış olarak şansı. Sağdan başlayarak eğer çıkışı şansı ?olan . Bu nedenle, bir karakteri okuduktan sonra, çıkıp çıkmayacağını belirlemek için en sağa atlarız .p3=1/21+1/2p2=3/4?


5

Octave , 23 bayt

Girdiyle aynı boyutta bir dizi oluşturur (Octave'deki dizeler karakter dizileridir), rastgele sayılardan büyük olup olmadığını kontrol eder 0.2ve ardından karakterleri karşılık gelen konumlara çıkarmak için mantıksal dizin oluşturma kullanır.

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

Çevrimiçi deneyin!


5

Jöle , 9 5 bayt

5X’µƇ

Çevrimiçi deneyin!

Jelly dizesini bağımsız değişken olarak alan ve işlenen Jelly dizesini döndüren bir monad. Tam bir program olarak kullanıldığında çıktıyı dolaylı olarak yazdırır. Her karakterin kaldırılma şansı% 20'dir.

açıklama

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

5

Japt , 3 bayt

Her karakterin çıkarılma şansı 1'de birdir. 5Arasındaki şey değiştirilebilir 4& 9dahil, ya Ailişkin 10oran değiştirmek için.

Æ5ö

Dene

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


5

05AB1E , 5 4 bayt

ʒ₄Ω≠

@Grimy sayesinde -1 bayt .

Çevrimiçi deneyin veya aynı programı 10 kez çalıştırın .

Her karakterin bırakılma% 25 oranında değişmiştir.

Açıklama:

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

ayrıca olabilir _( ==0).


2
5L-1 için olabilir (şansı% 20 ile% 25 arasında değiştirir, bu hala kabul edilebilir).
Grimmy

@Grimy Güzel bir, teşekkürler! :)
Kevin Cruijssen

4

MATL , 9 bayt

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

Çevrimiçi deneyin!


4

Pyth , 8 5 bayt

sfO4Q

Çevrimiçi deneyin!

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

Önceki sürüm, 8 bayt:

s*Vm!!O4

Çevrimiçi deneyin!

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

Qgiriş python-esque değilse bir hata atar. Örneğin hatalar [1veya a/b. Q, wve zyalnızca tek satırlık giriş için çalışacak, bu nedenle en iyi seçenek muhtemelen olacaktırj.z
ar4093 11

4

Cubix , 20 bayt

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

Çevrimiçi deneyin!

Kurtulmayı başaramayacağım bir takım no-op'larım olduğu için beklediğimden daha uzun. Karakter bırakma şansı% 25'tir. Bunun tamam olduğunu varsayıyorum.

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

Çalıştırılmasını izle

Kısa açıklama:

  • A|A bu, yığını başlatır, Tümünü gir, geri yansıt, Tümünü gir (sadece bir EOI -1)
  • ;? yığının pop, EOI (-1) için test edin.
  • _?@ eğer negatifse, teste geri yansıtın ve durduğunda bitin
  • $D\rastgele yön belirleyicisine atla .
    • yön belirleyiciden 3 yön ofor çıkışa, sonra tekrar tekrar ilmeğe doğru ilerler, biri oyolunda özlüyor ve doğrudan döngüye gidiyor.

3

APL (dzaima / APL) , 10 9 bayt SBCS

Anonim zımni önek işlevi. Her karakterin tamamen% 20 kaldırılması şansı var.

⊢⌿⍨4≥∘?5¨

Çevrimiçi deneyin!

 her karakter için sıfır

? her karakter için rastgele tam sayı aralığı 1-5

4≥ 4 veya daha küçük olan tam sayılar için Boole maskesi

⊢⌿⍨ bu maskeyi kullanarak argümanı süz


3

Retina , 15 bayt

/./_?(`.







Çevrimiçi deneyin! Açıklama:

/./_

Her karakteri ayrı ayrı işleyin.

?(`

Rasgele bir değiştirme yapın. İlk ikame karakteri silerken, diğer üçü değişmeden bırakarak 25%karakteri silme şansını verir . Bu, ilave yeni satır çiftleri eklenerek gerektiği gibi azaltılabilir.


3

R , 32 23 bayt

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

Çevrimiçi deneyin!

Bir karakter vektörünü girdi olarak alan ve işlenmiş bir karakter vektörünü döndüren bir işlev. Her karakterin kaldırılma şansı% 20'dir.

7 bayt tasarrufunda yardımcı olmak için @Roland ve @Gieppeeppe'ye, ayrıca 2 tane daha @JDL'ye teşekkürler!


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

@Roland ile aynı hat boyunca function(x)x[rf(x,1,1)>1]; df(1,1,1)hakkındadır 0.16hile yok ki.
Giuseppe

veya rt(x,3)>1(yaklaşık% 20 şans)
JDL

2
@JDL <1, ama teşekkürler! Başka bir 2 kaydedildi.
Nick Kennedy

3

T-SQL 2012, 83 bayt

0 veya 1 karakter kaldırarak giriş boyunca sağdan sola döngü.

Her karakterin kaldırılması için% 25 şans.

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

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

Açıklama:

rand()*2stuffkomutta kullanılamayan bir kayan nokta döndürür .

Bu str, en yakın tam sayıya yuvarlama işleminden sonra bir değişkene dönüştürür. Şamandıra bir değişkene dönüştürülüyor (bu, stuffher ikisinde de üçüncü parametre olarak izin verilmiyor ).

Bu varchar% 25 '2',% 50 '1',% 25 '' 0 '' olma şansına sahiptir. 2'ye bölerek, sonuç olarak% 25 sonuç elde etme şansı vardır. Bu bölüm varchar'ı bir tam sayıya dönüştürür.

Tamsayı, stuffişlevde beklenen üçüncü parametredir .

Çevrimiçi deneyin


Çok güzel bir numara STR, bunu hatırlamak zorunda kalacağım. (Sayılmamış DECLARE) kodunuzu (sayılan) kodunuzdan geri çevirmenin adil olduğundan emin değil ; ama bu değişen sadece ekstra ortadan kaldırabilir beri size 1 byte mal olacak SETolanDECLARE @ INT=len(@i)
BradC

@ BradC katılıyorum ve gelecekte omzunda
olmamayı

2

J , 10 bayt

#~5>6?@$~#

Çevrimiçi deneyin!

Adam'ın APL cevabına benzer şekilde, aslında ona bakmadan önce yazdım.

  • 6.. $~ #Giriş uzunluğu alın #ve şekil $~uzun bir liste halinde numara 6.
  • ?@Bu listedeki her altı kişiye bir kalıp gibi davranın ve yuvarlayın ?.
  • >5Kalıp 5'ten az mı (olası değerler 0,5'tir)? Bir bit maskesi oluşturmak için bu boolean sonucu kullanın.
  • #~ Girişi o maskeyle filtreleyin.


2

Javascript,  46   44  51 bayt

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

Eklenen STDOUT gereksinimi nedeniyle +7 bayt

Birjolaxew'a -2 bayt teşekkür


orijinal cevap: STDOUT gereksinimi olmadan 44 bayt

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

İşlevin adını kullanmadığınız için, işlevin kendisini sağlamasına izin verilir . Çıkarılması f=sizi 44 bayta indirir. Ayrıca, sizi biraz kurtarması gereken bir dizi olarak giriş / çıkış yapabilirsiniz.
Birjolaxew

@Birjolaxew Emin değilim ama soru anladığım kadarıyla eğer dilde karakter varsa char dizi kullanımına izin
vermeyin

Evet, Andrew yorumumdan sonra soruyu ek şartlarla düzenledi. Bu, genellikle kaşlarını çattı, çünkü daha önce geçerli olan cevapları geçersiz kılıyor (bu durumda ilk cevabınızın "Çıktı STDOUT aracılığıyla olmalı" gerekliliğine uyup uymadığı bile tartışmalı).
Birjolaxew

Ne join``demek istiyorsun? Spesifikasyonda bulamıyorum (çünkü ne olduğunu gerçekten bilmiyorum)
nick zoum

1
es6 içinde @ nickzoum eşittirjoin("") mdn revelent page
jonatjano

2

Scala , 51 46 30 bayt

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

Çevrimiçi deneyin!

PS. Diğer birçok çözümde olduğu gibi, kömür düşürme olasılığı% 20'dir.

Güncelleştirme:

-5 bayt flatMap Option [String] yerine String kullanarak

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

Filtre kullanarak 30 bayt

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

1
Sen değiştirerek 7 bayt kapalı tıraş edebilirsiniz scala.math.randometmek math.randomve 0.2karşı .2. ^ Böyle kullanarak hile güzel.
Kjetil S.

@KjetilS, teşekkür ederim. Ayrıca bir çözüm olarak işlev tanımları yerine işlev değişmezlerini de gönderdim. Buna göre kabul edilebilir: codegolf.stackexchange.com/questions/3885/…
Dr Y Wit 10

2

C # (Visual C # Etkileşimli Derleyici) , 71 bayt

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

Çevrimiçi deneyin!


Bence <1 çok fazla yiyor. Belki <3 veya <4 problemin parametreleriyle eşleşir. Yine de bu kodun uzunluğunu değiştirmez.
Luca

Bir süredir C # ile programlanmadım, ama neden new Random().Next(5)doğrudan mümkün değil?
Kevin Cruijssen

1
@KevinCruijssen Çünkü o zaman her sayı için aynı tohum kullanılacak, bu yüzden her sayı aynı olacak. Sadece bir deneyin new Random().Next(5), elde edeceğiniz tek şey bütün girdi ya da hiçbir şey.
Ignorance'ın

1
@KevinCruijssen kullanırken new Random(), varsayılan tohum değeri her milisaniyede bir artış sağlayan Environment.TickCount değeridir. Hepsi aynı milisaniyelik kene içinde yaratılmışlarsa, hepsinde aynı tohum bulunur. Cevap sadece tek bir Rastgele örneği kullanıyor ve çağrıldığında iç tohum değerini güncelliyor - yani Next () her çağrıldığında farklı bir çıktı değeri yaratıyor. Net Core, ancak tohum üretmek için bir singleton RNG kullanır, bu yüzden bu sorunu yok
Zac Faragher,

1
@ BenjaminUrquhart Sabit, ancak 26 bayt eklendi. Ayrıca, bir kimse girişin olması gerektiğini söylemez STDIN, ancak restricted to STDIN or closest equivalentişlev argümanları en yakın eşdeğer olabilir, ancak bunu yapmayacağım
Cehalet


1

C (gcc) , 50 bayt

Bu program% 20 oranında bir mektup bırakma şansına sahiptir. Ne yazık ki rasgele sayı üreteci ekilmiyor, bu yüzden her çalıştırmada aynı diziyi elde ediyorsunuz. Temel olarak tek numara, EOF'deki döngüyü durdurmak için giriş karakterini tersine çevirmektir.

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

Çevrimiçi deneyin!

C (gcc) , 64 59 bayt

-5 bayt için ceilingcat sayesinde.

Eğer RNG her seferinde seribaşı istiyorsa.

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

Çevrimiçi deneyin!


main()Code Golf başvuruları için kullanmak zorunda değilsiniz , ayrıca gerekli olanı yapan keyfi bir fonksiyon tanımlayabilirsiniz. Böylece yazabilirsin f(c){...}.
G. Sliepen

1

Lua , 69 68 bayt

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

Çevrimiçi deneyin!

Çok basit, ama en kısa sürüm gibi görünüyor: karakterin üzerine stdin karakterini yineleyin ( io.lines… adında yanıltıcıdır), daha sonra rastgele değere göre bir ya da boş dize yazdırın (örneğin hiçbir şey).


1

Java

Sonlanmayan: 82 bayt

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

Sonlandırma (TIO): 105 bayt

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

Stdout ile uğraşmak gerçekten gerekli mi? Diğer cevaplar sadece sadece bir dize dönüştüren bir fonksiyon yaratır. Java'ya karşı haksız görünüyor. Eğer bu C # çözüm geçerlidir, ardından s->s.filter(c->Math.random()<.2)da olduğunu.
Holger,

@Holger Input is restricted to STDIN or closest equivalent.ve Output must be through STDOUT or the closest equivalent. If your language does have STDOUT, do not output in any other way.Yani hayır, bu cevap geçerli değil
Benjamin Urquhart

1

Zsh , 53 41 bayt

-12 , GammaFunction sayesinde

41 bayt: çevrimiçi deneyin!

Karakter dizisi girdi dönüştürür, sonra her eleman yazdırmaya çalışan co yemiş sürece tarafından, ((RANDOM%4))yanlış değerlendirmek!

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

53 bayt: çevrimiçi deneyin!

Dize uzunluğu üzerinde daha basit, ancak ayrıntılı bir yineleme.

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

1
Akıllı kullanımı \c, bunu hatırlamazdım! Hala yapılacak birkaç optimizasyon var ...
GammaFunction

Hoş, zekice kullanımı RANDOMve dizi dönüşümü
roblogic

1

Zsh , 50 bayt

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

Çevrimiçi deneyin!

RobLogic'in cevabına benzer, ancak giriş gereksinimlerini daha yakından takip etmek ve ters eğik çizgi içeren girişlerde çalışır.

"$(<&0)"yerine "<&0"veya $(<&0)ikisinin yerine geçmediği için ikincisi yenileri yer. -nEBayrakları çıkış sekansları olarak incelene tersbölüleri önlemek ve yeni satırlar yerleştirilmiş önlemek için gereklidir.

echo -nE


1

MathGolf , 5 bayt

æƒ√∞*

Çevrimiçi deneyin!

açıklama

æ       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

Her karakter, rastgele değere bağlı olarak 0 veya 1 kez tekrarlanır. Karekökten sonra beklenen değer değiştirildiğinden, her karakterin çıkarılma olasılığı% 25'tir.

Alternatif 5 bayt

gÉ;4w

Karakterleri [0, 4] 'te rasgele bir sayı ile filtreleyin. Filtrelemenin nasıl çalıştığı nedeniyle, 1 byte ekleyen filtre döngüsündeki gerçek karakteri atmam gerekiyor.


0

GFortran , 120 bayt

Çok kötü değil RAN(), sözde -random olan kullanım dışı fonksiyonu kullanırsak, yani her seferinde aynı sırayı alırsınız. Gfortran rasgele sayı üretmek için uygun yolu ile CALL RANDOM_SEED()ve CALL RANDOM_NUMBER(R)ancak bayt demek!

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

Çevrimiçi deneyin!


1
Sözde rastgeleliğe izin verilir, eğer rastgele eylemler gerçekleştirmeniz için en yakın yol buysa.
Andrew,

0

Oracle SQL, 133 bayt

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)

Girdi verilerinin t (x) tablosunda saklandığı varsayımıyla çalışır, örn.

with t(x) as (select 'The cat ate my homework' from dual)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.