Üçgensiz bir üçgen oluşturun


44

Küçük bir çocukken, bu oyuncaklarla çok oynamaktan hoşlanırdım:

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

Muhtemelen bunların sanat için kullanılmasını amaçlıyorlardı, ama ben onları daima matematik için kullandım! Fraktallar, desenler vb. Bir keresinde, bu zorluğa kapıldım:

Yeşil üçgen döşemelerden herhangi birini kullanmadan bir üçgen oluşturun.

Bu meydan okuma beni en uzun süre kandırdı, sadece 3 yamukla yapmanın gerçekten güzel ve basit bir yolunu buldum:

  /\  
 /_/\ 
/__\_\

Şimdi, bu üçgeni al ve döndür:

______         
\ \__/         
 \/ /          
  \/ 

Bu iki üçgeni kullanarak, onlardan daha büyük üçgenler oluşturabiliriz. İşte 2 yükseklik üçgeni:

     /\           
    /_/\          
   /__\_\         
  /\ \__/\        
 /_/\/ /_/\       
/__\_\/__\_\    

Ve işte yükseklik 3-7 olan üçgenler:

#3
        /\
       /_/\
      /__\_\
     /\ \__/\
    /_/\/ /_/\
   /__\_\/__\_\
  /\ \__/\ \__/\
 /_/\/ /_/\/ /_/\
/__\_\/__\_\/__\_\

#4
           /\
          /_/\
         /__\_\
        /\ \__/\
       /_/\/ /_/\
      /__\_\/__\_\
     /\ \__/\ \__/\
    /_/\/ /_/\/ /_/\
   /__\_\/__\_\/__\_\
  /\ \__/\ \__/\ \__/\
 /_/\/ /_/\/ /_/\/ /_/\
/__\_\/__\_\/__\_\/__\_\

#5
              /\
             /_/\
            /__\_\
           /\ \__/\
          /_/\/ /_/\
         /__\_\/__\_\
        /\ \__/\ \__/\
       /_/\/ /_/\/ /_/\
      /__\_\/__\_\/__\_\
     /\ \__/\ \__/\ \__/\
    /_/\/ /_/\/ /_/\/ /_/\
   /__\_\/__\_\/__\_\/__\_\
  /\ \__/\ \__/\ \__/\ \__/\
 /_/\/ /_/\/ /_/\/ /_/\/ /_/\
/__\_\/__\_\/__\_\/__\_\/__\_\

#6
                 /\
                /_/\
               /__\_\
              /\ \__/\
             /_/\/ /_/\
            /__\_\/__\_\
           /\ \__/\ \__/\
          /_/\/ /_/\/ /_/\
         /__\_\/__\_\/__\_\
        /\ \__/\ \__/\ \__/\
       /_/\/ /_/\/ /_/\/ /_/\
      /__\_\/__\_\/__\_\/__\_\
     /\ \__/\ \__/\ \__/\ \__/\
    /_/\/ /_/\/ /_/\/ /_/\/ /_/\
   /__\_\/__\_\/__\_\/__\_\/__\_\
  /\ \__/\ \__/\ \__/\ \__/\ \__/\
 /_/\/ /_/\/ /_/\/ /_/\/ /_/\/ /_/\
/__\_\/__\_\/__\_\/__\_\/__\_\/__\_\

#7
                    /\
                   /_/\
                  /__\_\
                 /\ \__/\
                /_/\/ /_/\
               /__\_\/__\_\
              /\ \__/\ \__/\
             /_/\/ /_/\/ /_/\
            /__\_\/__\_\/__\_\
           /\ \__/\ \__/\ \__/\
          /_/\/ /_/\/ /_/\/ /_/\
         /__\_\/__\_\/__\_\/__\_\
        /\ \__/\ \__/\ \__/\ \__/\
       /_/\/ /_/\/ /_/\/ /_/\/ /_/\
      /__\_\/__\_\/__\_\/__\_\/__\_\
     /\ \__/\ \__/\ \__/\ \__/\ \__/\
    /_/\/ /_/\/ /_/\/ /_/\/ /_/\/ /_/\
   /__\_\/__\_\/__\_\/__\_\/__\_\/__\_\
  /\ \__/\ \__/\ \__/\ \__/\ \__/\ \__/\
 /_/\/ /_/\/ /_/\/ /_/\/ /_/\/ /_/\/ /_/\
