Terminalimde yağmur yağıyor!


24

Zorluk Açıklaması

Terminalde yağmur simülasyonu göstermelisin.

Aşağıda verilen örnekte rastgele 100 yağmur damlası eklemek (dilinizin sunduğu varsayılan rastgele işlevi kullanın) koordinatlar, 0,2 saniye bekleyin ve sonra verilen süre sona erene kadar tekrar çizin. Yağmur damlasını temsil etmek için herhangi bir karakter kullanılabilir.

Parametreler

  • Birkaç saniye içinde yeniden çizme arasında bekleyin.
  • Yağmurun görünür olacağı süre. Bu sadece yineleme sayısını gösteren bir tamsayıdır. [Yani, yağmurun görünür olacağı net süre, bekleme süresi ile çarpılan bu tamsayıdır]
  • Yağmur sona erdiğinde görüntülenecek mesaj. (Bu ortalanmalı)
  • Ekranda gösterilecek yağmur damlası sayısı.

kurallar

  • Bir yağmur damlasını temsil etmek için tek bir bayt kullanılmalı ve herhangi bir şey olabilir, kediler ve köpekler bile.
  • Terminal boyutuna duyarlı olması gerekmez, bu da çeşitli terminal boyutları için hatayı işlemenize gerek olmadığı anlamına gelir. Terminal genişliğini ve yüksekliğini kendiniz belirleyebilirsiniz.
  • Standart golf kuralları geçerlidir.

Kod örneği ve çıktı

Bu, ncurses kullanarak python 2.7 ile yazılmış ungolfed sürümüdür.

import curses
import random
import time

myscreen = curses.initscr()
curses.curs_set(0) # no cursor please 
HEIGHT, WIDTH = myscreen.getmaxyx() 
RAIN = '/' # this is what my rain drop looks like 
TIME = 10 

def make_it_rain(window, tot_time, msg, wait_time, num_drops):
    """
    window    :: curses window 
    time      :: Total time for which it rains
    msg       :: Message displayed when it stops raining
    wait_time :: Time between redrawing scene 
    num_drops :: Number of rain drops in the scene 
    """
    for _ in range(tot_time):
        for i in range(num_drops):
            x,y=random.randint(1, HEIGHT-2),random.randint(1,WIDTH-2)       
            window.addstr(x,y,RAIN)
        window.refresh()
        time.sleep(wait_time)
        window.erase()

    window.refresh()
    window.addstr(HEIGHT/2, int(WIDTH/2.7), msg)


if __name__ == '__main__':
    make_it_rain(myscreen, TIME, 'IT HAS STOPPED RAINING!', 0.2, 100)
    myscreen.getch()
    curses.endwin()

Çıktı -

görüntü tanımını buraya girin


3
Gelecekte tekrar yayınlamak yerine orijinali düzenleyin. Eğer insanlar özelliklerin açık olduğunu düşünüyorlarsa, yeniden açmak için aday göstereceklerdir.
Buğday Sihirbazı

6
Metin ortalanmalı mı? Rasgele yağmur yağıyor mu, damlacıkların başlangıç ​​konumu önemli mi? Zamanı nasıl ölçüyorsun? Milisaniye, saniye, dakika? "Ekstra Puan" nedir?
Magic Octopus Urn

1
Eğer, A. Birimleri belirtin. B. Terminal boyutunu belirtin veya giriş olarak alın. ve C. Ekstra noktalar hakkındaki kısmı çıkarın; bu zorluk daha iyi tanımlanabilir.
Magic Octopus Urn

"Rastgele" derken, bunun "eşit derecede rastgele" anlamına geldiğini varsayabilir miyiz ?
Dijital Travma

3
Sanal alanda 1 gün genellikle yeterli değildir. İnsanların eğlence amaçlı ve çeşitli zaman dilimlerinden burada olduklarını unutmayın - hemen geri bildirim beklenmemelidir.
Dijital Travma,

Yanıtlar:


12

MATL , 52 bayt

xxx:"1GY.Xx2e3Z@25eHG>~47*cD]Xx12:~c!3G80yn-H/kZ"why

Girişler bu sırada: güncellemeler arasında duraklama, damla sayısı, mesaj, tekrar sayısı. Monitörün boyutu 80 × 25 karakter (kodlanmış).

GIF ya da olmadı! (Girişli Örnek 0.2, 100, 'THE END', 30)

görüntü tanımını buraya girin

Veya MATL Online'da deneyin .

açıklama

xxx      % Take first three inputs implicitly and delete them (but they get
         % copied into clipboard G)
