Çok Basit Üçgenler


47

Olumlu bir tamsayı (stdin, komut satırı veya function arg aracılığıyla) alan ve bu küçük üçgenlerin birçoğunu, hangi yöne döndüklerini değiştirerek bir dizesini basan veya döndüren bir program veya işlev yazın:

 /\
/__\

Bu tek üçgen giriş ise çıktıdır 1.

Giriş ise 2, çıkış

  ____
 /\  /
/__\/

Giriş ise 3, çıkış

  ____
 /\  /\
/__\/__\

Giriş ise 4, çıkış

  ________
 /\  /\  /
/__\/__\/

Ve bunun gibi. Programınız 2 16 - 1 = 65535'e kadar olan girişleri desteklemelidir .

ayrıntılar

  • En soldaki üçgen daima yukarıyı gösterir.
  • Sondaki boşluklar olabilir, ancak gereksiz ön boşluklar olmayabilir.
  • İsteğe bağlı bir takip hattı olabilir.
  • 1Çıktı için iki satır uzun olduğunu unutmayın, aksi takdirde üç. Bu gereklidir.
  • Bayt cinsinden en kısa gönderme kazanır.

Yanıtlar:


32

Pyth, 44 42

ItQpdd*\_*4/Q2)jbms<*dQhQ,c" /\ "2,\/"__\\

İlk satır:

ItQpdd*\_*4/Q2)
ItQ           )    If the input is not 1
   pdd             Print two spaces
      *\_*4/Q2     Then groups of 4 underscores, repeated input/2 times.

Diğer iki satır, ikinci satırın + 1 kez girdi " /"ve "\ "değişken girdiğini ve üçüncü satırın aynı şekilde oluştuğunu "/"ve "__\"değiştirildiğini fark ederek üretilir .


158
44 grevdeyken hala normal 44 :(
Doktor

4
42 . Tabii ki!
mbomb007

48
@Optimizer: 44 görünüşte duyduğunuz üzüntünün sorudan veya bu cevaptan daha fazla oy aldığını sonsuz buluyorum .
Alex A.

6
Leo,

3
@AlexA. Optimizer’in 44’ün görünüşüne olan hüznüne ilişkin eğlencenizin, bu sorudan veya bu cevaptan daha fazla oy aldığını hiç durmadan eğlendirici buluyorum.
isaacg

24

SQL, 182 175 173 187 bayt

Bu en kısa zamanda olacağından değil, fakat sql'yi en aza indirmeye çalışmak hala eğlenceli;) lol Bunu Oracle 11'de yaptım, ancak bunlar temel SQL olmalı. [edit] belirtildiği gibi, input = 1 kuralı ne zaman uygulamadım - sadece 2 satır göster. Bunu yapmanın daha iyi bir yolunu düşünemiyorum, ancak v mantığını değiştirerek bir kaç byte kurtardım;) daha önce tekrarlamak zorunda kalmadan önce 2 tane ekleyerek bir kaç byte kurtardı [/ edit]