/__\_\/__\_\/__\_\/__\_\/__\_\/__\_\/__\_\

Meydan okuma

Bir numara alan bir program veya fonksiyon yazın n ve yükseklikte bir üçgen az üçgen yazdırır n . Her satırdaki sondaki boşluklar kabul edilebilirdir ve bir sondaki veya sondaki yeni hattan da kabul edilebilir. GÇ makul bir biçimde olabilir. Girdi pozitif bir tamsayı olduğu garantilidir, bu nedenle negatif sayılar, ondalık sayılar, sayısız vb. İçin endişelenmenize gerek yoktur.

Bayt cinsinden en kısa cevap kazanır!


Yamuklardan daha fazla yamuk yapmayı deneyin. Uzunluk 2 ve 3 kesinlikle mümkündür (ve uzantı olarak, 2 ^ a * 3 ^ b formunun tüm sayıları) (Nasıl bilebilirim? Çocukken aynı tip bloklarla oynandı.)
CalculatorFeline

1
@CatsAreFluffy Üçgenlerden bir yamuk yaratabildiğiniz için, yamuklardan yamuk yapabileceğiniz sonucuna varabilirsiniz. Aslında, 3 ve 7 numaralı üçgenlere bakarsanız, büyük yamuklarla tekrarlanan aynı şekli görebilirsiniz.
DJMcMayhem

Bu meydan okuma gerçekten harika. Bunu Retina'da nasıl yapacağımı bulmaktan zevk aldım.
mbomb007

@ mbomb007 Bunu beğendiğini duyduğuma sevindim! = D İşte bu yüzden zorlukları yazıyorum.
DJMcMayhem

2
Bu zorluk mobil uygulama ile ekranda mükemmel bir uyum sergiliyor . Bu kasıtlı mıydı? :)
Doddy

Yanıtlar:


15

CJam, 47

ri_"/__\_\/_/\/ /\ \__"6/f**eeW%{_S.*s\~,\-<N}/

Açıklama:

ri_       read the input, convert to integer and duplicate
"…"       push that string, containing the repeating pattern
           (3 lines in reverse order, concatenated)
6/        split into (3) lines of 6 characters
f*        multiply (repeat) each line n times
*         repeat the array of 3 lines n times
           at this point we have an array of 3*n strings with 6*n characters each
ee        enumerate the array (obtaining an array of [index string] pairs)
W%        reverse the array
           (so the lines are in correct order and indices in reverse order)
{…}/      for each [index string] pair
  _       duplicate the pair
  S.*     vectorized-multiply with " "
           this effectively replaces the index with a string of <index> spaces
  s       convert the pair to string, effectively concatenating the spaces
           with the string
  \       swap with the other copy of the [index string] pair
  ~,      dump the index and string on the stack and get the string length
  \-      subtract the index from it - this is the desired line length
  <       cut the concatenated string to that length
  N       add a newline

Çevrimiçi deneyin


17

Ruby, 79

->n{1.upto(n*=3){|i|puts (' '*(n-i)).ljust(n+i,'/__\_\/\ \__/_/\/ '[i%3*6,6])}}

A. (-4 bayt, -1 +1) 0-indexed ( .times) 'den 1-indexed ( 1.upto)' e değiştirildi

B. (-5 bayt), üç adet 6-karakterli diziden, 18-karakterli dizgenin 6-karakterli alt diziliminin seçimine değiştirildi.

C. (-1 bayt) m=n*3->n*=3

D. (-5 bayt), beş çift ters eğik çizgiyi de tek ters eğik çizgilere indirdi (kısmen A noktası için gereken dizenin yeniden sıralanması ile mümkün oldu)

Ruby, 94

->n{(m=n*3).times{|i|puts (' '*(m-i-1)).ljust(m+i+1,[ '/\\ \\__','/_/\\/ ','/__\\_\\'][i%3])}}