:"       % Take fourth input implicitly. Repeat that many times
  1G     %   Push first input (pause time)
  Y.     %   Pause that many seconds
  Xx     %   Clear screen
  2e3    %   Push 2000 (number of chars in the monitor, 80*25)
  Z@     %   Push random permutation of the integers from 1 to 2000
  25e    %   Reshape as a 25×80 matrix, which contains the numbers from 1 to 2000
         %   in random positions
  HG     %   Push second input (number of drops)
  >~     %   Set numbers that are <= second input to 1, and the rest to 0
  47*c   %   Multiply by 47 (ASCII for '/') and convert to char. Char 0 will
         %   be displayed as a space
  D      %   Display
]        % End
Xx       % Clear screen
12:~     % Push row vector of twelve zeros
c!       % Convert to char and transpose. This will produce 12 lines containing
         % a space, to vertically center the message in the 25-row monitor
3G       % Push third input (message string)
80       % Push 80
yn       % Duplicate message string and push its length
-        % Subtract
H/k      % Divide by 2 and round down
Z"       % Push string of that many spaces, to horizontally center the message 
         % in the 80-column monitor
w        % Swap
h        % Concatenate horizontally
y        % Duplicate the column vector of 12 spaces to fill the monitor
         % Implicitly display

1
Nasıl bittiğini why:) :)
tkellehe

1
@tkellehe Profilinizdeki açıklamayı beğendim :-)
Luis Mendo

1
teşekkür ederim. Diliniz okumak çok eğlenceli. (Evet, MATL cevaplarınızı takip ediyordum lol)
tkellehe

10

JavaScript (ES6), 268 261 bayt

t=
(o,f,d,r,m,g=(r,_,x=Math.random()*78|0,y=Math.random()*9|0)=>r?g(r-(d[y][x]<`/`),d[y][x]=`/`):d.map(a=>a.join``).join`
`)=>i=setInterval(_=>o.data=f--?g(r,d=[...Array(9)].map(_=>[...` `.repeat(78)])):`



`+` `.repeat(40-m.length/2,clearInterval(i))+m,d*1e3)
<input id=f size=10 placeholder="# of frames"><input id=d placeholder="Interval between frames"><input id=r size=10 placeholder="# of raindrops"><input id=m placeholder="End message"><input type=button value=Go onclick=t(o.firstChild,+f.value,+d.value,+r.value,m.value)><pre id=o>&nbsp;

En azından tarayıcımda, çıktı "Tam sayfa" 'ya gitmek zorunda kalmadan Stack Snippet alanına sığacak şekilde tasarlandı, bu yüzden 702'den fazla yağmur damlası istemeniz durumunda çökecek.

Düzenleme: Çıktı alanım olarak bir metin düğümü kullanarak 7 bayt kurtardı.


İşlevi bir dizge olarak geçirerek birkaç bayt kaydedebilirsiniz setInterval. Ayrıca, neden kullanıyorsunuz textContentyerine innerHTML?
Luke

@ L.Serné Bir iç işlev kullanmak, dış işlevdeki değişkenlere başvurmamı sağlar.
Neil

Hata! Benim hatam, bunu farketmedi.
Luke

8

R, 196 192 185 bayt

Açıklamaya göre yazdığım sahte bir sürüm. Umarım OP'nin aradığı şey birazdır.

@Plannapus sayesinde bazı baytlar kaydedildi.

f=function(w,t,m,n){for(i in 1:t){x=matrix(" ",100,23);x[sample(2300,n)]="/";cat("\f",rbind(x,"\n"),sep="");Sys.sleep(w)};cat("\f",g<-rep("\n",11),rep(" ",(100-nchar(m))/2),m,g,sep="")}

Argümanlar:

  • w: Çerçeveler arasında zaman bekleyin
  • t: Toplam kare sayısı
  • m: Özel mesaj
  • n: Yağmur damlası sayısı

Örnek

Neden yukarı doğru yağıyor gibi görünüyor?

Düzenleme: Bu benim özelleştirilmiş 23x100 karakter R-studio konsolu olduğunu söylemeliyim. Boyutlar işleve kodlanmıştır, ancak prensip getOption("width")olarak konsol boyutuna göre esnek olması için kullanılabilir.

görüntü tanımını buraya girin

Ungolfed ve açıkladı

