Düşen bir top haritası oluşturma


16

Giriş

Bu oyunu daha önce hiç duymamış olanlar için. Mümkün olduğunca uzun süre hayatta kalması gereken bir top oynuyorsun. Bu, sola veya sağa hareket ederek, deliklere gidilerek yapılır. Harita yukarı doğru hareket ettiğinden, daha uzun süre hayatta kalmak için aşağı doğru gitmeniz gerekir. Eğer varsa arama görüntüler için, muhtemelen demek hangi oyun biliyorum.

Görev

Pozitif bir tamsayı n verildiğinde , n katmandan düşen bir top haritası çıkar . Katmanlar arasında 4 yeni satır vardır. Katmanın genişliği, bir delik 5 olan 25 alt çizgi karakterinden oluşur . Bu, toplam genişliğin 30'a eşit olduğu anlamına gelir. Bu, her katmandan sonra rastgele kaydırılır. Geçerli bir katman örneği:

_______________     __________

Delik, tabaka bir silindir gibi gibi kenarlarda da olabilir:

  _________________________   

2 önde ve 3 arkada olduğunu unutmayın. Bir yapma tek genişliği 5 delik.

Test senaryoları

İçin n = 4, bu geçerli bir çıkıştır:

_______________     __________





______     ___________________





_______________________     __





  _________________________

Not: delikler eşit olarak dağıtılmalıdır. Sondaki ve / veya önde gelen yeni satırlara izin verilir.

Bu , yani en az bayt ile gönderme kazanır!


1
@DonMuesli Haha, bu herkesin başına gelebilir: p
Adnan

Yanıtlar:


7

Pyth, 19 bayt

VQ.>+*\_25*d5O30*b4

Burada deneyin!

açıklama

VQ.> + * \ _ 25 * d5O30 * b4 # Q = giriş

VQ # Q kez tekrarla
     * \ _ 25 # 25 alt çizgi
          * d5 # 5 boşluk
    + # altçizgi ve boşlukları kapat
  .> O25 # bu dizeyi 0-29 kez döndür
                * b4 # ayırıcı yeni satırları yazdırır

4

Yakut, 74 71 59

Alex A. sayesinde bana temelde bir çizgi olmanın stabby lambda kullanabileceğimi hatırlattığı için

f=->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}}

putssonuna bir satırsonu ekler (Ruby'nin yapmazken print), böylece 5satırlara güncellenir .
Değer Mürekkebi

Hepsi timesbana fordöngüde 3 bayt kaydetme işlevine sahip : D
Değer Mürekkep

1
57 bayt: ->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}} Burayı deneyin
Alex A.

Fonksiyonların adlandırılmasını gerektirmediğimiz için lambda'yı gönderimin bir parçası olarak atamanıza gerek yoktur.
Alex A.

1
Sen yapabilir (->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}})[input]ya da sadece onu aramak için atamanız gerektiğini belirtin. Bu sitede oldukça yaygındır.
Alex A.

3

Julia, 72 bayt

n->join([join(circshift(["_"^25*" "^5...],rand(1:30)))"\n"^5 for i=1:n])

Bu, bir tamsayıyı kabul eden ve bir dize döndüren anonim bir işlevdir. Bunu çağırmak için bir değişkene atayın.

25 alt çizgiden oluşan bir dize ve ardından 5 boşluk dizesi oluşturduk ve bunu bir dizi karaktere uyarladık. Dairesel olarak rastgele sayıda kaydırırız (1 ile 30 arasında), bir dizeye geri ekleriz ve 5 yeni satıra yapışırız. Bu işlem n kez tekrarlanır , burada n girdi olur. Elde edilen dizi birleştirilir ve döndürülür.

Burada deneyin


3

PowerShell 65 Bayt

0..$args[0]|%{-join("_"*25+" "*5)[($r=Random 25)..($r-29)];,""*5}

İçin bir döngü çalıştır N yineleme . Rastgele bir sayı alın ve sonunda 5 boşluk içeren bir alt çizgi dize oluşturun. Rastgele bir konumdan başlayarak çekilecek dizi olarak dizeye dizin. Negatif indeksleme sondan başlıyor. Buna tekrar katılın ve 5 yeni satır ekleyin.

Düzenleme: Neden -Maximumkonum olarak parametre için gerekli düşündüm bilmiyorum . TimmyD sayesinde bazı baytları traş ettim ve girdi almayı unuttum, böylece beni 65'e kadar geri götürdüm .


@TimmyD Birisi hala 1.0 olsaydı şaşırırdım. Yalnızca bir indirme olarak mevcuttu ve herhangi bir işletim sistemi ile birlikte gönderilmedi. 2.0 norm olarak düşünülmelidir.
Matt

@TimmyD PowerShell 1.0 söz konusu olduğunda bu noktaya katılıyorum . Bu siteyi kullanan herkes varsa bu beni şaşırtacaktır. 3.0 veya daha yüksek bir özellik kullansaydım bunu kesinlikle vurgularım.
Matt


2

SpecBAS - 93 bayt