açıklama

Temel birim aşağıdaki gibi 3x6 elmastır (netlik için çoğaltılan her satırdaki son karakter :)

    /\ \__/
   /_/\/ / 
  /__\_\/

Tek yapmamız gereken, bu kalıbın uygun bir penceresini görüntülemek. Ruby ljust, yalnızca boşluklarla değil, herhangi bir dizeyle oynamanıza izin veriyor. Normalde ljust, sonuna boşluk ekleyerek yazdırılabilir karakter dizisini doldurmak için kullanılır, ancak burada tersine kullanırız: sonunda yazdırılabilir karakter ekleyerek boşluk dizesini doldurmak için.

test programında ungolfed

f=->n{
  (m=n*3).times{|i|                  #for each line of the triangle
    puts (' '*(m-i-1)).              #print m-i-1 spaces, 
      ljust(m+i+1,[ '/\\ \\__',      #left justified and padded to total length m+i+1
                   '/_/\\/ ',        #by one of these three strings
                  '/__\\_\\'][i%3])
  }
}

f[gets.to_i]

@ mbomb007 Bu şikayeti ilk defa yaşıyorum. Bir mühendis olarak, her şeyi gözden geçirmeye alışkınım. Bu oldukça basit bir zorluk ve iyileştirmeler oldukça önemsiz, bu yüzden devam ettim ve revizyon mektuplarını sildim. Zarar vermez, çünkü güncel sürümden daha kolay takip edilir.
Seviye River St

3
Kod boyutu genellikle herhangi bir düzeltmeyi benzersiz şekilde tanımlar, ancak düzeltme geçmişi, düzenleme geçmişini görüntüleyen herkes için de kullanılabilir.
mbomb007

9

Retina , 150 122 118 bayt

Bu mücadelenin çıktısı bu arada harika görünüyor!

Giriş bir arada. Çıktı izleyen bir satır beslemesi içeriyor. Kod ISO 8859-1 kodlamasını kullanır. Sondan iki satırlı satırdaki boşluğa dikkat edin.

(?=_\\¶.*1)
_\/__\
(?=/_/\\¶.*1)
/_/\/ 
(^|__)(?=/\\¶.*1)
$1/\ \__
ms}`(.*1*)1
/\¶/_/\¶/__\_\¶$1
m`^(?=(.*¶)*.)
$#1$* 

Çevrimiçi deneyin

açıklama

Daha ayrıntılı bir açıklama istiyorsanız, bana sohbette yorum yapın veya mesaj yazın.

(?=_\\¶.*1)                     # Matches the start of the 3rd line of every triangle
/__\_\                          #   and prepends another layer if needed
(?=/_/\\¶.*1)                   # 2nd line of each triangle
/_/\/ 
(^|__)(?=/\\¶.*1)               # 1st line of each triangle
$1/\ \__
ms}`(.*1*)1                 # This and above in a multi-single-line loop.
/\¶/_/\¶/__\_\¶$1               #   This stage adds a flattened triangle on top
m`^(?=(.*¶)*.)                  # Prepend a space for every line following -1
$#1$* 

Martin'e 32 byte golf attığı için teşekkürler.


6

Tarmo'nun ascii baskı dili, 46 bayt. (Rekabetsiz)