f=function(w,t,m,n){
    for(i in 1:t){
        x=matrix(" ",100,23);             # Initialize matrix of console size
        x[sample(2300,n)]="/";            # Insert t randomly sampled "/"
        cat("\f",rbind(x,"\n"),sep="");   # Add newlines and print one frame
        Sys.sleep(w)                      # Sleep 
    };
    cat("\f",g<-rep("\n",11),rep(" ",(100-nchar(m))/2),m,g,sep="")  # Print centered msg
}

Bu mükemmel görünüyor! +1 ve ben onun yukarı doğru olacağını sanmıyorum sadece algılayışınız lol
hashcode55 21

@plannapus. Realized rep()otomatik olarak timesargümanı yerle bir eder, bu yüzden de buna gerek kalmaz. Başka bir 7 bayt kaydedildi!
Billywob,

Çok güzel bir çözüm. Bağımsız değişkenleri işlemek için konsol boyutunu iterek bir bayttan tasarruf edebilirsiniz (izin veriliyorsa); matrisi rastgele doldurmak runifyerine , kullanarak başka bir baytı kaydedebilirsiniz sample. Bunun gibi:f=function(w,t,m,n,x,y){for(i in 1:t){r=matrix(" ",x,y);r[runif(n)*x*y]="/";cat("\f",rbind(r,"\n"),sep="");Sys.sleep(w)};cat("\f",g<-rep("\n",y/2),rep(" ",(x-nchar(m))/2),m,g,sep="")}
rturnbull

5

C 160 bayt

f(v,d,w,char *s){i,j;char c='/';for(i=0;i<v;i++){for(j=0;j<d;j++)printf("%*c",(rand()%100),c);fflush(stdout);sleep(w);}system("clear");printf("%*s\n",1000,s);}

v-Time the raindrops are visible in seconds.
d-Number of drops per iteration
w-Wait time in seconds, before the next iteration
s-String to be passed on once its done

Ungolfed versiyonu:

void f(int v, int d, int w,char *s)
{ 

   char c='/';
   for(int i=0;i<v;i++)
   { 
      for(int j=0;j<d;j++)
         printf("%*c",(rand()%100),c);

      fflush(stdout);
      sleep(w); 
   }   
   system("clear");
   printf("%*s\n", 1000,s);
}

Terminalimde test çantası

v - 5 seconds
d - 100 drops
w - 1 second wait time
s - "Raining Blood" :)

4

R, 163 karakter

f=function(w,t,n,m){for(i in 1:t){cat("\f",sample(rep(c("/"," "),c(n,1920-n))),sep="");Sys.sleep(w)};cat("\f",g<-rep("\n",12),rep(" ",(80-nchar(m))/2),m,g,sep="")}

Girintiler ve yeni satırlarla:

f=function(w,t,n,m){
    for(i in 1:t){
        cat("\f",sample(rep(c("/"," "),c(n,1920-n))),sep="")
        Sys.sleep(w)
    }
    cat("\f",g<-rep("\n",12),rep(" ",(80-nchar(m))/2),m,g,sep="")
}

24 satırlık bir terminal boyutuna 80 sütun ile uyarlanmıştır. wbekleme süresi, tkarelerin nsayısı, yağmur damlalarının sayısı ve mson mesajdır.

@ Billywob'un farklı kullanımdaki cevabından farklıdır sample: eğer çıktı büyüklüğü belirtilmezse, samplegirdi vektörünün (burada gerekli yağmur damlası sayısını ve karşılık gelen alan sayısını içeren bir vektör) bir argüman verir times. fonksiyon repvectorized). Vektörün boyutu tam olarak ekranın büyüklüğüne tekabül ettiği için, yeni çizgiler eklemeye veya onu bir matrise zorlamaya gerek yoktur.

Çıktı Gif


3

DüğümJS: 691 158 148 Bayt

Düzenle

İstenildiği gibi, ek özellikler kaldırıldı ve golf edildi.

s=[];setInterval(()=>{s=s.slice(L='',9);for(;!L[30];)L+=' |'[Math.random()*10&1];s.unshift(L);console.log("\u001b[2J\u001b[0;0H"+s.join('\n'))},99)

Kurallar boyut için dikkate alınmadığını belirtir, ancak bu sürüm ilk birkaç kare için bir aksaklık içerir. Öyle 129 bayt.

s='';setInterval(()=>{for(s='\n'+s.slice(0,290);!s[300];)s=' |'[Math.random()*10&1]+s;console.log("\u001b[2J\u001b[0;0H"+s)},99)

Önceki cevap

Belki de en iyi golf değil, ama ben biraz uzağa taşındı. Opsiyonel rüzgar yönü ve yağmur faktörü vardır.

node rain.js 0 0.3