1 a$="_"*25+" "*5: INPUT n: FOR i=1 TO n: r=1+INT(RND*30): ?a$(r TO)+a$( TO r-1)''''': NEXT i

25 alt çizgi + 5 boşluktan oluşan bir dize oluşturur, rastgele bir başlangıç ​​noktası alır ve dizeyi bu konuma ekler ve dizenin başlangıcını sona erdirir.

Kesme işareti yeni bir satırı zorlar, böylece ipin sonunda 1 ve 4 boş satır.


2

MATL , 23 bayt

:"95l25X"5Z"h30YrYS10ct

Çevrimiçi deneyin!

açıklama

:"           % take input n implicitly. Repeat loop n times
  95l25X"    %   row vector with number 95 ('_') repeated 25 times
  5Z"        %   row vector of 5 blank spaces
  h          %   concatenate vertically
  30Yr       %   random number uniformly distributed on [1,2,...,30]
  YS         %   circularly shift
  10c        %   newline character. Includes another newline when printed
  t          %   duplicate
             % implicitly end loop and display stack contents

2

Java, 177 bayt

İ ++ 'ı hareket ettirerek -1 bayt

-2 bayt bana orijinalinde anlamsız boşluk bırakarak

Char [] hiç ihtiyacım olmadığını fark için -34 bayt Blue

Çünkü biliyorsunuz Java.

n->{String s="";for(;n-->0;){int r=(int)(Math.random()*30);for(int i=0;i<30;){s+=i>r&i<r+6|r>24&i++<=r%25?" ":"_";}s+="\n\n\n\n";}return s;}

Hafifçe soluksuz:

Function<Integer, String> fallingBall = n -> {
    String s = "";
    for (;n-->0;) {
        int r = (int)(Math.random()*30);
        for (int i=0; i<30; i++) {
            s += i>r&i<r+6|r>24&i<=r%25?" ":"_";
        }
        s += "\n\n\n\n";
    }
    return s;
}

Java'nın bir String 'rotate' özelliği olmadığından farklı bir yaklaşım benimsemem gerekti. Deliğin başlangıç ​​indeksini temsil eden rastgele bir int 0-29 ürettim (OBO, çünkü >daha kısadır >=). Daha sonra her bir karaktere mantık karar verir

l[index] = (index>random && index<random+6) || (random>24 && index<=random%25) ? ' ' : '_';

Bu, bütünün "sarma" doğasını idare eder.


İ ++ 'ı en son kullandığım yere koyarak bir bayt kaydedebilirsiniz.
Mavi

Akıllı. Keskin ama akıllı. Daha akıllı hala bir şekilde parçacığımın ( s = "") başında anlamsız boşluk bırakıyor . Her ikisi de şimdi düzeltildi.
CAD97

Ayrıca char dizisinden kurtularak, char değişmezlerini dize değişmezleriyle değiştirebilir ve döngü için içeride s + = kullanabilirsiniz. Az önce test ettim
Blue

Btw harika cevap
Blue

Bunu yapmanın tek yoluna odaklandığım şey bu. -34 (!) Bayt.
CAD97

1

Python 3,5 - 109 113 bayt (her sonuç arasında 4 yeni satır yazdırmak için +4):

def g(a,j='_'*25+' '*5):
 for l in range(a):import random;n=random.randrange(len(j)+1);print(j[-n:]+j[:-n]+'\r'*4)

Kurtulmamış Form:

# j is the starting string with the 25 underscores and then 5 spaces at the end
def g(a,j='_'*25+' '*5):
    import random #Import the random module
    for l in range(a): # Do the following as many times as provided by the user
        n=random.randrange(len(j)+1) Get a random number in the range 0-29
        print(j[-n:]+j[:-n]+'\r'*4) #Shift the string characters right "n" times and print out the results with 4 new lines in between

Temelde olup biten, 25 alt çizgiden sonra 5 boşluktan oluşan bir 'j' dizgisinin "g" işlevine argüman olarak verilmesidir. Daha sonra rastgele modül içe aktarılır ve kullanıcı tarafından belirtildiği kadar çok sayıda aralıkta rastgele bir sayı seçilir 0 => 29ve "j" dizesi birçok kez sağa kaydırılır. Sonuç daha sonra her bir yinelemeden sonra, her sonuç arasında 4 yeni satır olacak şekilde yazdırılır.


Bu, aradaki yeni satırları da yazdırıyor mu?
Adnan

@AandN Şimdi öyle. :)
R. Kap

Aslında 4 satır yazdırmanız gerekir: s. Değişen Yani '\r'için '\r'*4muhtemelen işe gerekir. Ayrıca, ben değiştirmek düşünüyorum range(a+1)için range(a).
Adnan

@AandN Aslında, kullanmak range(a)gerçekten a-1satır sayısını yazdırır , bu nedenle range(a+1)kullanıcının sağladığı satır sayısını yazdırmanın en iyi yolu budur. Ayrıca, artık her sonuç arasında 4 yeni satır yazdırıyor.
R. Kap

Hmmm ben bu test, çünkü o, garip g(5)ve değişen bu yüzden, beş yerine 6 dizeleri yazdıran a+1için amuhtemelen bu giderirdi.
Adnan

1

Python, 119103 bayt

import random
s='_'*20+' '*5
def f(n,a=random.randint(0,25)):[print(s[a:]+s[:a]+3*'\n')for _ in' '*n]

En son güncellemeniz, rasgele varsayılan bir bağımsız değişkene koyduğunuz için çalışmaz, bu nedenle işlev her zaman aynı satır nzamanlarını verir
Sp3000 26:16
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.