1  /\| /_/\|/__\_\2 \__|/ 0n{n-a-1{~}1a{2#1}$}

Sadece CJam gibi garip programlama dillerine bakarak, beni daha önce hiç kimsenin gitmediği yerlere cesaretle gitmek istediğim ve kendi dilimi icat etmek istediğim için ne kadar karmaşık, doğal olmayan ve şifreli bir dilin olabileceğini biraz şaşırtıyor. Sonuç olarak ascii desen baskısı için kendi dilimi oluşturdum.

Temel fikir, ilk pateni tanımlayabilmeniz ve sonra da basabilmenizdir - aynı tür '1' veya '2' karakterini kullanarak veya herhangi bir sayıyı kullanarak - kendi baskı düzeninizi tanımlayabilirsiniz.

Desen tanımlandıktan sonra (Numaradan numara sonuna kadar başlar) - sonraki numaralar desen yazdırmayı gerçekleştirir.

Örneğin

1  /\| /_/\|/__\_\01

Bunun gibi çıktılar:

  /\
 /_/\
/__\_\

Desen 1'i tanımlayacak ve hemen yazdıracaktır. Desen '|' ile ayrılan her şey olarak tanımlanır karakter. 0 sonunda - desen sonlandırma gibi davranır.

'$' Gibi özel karakterler satır besleme olarak ayrılmıştır ve '~' belirli kalıbın yarısı - aralığı için ayrılmıştır.

1  /\| /_/\|/__\_\01$~11$~1~11

Böyle bir metni çıktılar:

  /\
 /_/\
/__\_\
     /\
    /_/\
   /__\_\
        /\
       /_/\
      /__\_\

Sıradaki döngüler için geçerli. Bunun kolayca görülebilmesi gerekiyor - bu yüzden döngüler için {} braketlerini tuttum, ancak değişken isimleri otomatik olarak adlandırılmış - yani ilk braket 'a' değişkeni, ikinci 'b' ve benzerlerini kullanacak. Yineleme her zaman 0'dan belirli sayıya gider - ve bu sayı {} parantezinden önce tanımlanır.

'n' tüm fonksiyon girişi için değişkendir.

Yani kod:

1  /\| /_/\|/__\_\0n{1$}

Çıktılar (n == 4 ile):

  /\
 /_/\
/__\_\
  /\
 /_/\
/__\_\
  /\
 /_/\
/__\_\
  /\
 /_/\
/__\_\

Ve '#', trim lead boşlukları için özel değiştiricidir.

Ve sonunda bütün çözüm:

DrawPatterns.cs:

using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.CSharp;

class DrawPatterns
{
//Command line parameters - for example like this: "1  /\| /_/\|/__\_\2 \__|/ 0n{n-a-1{~}1a{2#1}$}" 3
    static Dictionary<char, String[]> patterns = new Dictionary<char,string[]>();

    static string Tabs(int n)
    {
        if( n < 0 ) n = 0;

        String r = "";

        for( int i = 0; i < n ; i++ )
            r += "    ";

        return r;
    }

    static int[] left = new int[10];
    static int top = Console.CursorTop;
    static int lastTop = Console.CursorTop;

    static public void DoPrint(char c, char modifier = ' ')
    {
        if (c == '$')
        {
            for (int i = 0; i < left.Length; i++)
                left[i] = 0;
            top = lastTop + 1;
            return;
        }

        if (!patterns.ContainsKey(c))
            return;

        if (modifier == '½' || modifier == '~')
        {
            int maxSize = patterns[c].Select(x => x.Length).Max();
            for( int i = 0; i < left.Length; i++ )
                left[i] += maxSize / 2;
            return;
        }

        int iLine = 0;
        foreach (var l in patterns[c])
        {
            Console.SetCursorPosition(left[iLine], top + iLine);
            if( top + iLine > lastTop ) 
                lastTop = top + iLine;

            String s = l;
            if (modifier == '#')
                s = s.TrimStart(' ');

            Console.WriteLine(s);
            left[iLine] += s.Length;
            iLine++;
        }
    }

    static void Main(string[] _args)
    {
        List<String> args = _args.ToList();
        String todo = "";
        String code = "";
        char nextVar = 'a';
        String lf = "\r\n";
        int align = 1;
        char lastModifier = ' ';
        int nextArg = 1;
        Dictionary<String, String> argValues = new Dictionary<string,string>();
        bool bDebug = false;

        if (args.Count != 0 && args[0].ToLower() == "-d")
        {
            bDebug = true;
            args.RemoveAt(0);
        }

        if (args.Count == 0)
        {
            Console.WriteLine("Usage: DrawPatterns.cs [options] \"script\" <arguments to script>");
            Console.WriteLine("[options] allowed:");
            Console.WriteLine("-d - debug");
            return;
        }

        String prog = args[0];

        for( int i = 0; i < prog.Length; i++ )
        {
            char c = prog[i];

            // Define pattern.
            if (c >= '0' && c <= '9' && !patterns.ContainsKey(c))
            {
                String p = Regex.Match(prog.Substring(i + 1), "[^0-9]*").Groups[0].Value;
                patterns[c] = p.Split('|');
                i += p.Length;
                if( prog[i + 1] == '0' ) i++;
                continue;
            }

            String procRemain = prog.Substring(i);
            // modifier specified, but pattern number is not provided - use first pattern.
            if( lastModifier != ' ' && ( c < '0' || c > '9' ) )
            {
                code += Tabs(align);
                code += "print('1' , '" + lastModifier + "');" + lf;
                lastModifier = ' ';
            }

            switch ( c )
            {
                case '{':
                    code += Tabs(align);
                    code += "for ( int " + nextVar + " = 0; " + nextVar + " < " + todo + " ; " + nextVar + "++ )" + lf;

                    //  Check for all variable names if they can be used in program.
                    foreach ( var m in Regex.Matches(todo, "[a-zA-Z_][a-zA-Z0-9_]*", RegexOptions.Singleline) )
                    {
                        String varName = m.ToString();

                        if( varName.Length == 1 && varName[0] <= nextVar )
                            // Already declared as a loop.
                            continue;

                        if( argValues.ContainsKey(varName ) )
                            continue;

                        if( nextArg >= args.Count )
                        {
                            Console.WriteLine("Insufficient parameters provided to script - argument '" + varName + "' value is needed");
                            return;
                        }

                        argValues[varName] = args[nextArg];
                        nextArg++;
                    }


                    code += Tabs(align);
                    code += "{" + lf;
                    nextVar++;
                    todo = "";
                    align++;
                    break;

                case '}':
                    align--;
                    code += Tabs(align);
                    code += "}" + lf;
                    break;

                default:
                    if (((c >= '0' && c <= '9') || c == '<' || c == '$') && todo == "")
                    {
                        code += Tabs(align);
                        code += "print('" + c + "' , '" + lastModifier + "');" + lf;
                        lastModifier = ' ';
                        continue;
                    }

                    if (c == '½' || c == '~' || c == '#')
                    {
                        lastModifier = c;
                        continue;
                    }

                    if( c == '\r' || c == '\n' )
                        continue;

                    todo += c;
                    break;
            }

        } //for

        String code2 = "";
        code2 += "using System;" + lf;
        code2 += "public class ExecClass { static void Exec( Action<char, char> print";

        object[] invokeArgs = new object[ argValues.Count+1];
        invokeArgs[0] = new Action<char, char>(DoPrint);
        int iValueIndex = 1;

        foreach ( var kv in argValues )
        {
            code2 += ",";
            code2 += "int " + kv.Key;
            invokeArgs[iValueIndex] = Int32.Parse(kv.Value);
            iValueIndex++;
        }

        code2 += ") {" + lf;
        code2 += code;
        code2 += "} };";

        if( bDebug )
        {
            int line = 1;
            String lineNumberedCode =Regex.Replace(code2, "^(.*)$", 
                delegate(Match m) { return (line++).ToString("d2") + ": " + m.Value; },
                RegexOptions.Multiline
            );
            Console.WriteLine(lineNumberedCode);
            Console.WriteLine();
            Console.WriteLine();
        }

        left[0] = Console.CursorLeft;
        for( int i = 1; i < left.Length; i++ )
            left[i] = left[0];
        top = Console.CursorTop;

        try
        {
            var compileResult = new CSharpCodeProvider().CompileAssemblyFromSource( new CompilerParameters() { GenerateExecutable = false, GenerateInMemory = true }, code2);
            if (compileResult.Errors.HasErrors)
            {
                foreach (CompilerError ce in compileResult.Errors)
                {
                    if (ce.IsWarning) continue;
                    Console.WriteLine("{0}({1},{2}: error {3}: {4}", ce.FileName, ce.Line, ce.Column, ce.ErrorNumber, ce.ErrorText);
                }
                return;
            }

            var method = compileResult.CompiledAssembly.GetType("ExecClass").GetMethod("Exec", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
            method.Invoke(null, invokeArgs);

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        Console.SetCursorPosition(1, lastTop);
        Console.WriteLine();
        Console.WriteLine();
    } //Main
}

Bunun gibi komut satırı argümanları: -d "1 / \ | / _ / \ | / ___ \ 2 __ | / 0n {na-1 {½} 1a {2 # 1} $}" 3

Bu çıktı olacak:

01: using System;
02: public class ExecClass { static void Exec( Action<char, char> print,int n) {
03:     for ( int a = 0; a < n ; a++ )
04:     {
05:         for ( int b = 0; b < n-a-1 ; b++ )
06:         {
07:             print('1' , '~');
08:         }
09:         print('1' , ' ');
10:         for ( int c = 0; c < a ; c++ )
11:         {
12:             print('2' , ' ');
13:             print('1' , '#');
14:         }
15:         print('$' , ' ');
16:     }
17: } };


        /\
       /_/\
      /__\_\
     /\ \__/\
    /_/\/ /_/\
   /__\_\/__\_\
  /\ \__/\ \__/\
 /_/\/ /_/\/ /_/\
/__\_\/__\_\/__\_\

1
Bu gerçekten harika! Bunu Github'a koymalı ve insanları kullanmaya teşvik etmelisin!
DJMcMayhem

3
Programlama Bulmacaları ve Code Golf'a Hoş Geldiniz! Kendi programlama dilini icat etmen çok hoş, ama çalışabileceği en son sürüm bu mücadeleden önce mi ortaya çıkıyor?
Adnan

Seni tam olarak anlamadı mı, ne diyorsun?
TarmoPikaro

Dil kendisi meydan daha yeni buysa, o olarak işaretlemek için ortak olmayan rekabet (oldukça mantıklı sağ;)). Bu alakalı bir gönderi olabilir.
Adnan

Dil sorunlu alana bağlı ve buradan okumadan önce böyle bir sorunun var olduğunu bilmiyordum. Sanırım daha önce benzer bir problemle karşılaşırsam dili daha önce kodlayabilirdim. :) Her neyse, bu siteyi toplayarak CJam'ın burada oldukça "normal" bir dil olduğunu anladım. :)
TarmoPikaro 17:16

5

JavaScript (ES6), 119 bayt

n=>`,/\\ \\__,/_/\\/ ,/__\\_\\`[r=`repeat`](n).split`,`.map((s,i)=>` `[r](n*3-i)+s[r](n).slice(0,i*2)).slice(1).join`\n`

Nerede \nliteral satır karakteri temsil eder. n*3Boşluk içeren bir satır ve bir satırsonu kabul edilebilirse .slice(1), 9 baytlık bir tasarruf için çıkartılabilir.



2

Python 2, 142 bayt

def f(n,m):return f(n-1,m+3)+[' '*(m+x)+(y*n)[x*2:]for x,y in((2,' \\__/\\'),(1,'/ /_/\\'),(0,'/__\\_\\'))]if n else[]
print '\n'.join(f(n,0))

İlke diğer cevaplara çok benzer: tekrarlanan üç diziyi alın ve ardından onları üçgeni almak için sadece bazılarını kırpmanız ve ardından sola kaydırmanız gerekecek şekilde katmanlayın.


2

C ++, 395 Bayt

C ++ ile 395 byte büyüklüğünde ilk kez golf kodu. Benim durumumda bu biraz şaşkınlık için bir yarışma gibi geliyor: D

#include <iostream>
#include <cstring>
#define A for (int k=0;k<((s-(i+1))*3+(2-j));k++) cout<<" ";
using namespace std; string t[3]={"/\\","/_/\\","/__\\_\\"};string r[2]={" \\__","/ "};int tr=3;int main(int,char**argv){int s=atoi(argv[1]);for(int i=0;i<s;i++){for(int j=0;j<tr;j++){A for(int l=1;l<=2*(i+1)-1;l++){if((l%2)==0&&(j<2)){cout<<r[j];}else if ((l%2)==1)cout<<t[j];}A cout<<endl;}}}

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.