var H=process.stdout.rows-2, W=process.stdout.columns,wnd=(arg=process.argv)[2]||0, rf=arg[3]||0.3, s=[];
let clr=()=>{ console.log("\u001b[2J\u001b[0;0H") }
let nc=()=>{ return ~~(Math.random()*1+rf) }
let nl=()=>{ L=[];for(i=0;i<W;i++)L.push(nc()); return L}
let itrl=(l)=>{ for(w=0;w<wnd;w++){l.pop();l.unshift(nc())}for(w=0;w>wnd;w--){l.shift();l.push(nc())};return l }
let itrs=()=>{ if(s.length>H)s.pop();s.unshift(nl());s.map(v=>itrl(v)) }
let d=(c,i)=>{if(!c)return ' ';if(i==H)return '*';if(wnd<0)return '/';if(wnd>0)return '\\';return '|'}
let drw=(s)=>{ console.log(s.map((v,i)=>{ return v.map(  c=>d(c,i)  ).join('') }).join('\r\n')) }
setInterval(()=>{itrs();clr();drw(s)},100)

Burada çalışan webm bakın


2

Noodel , rekabetçi olmayan 44 bayt

Dili yaptığımdan beri yapılacaklar listemde ortalanmış bir metin vardı ... Ama tembildim ve bu zorluğun sonuna kadar eklemedi. Yani, burada rekabet etmiyorum, ancak meydan okumayla eğlendim :)

ØGQÆ×Øæ3/×Æ3I_ȥ⁻¤×⁺Æ1Ḷḋŀ÷25¶İÇæḍ€Æ1uụC¶×12⁺ß

Konsolun boyutu çevrimiçi editörde iyi görünmeyen, ancak snippet için de 25x50'ye kodlanmış zor.

Dene:)


Nasıl çalışır

Ø                                            # Pushes all of the inputs from the stack directly back into the stdin since it is the first token.

 GQÆ×Ø                                       # Turns the seconds into milliseconds since can only delay by milliseconds.
 GQ                                          # Pushes on the string "GQ" onto the top of the stack.
   Æ                                         # Consumes from stdin the value in the front and pushes it onto the stack which is the number of seconds to delay.
    ×                                        # Multiplies the two items on top of the stack.
                                             # Since the top of the stack is a number, the second parameter will be converted into a number. But, this will fail for the string "GQ" therein treated as a base 98 number producing 1000.
     Ø                                       # Pops off the new value, and pushes it into the front of stdin.

      æ3/×Æ3I_ȥ⁻¤×⁺                          # Creates the correct amount of rain drops and spaces to be displayed in a 50x25 console.
      æ3                                     # Copies the forth parameter (the number of rain drops).
        /                                    # Pushes the character "/" as the rain drop character.
         ×                                   # Repeats the rain drop character the specified number of times provided.
          Æ3                                 # Consumes the number of rain drops from stdin.
            I_                               # Pushes the string "I_" onto the stack.
              ȥ                              # Converts the string into a number as if it were a base 98 number producing 25 * 50 = 1250.
               ⁻                             # Subtract 1250 - [number rain drops] to get the number of spaces.
                ¤                            # Pushes on the string "¤" which for Noodel is a space.
                 ×                           # Replicate the "¤" that number of times.
                  ⁺                          # Concatenate the spaces with the rain drops.

                   Æ1Ḷḋŀ÷25¬İÇæḍ€            # Handles the animation of the rain drops.
                   Æ1                        # Consumes and pushes on the number of times to loop the animation.
                     Ḷ                       # Pops off the number of times to loop and loops the following code that many times.
                      ḋ                      # Duplicate the string with the rain drops and spaces.
                       ŀ                     # Shuffle the string using Fisher-Yates algorithm.
                        ÷25                  # Divide it into 25 equal parts and push on an array containing those parts.
                           ¶                 # Pushes on the string "¶" which is a new line.
                            İ                # Join the array by the given character.
                             Ç               # Clear the screen and display the rain.
                              æ              # Copy what is on the front of stdin onto the stack which is the number of milliseconds to delay.
                               ḍ             # Delay for the specified number of milliseconds.
                                €            # End of the loop.

                                 Æ1uụC¶×12⁺ß # Creates the centered text that is displayed at the end.
                                 Æ1          # Pushes on the final output string.
                                   u         # Pushes on the string "u" onto the top.
                                    ụC       # Convert the string on the top of the stack to an integer (which will fail and default to base 98 which is 50) then center the input string based off of that width.
                                      ¶      # Push on a the string "¶" which is a new line.
                                       ×12   # Repeat it 12 times.
                                          ⁺  # Append the input string that has been centered to the new lines.
                                           ß # Clear the screen.
                                             # Implicitly push on what is on the top of the stack which is the final output.