select decode(&i,1,'',rpad('  ',v,'____')||z)||rpad(' /',v,'\  /')||decode(y,1,'\')||z||rpad('/',v-1,'__\/')||decode(y,1,'__\')from(select 2+floor(&i/2)*4v,mod(&i,2)y,chr(10)z from dual);

[edit1] bazı gereksiz boşlukları kaldırdı [/ edit1] [edit2] değiştirildi && i sadece & i olarak değiştirildi. 2 karakter düşürür, ancak kullanıcıyı iki kere üçgen sayısını girmeye zorlar ...: PI "iyi kodlama alışkanlıklarımı" kullanarak && i 2 byte kullanmaya başladı! Korku!! [/ Edit2]

Açıklama (not: Bu açıklamada && 1 kullanıyorum, bu yüzden sadece bir kez sorar, yukarıdaki & 1 kod alanından tasarruf eder, ancak birden çok kez sorar;)

 select  -- line 1
     decode(&&1,1,'',   -- don't need line 1 if input is 1
     rpad('  ',v,'____') || z ) || -- every pair of triangles
     -- line 2
     rpad(' /',v,'\  /') ||  -- every pair of triangles
          decode(y,1,'\') || z || -- add the final triangle, input: 1,3,5 etc.
     -- line 3
     rpad('/',v-1,'__\/') ||  -- every pair of triangles
          decode(y,1,'__\')   -- add the final triangle, input: 1,3,5 etc.
from (select 2+floor(&&i/2)*4 v,   -- common multiplier. 4 extra chars for every triangle pair
             mod(&&i,2) y,  -- Flag for the final triangle (odd inputs, 1,3,5, etc)
             chr(10) z  -- CR, here to save space.
        from dual);

Çıktı

  SQL> accept i
  1
  SQL> /

   /\
  /__\


  SQL> accept i
  2
  SQL> /

    ____
   /\  /
  /__\/


  SQL> accept i
  3
  SQL> /

    ____
   /\  /\
  /__\/__\


  SQL> accept i
  12
  SQL> /

    ________________________
   /\  /\  /\  /\  /\  /\  /
  /__\/__\/__\/__\/__\/__\/


  SQL>

1
Sonra boşluğu kaldırmak işe yarar frommı? Öyleyse bu size bir bayt kazandırır.
Alex A.

aman tanrım .. bu fındık. sadece denedim .. ve sonra "şehre gitti" hangi boşlukları çıkarabileceğimi çıkardı ... Oo Bu emici şimdi okunamıyor .. ama hala çalışıyor;) lol (Takma adın hala böyle çalıştığına inanamıyorum .. Oo hehe )
Aynen

Ben sooo kafamda karıştı! Oo En küçük boyuta yakın hiçbir yerde .. henüz .. yukarı oy! Oo vay.
Aynen

2
Genellikle, gönderiler insanların gönderiminizi beğendiğini belirtir; çünkü yaratıcıdır, kullanılan dil nadirdir veya herhangi bir sebepten dolayıdır. Deneyimlerime göre en kısa kod golf cevabının en yüksek oy olması da nadir. Dolayısıyla, bu en kısa cevap olmasa da, topluluk bunu iyi bir karar olarak kabul etti. :)
Alex A.

@Alex .. cool, gravy :) (Bunu Excel'de tekrar denemek zorunda kalacağım ... lol)
Ditto

11

Python 2, 89 88 87 85 83 adlandırılmış / adlandırılmamış

f=lambda n:1%n*("  "+n/2*4*"_"+"\n")+(" /\ "*n)[:2+2*n]+"\n"+("/__\\"*n)[:n-~n+n%2]

(Bir bayt için @orlp ve diğer üç için @ xnor'a teşekkürler)

Bu bir int alır nve satırlar yaklaşımı kullanarak üçgenleri bir dize olarak döndüren bir işlevdir .

örneğin print f(10)verir

  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

İlk satır için yerine (n>1)*kullandığımız 1%n*beri 1%n0 eğer olduğunu n == 1ve 1 eğer n > 1.


1
Sen dönüm, bir karakteri kapalı tıraş edebilirsiniz " /\\ "içine " /\ ".
orlp

Bu lambda Python 3'te de çalışmıyor mu?
mbomb007

2
@ mbomb007 Orada bir zemin bölümü var
Sp3000

@orlp Şimdi, daha fazla kafa karışıklığı eklemek, ancak yorumumu silmeme izin verin;)
FryAmTheEggman

"\n".join()Liste, ilk öğeyi koşullu olarak kaldırmak için kullanılmış olsa bile, 3 öğeden şüpheleniyorum . Belki de böyle bir şey b*(x+"\n")+y+"\n"+zkısadır?
xnor

7

JavaScript (ES6), 101 109

Yol çok uzun

f=(n,z=a=>a.repeat(n/2))=>(n>1?'  '+z('____')+'\n ':' ')+z('/\\  ',w=' /'[++n&1]+'\n')+w+z('/__\\')+w

açıklama

İşlev tanımı için yağ okunun kullanılması. Ayrıca {}blok yok : fonksiyon gövdesi, dönüş değeri olan tek bir ifadedir. f=(a,b,c)=>expreşittir

function f(a,b,c)
{
  return expr;
}

Tek bir ifadenin içinde ifveya gibi ifadeler kullanamazsınız var, ancak

  • varsayılan değerlere sahip parametreler yerel değişkenler olarak kullanılabilir
  • koşullu ifadeler ?:yerine iyi çalışırif else
  • virgül operatörünü kullanarak daha fazla alt ifade ekleyebilir veya işlevler için kullanılmayan parametre olarak daha iyi ekleyebilirsiniz. Bu durumda w, fonksiyona ikinci (kullanılmamış) parametrenin atanmasız

fFonksiyonu tekrar yazabiliriz.

f = function(n) {
  var z = function(a) { // use current value of n (that changes)
    return a.repeat(n/2);
  };
  var result;
  if (n > 1) {
    result = '  ' + z('____') + '\n '; // top row if more than 1 triangle
  else
    result = ' '; // else just the blank
  ++n; // increase n, so invert even/odd
  w = ' /'[n&1]+'\n'; //  blank if n is now even, else '/' if n is now odd
  // the next rows will end in "/\" or "\  /" based on n even/odd
  result +=  z('/\\  ') + w; // offset by the blank char added before
  result += z('/__\\') + w;
  return result;
}

Firefox / FireBug konsolunda test edin

console.log(f(1),f(2),f(3),f(4),f(9))

Çıktı

 /\   
/__\ 

  ____
 /\  /
/__\/

  ____
 /\  /\   
/__\/__\ 

  ________
 /\  /\  /
/__\/__\/

  ________________
 /\  /\  /\  /\  /\   
/__\/__\/__\/__\/__\ 

Güzel bitti! Dün onu kısaltmak için çok uzun zaman harcadım ve en iyi ihtimalle 109'u farklı şekillerde çoğaltmayı başardım. -8 tam olarak bir sıçrama.
DocMax

Güzel. Bir açıklama gönderir misiniz? Kullanımını tam olarak anlamadımw
BadHorsie 30:15

@BadHorse açıklaması eklendi (bu sefer gerçekten,)
edc65

İlgi alanı dışında boşluk bırakmadan yapmaya çalıştım ve n=>(n>1?' '+'____'.repeat(n/2)+'\n':'')+' /\\ '.repeat(n).slice(0,n*2+2-n%2)+'\n'+'/__\\'.repeat(n).slice(0,n*2+1+n%2)119 için geldim (cevabınıza uyacak şekilde kasten şablon dizgileri kullanmama vs.).
Neil


6

Haskell 155 153 139 131 Bayt

Orijinal yöntemimden daha kısa olduğu ortaya çıkan biraz farklı bir yaklaşım buldum. Asıl girişimim aşağıda korunuyor. Daha önce olduğu gibi, golf ipuçları takdir edilmektedir.

m n=unlines.dropWhile(=="  ").z["  "," /","/"].foldr1 z$map t[1..n]
t n|odd n=["","\\","__\\"]
t _=["____","  /","/"]
z=zipWith(++)

Golf önerileri için Nimi'ye teşekkürler.


Önceki Girişimi 197 179 Bytes

t n=putStr.unlines.dropWhile(all(==' ')).z(flip(++))(if odd n then["","\\","__\\"]else repeat"").z(++)["  "," /","/"].map(take(4*div n 2).cycle)$["____","\\  /","__\\/"]
z=zipWith

4
Golf için bazı ipuçları: (mod n 2)==0olan even nveya daha iyi kullanılması odd nve takas thenve elsebir kısmını. concat.take(div n 2).repeatolan take(4*div n 2).cycletüm liste elemanları uzun isimler, mesela ile fonksiyonlara 4. atama kısa isimler uzunluğu çünkü z=zipWitho zaman kullanım - z. Birkaç boşluk atabilirsiniz ...repeat""else[....
nimi

@nimi İpuçları için teşekkürler! Onları kullanarak orijinal çözümümü 179 bayta kadar sürdürebildim. Yaklaşımımı tekrar değerlendirerek, çözümümü 155 Bayta indirmeyi de başardım.
ankh-morpork

1
İpuçları, bölüm II: foldr z["","",""]olduğunu foldr1 zkatlamak için liste asla boş olduğundan,. Bunun yerine all(==' ') kullanabilirsiniz ==" "- burada n = 1 durumunda, boş satır kaldırmak için kullanılan ve, çünkü (<-arasında iki boşluk) ilk satırı " ". İlk tanımı ttek bir satır içinde yazılabilir: t n|odd....
nimi

4

CJam, 73 68 63 62 60 bayt

Bu kesinlikle biraz golf oynamak ister ...

S2*l~:I2/'_4**N]I(g*S"\\  /"'\{I2md@*@@*'/\@}:F~N"__\\/"_W<F

Burada test et.

açıklama

"Print the first line:";
S2*l~:I2/'_4**N]I(g*

S2*                  "Push a string with 2 spaces.";
   l~:I              "Read and eval the input, store it in I.";
       2/            "Divide by two to get the number of top segments.";
         '_4**       "Push '____' and repeat it by the number of segments.";
              N]     "Push a newline and wrap everything in an array.";
                I(g* "Get sign(I-1) and repeat the array that often. This is a no-op
                      for I > 1 but otherwise empties the array.";

"Print the other two lines. The basic idea is to define block which takes as arguments
 a repeatable 4-character string as well as another string which only gets printed for
 even I.";
S"\\  /"'\{I2md@*@@*'/\@}:F~N"__\\/"_W<F

S                                        "Push a space.";
 "\\__/"'\                               "Push the string '\__/' and the character \.";
          {             }:F~             "Store this block in F and evaluate it.";
           I2md                          "Get I/2 and I%2 using divmod.";
               @*                        "Pull up the second argument and repeat it I%2
                                          times. This turns it into an empty string for
                                          even I.";
                 @@                      "Pull up I/2 and the 4-character string.";
                   *                     "Repeat the string I/2 times.";
                    '/\@                 "Push a / and reorder the three line parts.";
                            N            "Push a newline.";
                             "__\\/"_W<F "Call F again, with '__\/' and '__\'.";

4

Julia, 115 bayt

n->(m=2;p=println;k=n%2>0?m+1:m;e=m<k?"":"/";t=" /\\ ";b="/__\\";if n>1 p("  "*"_"^4m)end;p(t^k*" "*e);p(b^k*e))

Bu bir tamsayıyı kabul eden ve üçgenleri basan isimsiz bir fonksiyon yaratır. Aramak için bir isim verin, örneğin f=n->(...).

Ungolfed + açıklama:

function f(n)

    m = n ÷ 2                    # Number of upside down triangles
    p = println                  # Store println function to save space
    k = n % 2 > 0 ? m + 1 : m    # Number of right side up triangles
    e = m < k ? "" : "/"         # n even? End lines with a /

    # Top of the triangle
    t = " /\\ "

    # Bottom of the triangle
    b = "/__\\"

    # Print the bottoms of any upside down triangles
    # * performs string concatenation
    # ^ performs string repetition
    if n > 1
        println("  " * "_"^4m)
    end

    # Print the triangle tops (these have two trailing spaces
    # if the last triangle isn't upside down)
    println(t^k * " " * e)

    # Print the triangle bottoms
    println(b^k * e)
end

Örnek çıktı:

julia> for i = 1:10 f(i) end
 /\  
/__\
  ____
 /\  /
/__\/
  ____
 /\  /\  
/__\/__\
  ________
 /\  /\  /
/__\/__\/
  ________
 /\  /\  /\  
/__\/__\/__\
  ____________
 /\  /\  /\  /
/__\/__\/__\/
  ____________
 /\  /\  /\  /\  
/__\/__\/__\/__\
  ________________
 /\  /\  /\  /\  /
/__\/__\/__\/__\/
  ________________
 /\  /\  /\  /\  /\  
/__\/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Bu kadar uzun olduğuna çok kızgınım. Eminim bol golf imkanı vardır ama şu an bana göre net değiller. Herhangi bir öneriniz varsa ya da daha fazla açıklama yapmak isterseniz bana bildirin!


3

CJam, 68 62 60 bayt

Görebildiğim kadarıyla, bu diğer CJam çözümünden tamamen farklı bir yaklaşım. Bu çok golf oynayabilir.

"/__\\ /\\"4/]ri:R(['/"  /"'_4*"__\\"'\L]3/R*<+zR1>SS+*\W%N*

Burada çevrimiçi deneyin


3

C # 190

void f(int n){string s=(n>1)?"\n  ":"",t=" /",u = "/";bool b=true;int m=n;while(m-->0){s+=(n>1&&b&&m>0)?"____":"";t+=b?"\\":"  /";u+=b?"__\\":"/";b=!b;}Console.Write("{0}\n{1}\n{2}",s,t,u);}

Ungolfed

void f(int n)
{
string s = (n > 1) ? "\n  " : "", t = " /", u = "/";
bool b = true;
int m = n;
while(m-->0)
{
s += (n > 1 && b && m>0) ? "____" : "";
t += b ? "\\" : "  /";
u += b ? "__\\" : "/";
b = !b;
}
Console.Write("{0}\n{1}\n{2}",s,t,u);
}

1
İyi iş! Bir whiledöngü kullanmanın hiçbir zaman daha iyi olmadığını unutmayın, bunun yerine bir fordöngü kullanın . Bu durumda mfor döngüsünün başlangıcında ve b=!bson olarak ne denirse tanımını ekleyerek 2 bayt tasarruf edebilirsiniz . Ayrıca stringve boolile değiştirerek tasarruf yapabilirsiniz var. Ayrıca "()" etrafında gerekmez n>1maddeleri ve de s+=fıkra olmayan kısa devreyi kullanabilirsiniz &ziyade &&hiçbir yan etkiler ya da dereferences olduğu gibi yanlış gitmek. Son olarak, 1>0daha kısa true;)
VisualMelon

3

C #, 257 183 bayt

void C(int t){int i;var n="\r\n";var s="  "+string.Join("____",new string[1+t/2])+n;for(i=0;i++<=t;)s+=i%2<1?"\\ ":" /";s+=n;for(i=0;i++<=t;)s+=i%2<1?"__\\":"/";Console.WriteLine(s);}

Düzenleme: @ VisualMelon gelen ipuçları sayesinde, 74 bayt kaydedildi.

En iyi dilden golf oynamaktan uzak olduğunu biliyorum, ancak rekabeti kazanmaktan ziyade C # 'nın farklı nüanslarını öğrenmekle ilgileniyorum. Bu temelde bu Pyth cevabının bir limanıdır .

For döngülerinin daha fazla golf oynayabileceğini düşünüyorum, ancak içlerindeki üçüncül ifadeleri göz önüne alındığında, nasıl olduğundan emin değilim.

Örnek (1, 2, 3, 10):

 /\   
/__\  
  ____
 /\  /
/__\/
  ____
 /\  /\ 
/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Ungolfed:

void C2(int t)
{
    int i;
    var n="\r\n";
    var s="  "+string.Join("____",new string[1+t/2])+n;
    for(i=0;i++<=t;)
        s+=i%2<1?"\\ ":" /";
    s+=n;
    for(i=0;i++<=t;)
        s+=i%2<1?"__\\":"/";
    Console.WriteLine(s);
}

StringBuilders hızlı ve sevimli olsa da, düşük bayt sayısı istiyorsanız s+=, arkadaşınızdır. Nitekim, döngüler için biraz daha kompakt yapılabilir. Sevinci / korku ++ve --Koşullu kontrol altında işlerin çoğunu yapabilirsiniz operatörleri aracılığıyla for(i=0;i++<=t;)(eğer bu kontroller idaha azdır veya hiç eşit t ardından artışlarla o). int iFor döngüsünün dışını tanımlamak ve yeniden kullanmak iyi olurdu ve bunun iasla negatif olmayacağının garantisini verdiğiniz i%2==0için değiştirilebiliyor i%2<1. Bu değişikliklerle, 200 baytlık bir alt puan kolayca elde edilir.
VisualMelon

1
Ayrıca, bunu LINQPad ya da benzerinde yazdığınızdan şüpheleniyorum, çünkü Enumerablegenellikle erişim bir using System.Linqdirektif gerektiriyor ve bence genel olarak bu maddelerin dahil edilmesi amaçlanıyor. Bununla birlikte , bu örnekte, LINQ var s=" "+string.Join("____",new string[1+t/2])+n;içermeyen ve şu anki koddan daha kısa olan tek LINQ ile değiştirilebilir ;) "____" (1 + t / 2, gerçekten önemsediklerimizle birlikte çok sayıda boş dizge birleştirir. çünkü daha önce başka bir "____" 'ye uyması için başka bir boş dizgeye ihtiyacımız var). Değişken n"\ r \ n" olarak bildirildi.
VisualMelon

Harika ipuçları! Numaralandırılabilir'in System'e ihtiyacı olacağını unuttum. Bu günlerde zar zor dikkat ediyorum. For loop ucu kullanışlıdır!
Trent

Biraz geç, ama Console.Writebunun yerine 4 Console.WriteLine
byte'ı kurtarabilirsin

2

Java, 185

String f(int n){int i;String s="";if(n>1){s="  ";for(i=0;i<n/2;i++)s+="____";s+='\n';}for(i=0;i<=n;)s+=i++%2<1?" /":"\\ ";s+='\n';for(i=0;i<=n;i++)s+=i%2<1?i<n?"/_":"/":"_\\";return s;}

açıklama

String f(int n) {
    int i;
    String s = "";
    if (n > 1) {
        s = "  ";
        for (i = 0; i < n / 2; i++) {
            s += "____";
        }
        s += '\n';
    }
    for (i = 0; i <= n; i++) {
        s += i % 2 < 1 ? " /" : "\\ ";
    }
    s += '\n';
    for (i = 0; i <= n; i++) {
        s += i % 2 < 1 ? i < n ? "/_" : "/" : "_\\";
    }
    return s;
}

2

C # - 151 146 141 138

@ Bacchusbeale'nin yanıtından ilham alındı

string f(int n){string t="\n",s=n>1?"  "+new string('_',n/2*4)+t:"";for(var b=n<0;n-->=0;t+=b?"__\\":"/",b=!b)s+=b?"\\ ":" /";return s+t;}

Ungolfed

    string f(int n)
    {
        string t = "\n", s = n > 1 ? "  " + new string('_', n / 2 * 4) + t : "";
        for (var b = n < 0; n-- >= 0; t += b ? "__\\" : "/", b = !b)
            s += b ? "\\ " : " /";
        return s + t;
    }

1
Güzel, diğer cevapları yorumlamadan önce bunu nasıl kaçırdığımı bilmiyorum! Bu aşırı yük new Stringbenim için yeni bir şey! t=""Golf versiyonundan kaçırmış gibisin, fakat yapılacak daha iyi bir şey t"\ n" olarak başlatılmış olacak . Sen hiç ekleyerek bayt bir çift kaydedebilirsiniz tsen çevirmek nerede b"{}" tasarruf, For döngüsü: t+=(b=!b)?"/":"__\\".
VisualMelon

1
Daha tönce tanımlarsanız sve tdizeye eklerseniz , @tis biraz daha tasarruf edebilirsiniz "\n";)
VisualMelon

1

Git, 156 144

func f(n int){a,b,c:="  ","","";for i:=0;i<=n;i++{if i<n/2{a+="____"};if i%2<1{b+=" /";c+="/"}else{b+=`\ `;c+=`__\`}};print(a+"\n"+b+"\n"+c)}

Ungolfed:

func f(n int) {
    a, b, c := "  ", "", ""   // Initialize 3 accumulators
    for i := 0; i <= n; i++ { // For each required triangle
        if i < n/2 {          // Yay integer math
            a += "____"
        }
        if i%2 < 1 {          // Even, uneven, (are we drawing up or downslope?)
            b += " /"
            c += "/"
        } else {
            b += `\ `
            c += `__\`
        }
    }
    print(a + "\n" + b + "\n" + c)
}

Buradaki tek gerçek numara (ve hatta iyi bir tane bile değil) 3 akümülatör kullanıyor, böylece çözümü 1 döngüye kadar sıkılaştırabilirim.

Kod burada çalıştırılabilir: http://play.golang.org/p/urEO1kIjKv


c += `__\` yerine sadece kullanınif i<n{c+="_"}
MarcDefiant

@MarcDefiant Güncelleme, teşekkürler
Kristoffer Sall-Storgaard

1

> <> (Balık) , 215 183 156 bayt

Düzenleme: Notepad ++ bana CR nedeniyle 5 fazla bayt veriyordu, dolayısıyla buna göre değiştirilmiş sayısı

Biraz daha golf oynadım, ancak şimdiye kadarki ilk balık programım.

99+0{:}1=?.~~"  "oo:2,:1%-v
-1  oooo  "____"  v!?  )0:/!
" /"oa~~.?=1}:{24~/:oo
v!?)0:-1o"\"v!?)0:/!-1ooo"  /"
/v   ~o"/"oa/!
!\:0)?!;"\__"ooo1-:0)?!;"/"o1-

Http://fishlanguage.com/ adresinde test edebilir (uzunluğu için ilk yığında Int)

Açıklama:

       Start with initial stack as input number
99+0   Push 18 and 0 to the top of the stack
{:}    Shift the stack to the left (wraps), copy the top value, and shift it back to the left (i.e. copy bottom of stack to the top)
1=     Check to see if the top of the stack is equal to 1, pushes 1 for true, 0 for false
?.     If top of stack is zero, skip the ., otherwise jumps to x,y coordinates on top of stack (18,0). This skips the next 8 instructions
~~     Pop the top 2 values from the stack (if they're not popped by the jump)
"  "   Push the string literal "  " onto the stack
oo     Pop the top two values of stack and output them as characters
:2,    Copy top value of stack, ad divide by 2
:1%-   Since ><> uses float division, and doesn't have >= notation, remove the decimal part (if exists)
v      Redirect pointer down
/      Redirect pointer left
:0)    Copy top of stack, and see if its greater than 0 (1 for true, 0 for false)
?!v    If top of stack is non-zero, then ! is executed, which skips the next instruction (redirect), otherwise, code is redirected
"____" Push the literal "____" to the stack
oooo   Pop the top four values of stack and output them as characters
1-     Decrement the top of the stack by 1
!/     Ignore the redirect action.
       When the loop gets to 0, it goes to next line, and gets redirected to the left.
~      Pops the top of the stack (0 counter)
42     Pushes 4 and 2 to the stack
{:}    As before, copies the bottom of the stack to the top
1=?.   Also as before, if the initial value is 1, jump to (2,4) (skipping next 4 instructions
~~     Pop 2 values from stack if these instructions haven't been skipped
ao     Push 10 onto the stack and output it as a character (LF)
"/ "oo Push the literal "/ " onto the stack and output it
://    Copies the top of the stack then redirects to the line below, which then redirects to the left
:0)    Copies top of the stack and compares if its greater than 0
?!v    If it is, redirect to next line
"\"o   Push "\" to stack, then output it as a character
1-     Decrement top value of stack
:0)?!v If loop is not greater than 0, redirect to next line
       Either mode of redirect will loop to the left, and (potentially) skip the far right redirect because of the !
ao     Push 10 to stack and output it as a character (LF)
"/"o~  Push "/" to stack, then output it as a character. Pop top value of stack (the 0 from previous loop)
v      Redirects to next line, which then redirects to the right
:0)?!; If the top of the stack is not greater than 0, terminate (;)
"\__"  Pushes "\__" to the stack
ooo    Outputs top 3 stack values as characters ("__\")
1-     Decrement top of stack by 1
:0)?!; If the top of the stack is not greater than 0, terminate (;)
"/"o   Push "/" to top of stack then output it as a character
1-     Decrement top of stack by 1
!\     Ignore the redirect

1
Güzel tercüman! Bunu kendin mi yaptın?
Sp3000

Hafifçe bile değil. : PI, kendime dili öğretmek ve hata ayıklamak için yaygın olarak kullandı. Sadece etrafta yüzen bir dil gördüm ve çok ilginç olduğunu düşündüm (aynı zamanda Mermerleri de denemek istiyorum).
Fongoid

1

perl 109 108 106

$i=<>;$t=join$/,$i-1?"  "."_"x($i/2)x4:(),$m.=(" /")[$_&1]||"\\ ",$b.=("/")[$_&1]||"__\\"for 0..$i;print$t

Sanırım bu benim ilk golfüm için uygun, ilk satır için Vynce'nin bölümünü kullandım, kodumun geri kalanını 1 üçgenin yeni çizgisini aşmak için kullandım.

Şimdi kısaltabilir miyim görmek için :)

Düzenleme : Boşluk

Düzenleme 2 : değiştirilmiştir "\n"ile$/

1:
 /\
/__\

4:
  ________
 /\  /\  /
/__\/__\/

1

C89, 150

r(p,q,n)int*p,*q;{n?printf(p),r(q,p,n-1):puts(p);}main(c,v)int**v;{c=atoi(v[1]);if(c>1)printf("  "),r("","____",c-1);r(" /","\\ ",c);r("/","__\\",c);}

Ungolfed versiyonu:

r(p, q, n) char *p, *q; {
    if(n > 0) {
        printf(p);
        r(q, p, n-1); /* swap p and q */
    } else {
        puts(p);
    }
}

main(c, v) char**v; {
    c = atoi(v[1]);
    if(c>1) {
        printf("  ");
        r("", "____", c - 1);
    }
    r(" /", "\\ ", c);
    r("/", "__\\", c);
}

Çıktı:

$ seq 1 3 10 | xargs -n1 ./triangles
 /\
/__\
  ________
 /\  /\  /
/__\/__\/
  ____________
 /\  /\  /\  /\
/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Girdiğimde yığın taşar 65535(fakat derlenirseniz değil -O3!), Fakat teorik olarak çalışmalı ;-)

edit: program şimdi 1program düzenleme 2'ye geçilirse sadece iki satırın çıkması gerekliliğini yerine getirir :int* yerine usechar*


İşe yararmış maingibi ilan edebilirsin main(c,v)**v;.
FUZxxl

Eğer alarak birşeyler kurtarabilecek acaba cyoksa nsen bu parametreyi geçmek zorunda kalmamak, global bir değişken olarak r(). Birlikte cevap uymasını sanmıyorumNote that for 1 the output is two lines long but otherwise it's three. This is required.
Seviye Nehri St

@FUZxxl bu maalesef işe yaramadı :-(error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
MarcDefiant

@ steveverrill bu sorunu çözdü, ancak kodu uzatmam gerekiyordu. Global olan bir çözüm bulunamadı nya cda daha kısa olan.
MarcDefiant

@MarcDefiant Bir mesajı geçebildiniz int**mi?
FUZxxl

1

C ++ stdlib, 194 bayt

string f(int n){char* p[]={"____"," /\\ ","/__\\"};int x[]={(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},i,j;string s=n>1?"  ":"";for (i=n>1?0:1;i<3;s+=++i<3?"\n":"")for (j=0;j<x[i];)s+=p[i][j++%4];return s;}

Test programı:

#include <string>
#include <iostream>

using namespace std;

string f(int n)
{
    char* p[]={"____"," /\\ ","/__\\"};
    int x[]={(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},i,j;
    string s=n>1?"  ":"";
    for (i=n>1?0:1;i<3;s+=++i<3?"\n":"")
        for (j=0;j<x[i];)
            s+=p[i][j++%4];
    return s;
}

int main(int argc, char* argv[])
{
    cout << f(10);
    return 0;
}

1

Bash, 166 127 125 119 105 bayt

printf -v l %$[$1/2]s;(($1%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r

Bir fonksiyonda:

triangle() {
    printf -v l %$[$1/2]s;(($1%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r
}

Bazı sunumlarla birlikte:

for i in {1..5} 10 31;do
    paste -d\  <(
        figlet -fsmall $i |
             sed 's/^/         /;s/^ *\(.\{10\}\)$/\1  /;$d'
    ) <(triangle $i)
  done

Oluşturulabilir (eğer yüklü bir figürünüz varsa ):

        _      
       / |    /\  
       | |   /__\
       |_|   
      ___      ____
     |_  )    /\  /
      / /    /__\/
     /___|   
      ____     ____
     |__ /    /\  /\  
      |_ \   /__\/__\
     |___/   
     _ _       ________
    | | |     /\  /\  /
    |_  _|   /__\/__\/
      |_|    
      ___      ________
     | __|    /\  /\  /\  
     |__ \   /__\/__\/__\
     |___/   
   _  __       ____________________
  / |/  \     /\  /\  /\  /\  /\  /
  | | () |   /__\/__\/__\/__\/__\/
  |_|\__/    
    _____      ____________________________________________________________
   |__ / |    /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |   /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|   

Eğer değişken yerine giriş ise $1: 2 karakter kaydet.

printf -v l %$[i/2]s;((i%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r

Döngü içine:

for i in {1..3} {31..34};do
    [ $i == 31 ] && figlet -fsmall ...
    paste -d\  <(
        figlet -fsmall $i |
            sed 's/^/         /;s/^ *\(.\{10\}\)$/\1   /;$d'
    ) <(
        printf -v l %$[i/2]s;((i%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r
    )
  done

(Yaklaşık) aynı hale getirecek:

        _       
       / |     /\  
       | |    /__\
       |_|    
      ___       ____
     |_  )     /\  /
      / /     /__\/
     /___|    
      ____      ____
     |__ /     /\  /\  
      |_ \    /__\/__\
     |___/    


 _ _ _ 
(_|_|_)

    _____       ____________________________________________________________
   |__ / |     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|    
  _______       ________________________________________________________________
 |__ /_  )     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
  |_ \/ /     /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
 |___/___|    
  ________      ________________________________________________________________
 |__ /__ /     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
  |_ \|_ \    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
 |___/___/    
 _____ _        ____________________________________________________________________
|__ / | |      /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
 |_ \_  _|    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
|___/ |_|     

1
Bir figlet uygulama codegolf hakkında bir soru göndermelisin!
sergiol,

1

Kömür , 27 bayt (rekabetçi olmayan)

Rekabet etmiyor, çünkü dil mücadeleyi iptal ediyor.

FEN﹪鲫P×⁴_↗⊗¬ι↓P↘²↘⊗ι↑P↗⊗ι

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

FEN﹪鲫

Alternatif uzunluk bitlerinin bir listesini oluşturun nve üzerlerine döngü yapın.

P×⁴_

____İmleci hareket ettirmeden çizim yapın .

↗⊗¬ι↓

İlk ve diğer üçgenin sol /tarafını çizin .

P↘²

\İmleci hareket ettirmeden kenarı çizin .

↘⊗ι↑

İkinciyi ve diğer üçgeni \imleci hareket ettirmek için tekrar sol tarafa çizin .

P↗⊗ι

İkinci ve diğer her üçgenin /üzerinde imleci hareket ettirmeden sağ tarafı çizin .


1
Artık cevapların artık rekabetsiz olarak işaretlenmesi gerekmiyor
Jo King,

1

PowerShell , 116 95 bayt

Mazzy ve ASCII-Only'e 21 byte tasarruf ettiğin için teşekkürler

param($n)@("  "+"_"*4*($x=$n-shr1))[$n-eq1]
" /"+"\  /"*$x+"\"*($a=$n%2)
"/"+"__\/"*$x+"__\"*$a

Çevrimiçi deneyin!

N = 1 için boş bir satıra izin vermemek 14 10 bayt kadar yedi . Bu çözüm çok az beyin tekrarladı ve en az miktarda tekrarlanan kod var. Bankacı Yuvarlama hala gerçek şeytan.


Boş bir satıra izin verilmiyor mu ???
ASCII-sadece

@ ASCII-Yalnızca OP'deki 4. mermi noktasını okuyun.
Veskah


1
@ ASCII-yalnızca x = 3
sonunu verir

1
@mazzy, ilk satırı oluşturamazsın, aksi takdirde 102
ASCII-sadece

0

C, 368 Bayt

void p(char* c){printf(c);}
int x(int s,int f){int t=0,p=s;for(int i=0;i<f;i++){if(p==1){t++;p=0;}else{p=1;}}return t;}
int main(int argc,char* argv[]){int t=atoi(argv[1]);if(t>1){p("  ");for(int i=0;i<x(0,t);i++)
{p("____");}p("\n");}for(int i=0;i<x(1,t);i++){p(" /\\ ");}if(t%2==0){p(" /");}p("\n");
for(int i=0;i<x(1,t);i++){p("/__\\");}if(t%2==0){p("/");}p("\n");}

#includeİfadeleri sayarsanız daha fazla olur , ancak uyarılar da olmasa da, gcc'de derlenir. Biliyorum, şu ana kadarki en kısa değil, ama yine de C de yaptım.


Makro #define p(c)printf(c), işlevinizden daha kısa. İşlevlerde dönüş türlerini atlayabilirsiniz (varsayılan olarak int). Fonksiyonu C89bunun gibi bir tarzda da tanımlayabilirsiniz main(c,v)char**v;{}. Bu kısaint main(int c, char** v){}
MarcDefiant

0

Perl (basit) 131 125 120

oldukça basit ilk geçiş:

$i=<>;print join"\n",$i-1?"  "."_"x(4*int($i/2)):(),join("",map{(" /","\\ ")[$_%2]}0..$i),join"",map{("/","__\\")[$_%2]}0..$i

Kim açık int ihtiyacı var?

$i=<>;print join"\n",$i-1?"  "."_"x($i/2)x4:(),join("",map{(" /","\\ ")[$_%2]}0..$i),join"",map{("/","__\\")[$_%2]}0..$i

0

Prolog, 126 bayt

A+B:-writef(A,B).
$N:-(N>1,"  %r\n"+['____',N//2];!),(0is N/\1,T='/';T='')," %r%w\n"+['/\\  ',N/2,T],"%r%w\n"+['/__\\',N/2,T].

Gibi çağır $3.

Daha okunabilir:

triangle(N):-
    (   N > 1
    ->  writef("  %r\n", ['____', N//2])
    ;   true
    ),
    (   0 is N mod 2
    ->  T = '/'
    ;   T = ''
    ),
    writef(" %r%w\n", ['/\\  ', N/2, T]),
    writef("%r%w\n", ['/__\\', N/2, T]).

Örnek:

?- findall(N,between(1,10,N),NN), maplist($, NN), !.
 /\  
/__\
  ____
 /\  /
/__\/
  ____
 /\  /\  
/__\/__\
  ________
 /\  /\  /
/__\/__\/
  ________
 /\  /\  /\  
/__\/__\/__\
  ____________
 /\  /\  /\  /
/__\/__\/__\/
  ____________
 /\  /\  /\  /\  
/__\/__\/__\/__\
  ________________
 /\  /\  /\  /\  /
/__\/__\/__\/__\/
  ________________
 /\  /\  /\  /\  /\  
/__\/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/
NN = [1, 2, 3, 4, 5, 6, 7, 8, 9|...].

0

C #: 1 satır LINQ, 198 bayt

string f(int n){return(n>1?"  ":"")+string.Join("\n",new[]{"____"," /\\ ","/__\\"}.Zip(new[]{(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},(s,l)=>string.Join(s,new string[n+1]).Substring(0,l)).Where(x=>x.Any()));}

0

Retina , 88 bayt (rekabetçi değil)

Rekabet etmiyor, çünkü dil mücadeleyi iptal ediyor.

K`  ____¶ /\  /¶/__\/
%`....$
$+*$&
%`(.+)\1$
$1
(  (____)*)__(¶.*)  /(¶.*)/
$1$3$4
G`\S

Çevrimiçi deneyin! Açıklama:

K`  ____¶ /\  /¶/__\/

Girişi bir çift üçgen ile değiştirin.

%`....$
$+*$&

Üçgenleri orijinal girdiyle çarpın.

%`(.+)\1$
$1

Üçgenleri 2'ye bölün.

(  (____)*)__(¶.*)  /(¶.*)/
$1$3$4

Sol üst yarım üçgeni çıkarın.

G`\S

Şimdi boşsa, ilk satırı kaldırın.




0

05AB1E , 37 bayt

≠iðð'_I2÷4*×J}„ /„\ ‚I>∍J'/…__\‚I>∍J»

Çevrimiçi deneyin ya da ilk 10 çıkışı doğrulayın .

Açıklama:

i            } # If the (implicit) input is NOT 1:
                #   i.e. 1 → 0 (falsey)
                #   i.e. 5 → 1 (truthy)
  ðð            #  Push two spaces "  "
    '_         '#  Push string "_"
      I         #  Push the input
       2÷       #  Integer-divide it by 2
                #   i.e. 5 → 2
         4*     #  And then multiply it by 4
                #   i.e. 2 → 8
           ×    #  Repeat the "_" that many times
                #   i.e. "_" and 8 → "________"
            J   #  Join everything on the stack together to a single string
                #   i.e. "  ________"
 /             # Push string " /"
   \           # Push string "\ "
               # Pair them together: [" /","\ "]
      I>        # Push the input+1
               # Extend the list to that size
                #  i.e. [" /","\ "] and 2 → [" /","\ "]
                #  i.e. [" /","\ "] and 6 → [" /","\ "," /","\ "," /","\ "]
         J      # Join the list together to a single string
                #  i.e. [" /","\ "] → " /\ "
                #  i.e. [" /","\ "," /","\ "," /","\ "] → " /\  /\  /\ "
'/             '# Push string "/"
  __\          # Push string "__\"
               # Pair them together: ["/","__\"]
       I>       # Push the input+1
               # Extend the list to that size
                #  i.e. ["/","__\"] and 2 → ["/","__\"]
                #  i.e. ["/","__\"] and 6 → ["/","__\","/","__\","/","__\"]
          J     # Join the list together to a single string
                #  i.e. ["/","__\"] → "/__\"
                #  i.e. ["/","__\","/","__\","/","__\"] → "/__\/__\/__\"
»               # Join the entire stack with a newline delimiter
                #  i.e. " /\ " and "/__\" → " /\ \n/__\"
                #  i.e. "  ________", " /\  /\  /\ " and "/__\/__\/__\"
                #   → "  ________\n /\  /\  /\ \n/__\/__\/__\"
                # (and output the result implicitly)

0

Java 11, 122 bayt

n->(n>1?"  "+"_".repeat(n/2*4)+"\n":"")+" /\\ ".repeat(n).substring(0,++n*2)+"\n"+"/__\\".repeat(n).substring(0,n/2*4+n%2)

Çevrimiçi deneyin.

Açıklama:

n->                   // Method with integer parameter and String return-type
  (n>1?               //  If the input is larger than 1:
    "  "              //   Return two spaces
    +"_".repeat(      //   Appended with "_" repeated the following amount of times:
          n/2         //    The input integer-divided by 2
             *4)      //    And then multiplied by 4
    +"\n"             //   Appended with a newline
   :                  //  Else:
    "")               //   Return nothing
  +" /\\ ".repeat(n)  //  Appended with " /\ " repeated the input amount of times
    .substring(0,     //   After which we only leave the first `x` characters, where `x` is:
      ++n             //    Increase the input by 1 first with `++n`
         *2)          //    And then multiply it by 2
                      //     i.e. For input 1, `x` becomes 4 here
                      //     i.e. For input 6, `x` becomes 14 here
  +"\n"               //  Appended with a newline
  +"/__\\".repeat(n)  //  Appended with "/__\" repeated the input amount of times
    .substring(0,     //   After which we only leave the first `y` characters, where `y` is:
      n/2             //    The input+1 integer-divided by 2
         *4           //    Then multiplied by 4
           +n%2)      //    And then the input+1 modulo-2 added
                      //     i.e. For input 1, `y` becomes 4 here
                      //     i.e. For input 6, `y` becomes 13 here
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.