<div id="noodel" code="ØGQÆ×Øæ3/×Æ3I_ȥ⁻¤×⁺Æ1Ḷḋŀ÷25¶İÇæḍ€Æ1uụC¶×12⁺ß" input='0.2, 50, "Game Over", 30' cols="50" rows="25"></div>

<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


1
Ah bu benim araç kutumda olması harika bir dil haha! Her neyse, meydan okumayı sevdiğin için sevindim :) +1
hashcode55

2

Ruby + GNU Core Utils, 169 bayt

İşleve ilişkin parametreler, bu sırada bekleme süresi, yineleme sayısı, mesaj ve yağmur damlası sayısıdır. Okunabilirlik için yeni satırlar.

Core Utils tputve için gerekliydi clear.

->w,t,m,n{x=`tput cols`.to_i;z=x*h=`tput lines`.to_i
t.times{s=' '*z;[*0...z].sample(n).map{|i|s[i]=?/};puts`clear`+s;sleep w}
puts`clear`+$/*(h/2),' '*(x/2-m.size/2)+m}

1

Python 2.7, 254 251 bayt

Ncurses kullanmadan kendi denemem.

from time import*;from random import*;u=range;y=randint
def m(t,m,w,n):
    for _ in u(t):
        r=[[' 'for _ in u(40)]for _ in u(40)]
        for i in u(n):r[y(0,39)][y(0,39)]='/'
        print'\n'.join(map(lambda k:' '.join(k),r));sleep(w);print '<esc>[2J'
    print' '*33+m

Beni bayt düzeltmek ve kaydetmek için @ErikTheOutgolfer teşekkür ederiz.


Tek forbir satıra bir döngü koyamazsınız (olduğu gibi 40)];for i in u(). Ayrıca '[2J'sanırım bir ESC karakterine ihtiyacınız var . Ayrıca, içinde fazladan bir boşluk vardı u(n): r[y. Yine de 249'u nasıl saydığını bilmiyorum. Bulduğum tüm konular burada düzeltildi .
Outgolfer Erik,

Gönderdiğim kod benim için çalışıyor. Ve evet aslında yanlış saydım, beyaz girintili alanı saymadım, bilmiyordum. Bağlantı için teşekkürler! Düzenleyeceğim.
hashcode55,

@EriktheOutgolfer Oh ve evet, bu ESC karakteriyle ilgili olarak, kaçış dizisine gerek yok. Sadece ekranı temizlemek için ansi kaçış dizisi olan “ESC [2J” yi etkili bir şekilde yazdırır. Yine de imleç konumunu sıfırlamaz.
hashcode55,

Daha da çok golf oynayabilirsin :) Ama kodun altında <esc>bir değişmez 0x1B ESC baytını belirten bir not eklemelisin . Bayt sayısı 242 , 246 değil.
Outgolfer Erik,

@EriktheOutgolfer Oh teşekkürler!
hashcode55

1

SmileBASIC, 114 bayt

INPUT W,T,M$,N
FOR I=1TO T
VSYNC W*60CLS
FOR J=1TO N
LOCATE RND(50),RND(30)?7;
NEXT
NEXT
LOCATE 25-LEN(M$)/2,15?M$

Konsol ölçüsü daima 50 * 30'dur.


1

Perl 5, 156 bayt

İçin 154 bayt kodu + 2 -pl.

$M=$_;$W=<>;$I=<>;$R=<>;$_=$"x8e3;{eval'$-=rand 8e3;s!.{$-}\K !/!;'x$R;print;select$a,$a,$a,$W;y!/! !;--$I&&redo}$-=3920-($l=length$M)/2;s;.{$-}\K.{$l};$M

160x50 sabit bir boyut kullanır.

Çevrimiçi görün!


Perl 5, 203 bayt

İçin 201 bayt kodu + 2 -pl.

$M=$_;$W=<>;$I=<>;$R=<>;$_=$"x($z=($x=`tput cols`)*($y=`tput lines`));{eval'$-=rand$z;s!.{$-}\K !/!;'x$R;print;select$a,$a,$a,$W;y!/! !;--$I&&redo}$-=$x*($y+!($y%2))/2-($l=length$M)/2;s;.{$-}\K.{$l};$M

Kullanım tputterminalin boyutunu belirlemek için.

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.