매우 간단한 삼각형


47

양의 정수 (stdin, 명령 행 또는 함수 arg를 통해)를 가져 와서 작은 타일 중 많은 타일이 함께 바둑판 식으로 배열 된 문자열을 인쇄하거나 반환하는 프로그램 또는 함수를 작성하십시오.

 /\
/__\

입력이 인 경우이 유일한 삼각형이 출력입니다 1.

입력이 2인 경우 출력은

  ____
 /\  /
/__\/

입력이 3인 경우 출력은

  ____
 /\  /\
/__\/__\

입력이 4인 경우 출력은

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

등등. 여러분의 프로그램은 2 입력을 지원해야합니다 (16) - = 65535 1.

세부

  • 가장 왼쪽 삼각형은 항상 위쪽을 가리 킵니다.
  • 후행 공백이있을 수 있지만 불필요한 선행 공백이 없을 수 있습니다.
  • 선택적인 후행 줄 바꿈이있을 수 있습니다.
  • 에 대한 참고 1출력 두 줄 긴하지만, 그렇지 않으면 세 가지입니다. 필수입니다.
  • 바이트 단위 의 최단 제출 이깁니다.

답변:


32

피스, 44 42

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

첫 번째 줄 :

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.

다른 두 선은 제 라인 이루어지는 것을 알아 차리고 의해 생성 " /"하고 "\ "입력 + 1 회 교대, 세번째 라인 구성 "/""__\"동일한 방식으로 번갈아.


158
파업 44는 여전히 정상입니다 44 :(
Optimizer

4
42 . 물론이야!
mbomb007

48
@Optimizer : 나는 (44)의 모양을 당신의 슬픔 질문보다 더 많은 표를 받았다고이 끝없이 재미있는 발견 또는 이 답변.
Alex A.

6
44 개의 체인에서 10 개의 답변을 받았습니다
Leo

3
@AlexA. 44 세에 대한 옵티마이 저의 슬픔에 대한 즐거움이 질문이나 답변보다 더 많은 표를 받았다는 것이 끝없이 재미 있습니다.
isaacg

24

SQL, 182 175 173 187 바이트

이것이 가장 짧은 것은 아니지만 여전히 sql을 최소화하려고 시도하는 것이 재미 있습니다.) lol 나는 Oracle 11 에서이 작업을 수행했지만 기본 SQL이어야합니다. 지적했듯이, input = 1 규칙을 적용하지 않았으며 2 줄만 표시했습니다. 더 좋은 방법을 생각할 수는 없지만, 나는 v 로직을 수정하여 몇 바이트를 절약했다; 2) 미리 2를 추가하면 나중에 반복하지 않아도 몇 바이트가 절약된다 [/ 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]은 불필요한 공백을 제거했습니다. [/ edit1] [edit2] && i가 & i로 변경되었습니다. 그것은 2 문자를 줄이지 만 사용자가 삼각형 수를 두 번 입력하도록 강요합니다. 공포!! [/ edit2]

설명 (참고 :이 설명에서는 && 1을 사용하므로 한 번만 프롬프트되고 위의 & 1은 코드 공간을 절약하지만 여러 번 프롬프트합니다.)

 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);

산출

  SQL> accept i
  1
  SQL> /

   /\
  /__\


  SQL> accept i
  2
  SQL> /

    ____
   /\  /
  /__\/


  SQL> accept i
  3
  SQL> /

    ____
   /\  /\
  /__\/__\


  SQL> accept i
  12
  SQL> /

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


  SQL>

1
후에 공간을 제거하는 것이 효과가 from있습니까? 그렇다면 바이트를 절약 할 수 있습니다.
Alex A.

오 좋은 주인님 방금 그것을 시도 .. 그리고 나서 내가 할 수있는 공간을 제거하는 "도시로 갔다"... Oo이 빨판은 지금 읽을 수 없습니다 ..하지만 여전히 작동합니다;) lol (나는 별칭이 여전히 그런 식으로 작동한다고 믿을 수는 없습니다 .. Oo hehe )
Ditto

나는 upvotes에 혼란스러워 해요! Oo 가장 작은 크기에 가까운 곳은 없지만 아직 .. 공감대입니다! 와우
Ditto

2
업 보트는 일반적으로 창의적이거나 사용 된 언어가 드물거나 여러 가지 이유로 제출물을 좋아하는 사람들을 나타냅니다. 내 경험상 가장 짧은 코드 골프 답변이 가장 많이 투표되는 경우는 드 un니다. 따라서 이것이 가장 짧은 답변은 아니지만 커뮤니티는 좋은 답변으로 간주했습니다. :)
Alex A.

@Alex .. cool, gravy :) (나는 엑셀에서 이것을 시도해야 할거야 ... lol)
Ditto

11

파이썬 2, 89 88 87 85 83 명명 / 81 명명되지 않은

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

(1 바이트는 @orlp, 다른 3 개는 @xnor에게 감사합니다)

이것은 int를 가져 와서 n행 단위 접근 방식을 사용하여 삼각형을 문자열로 반환 하는 함수입니다 .

예를 들면 print f(10)제공

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

첫 번째 행의 경우, 대신에 (n>1)*우리가 사용하는 1%n*, 이후는 1%n0 경우이다 n == 11 경우 n > 1.


1
캐릭터를 깎아서 " /\\ "로 바꿀 수 있습니다 " /\ ".
orlp

이 람다는 파이썬 3에서도 작동하지 않습니까?
mbomb007

2
@ mbomb007 바닥이 있습니다
Sp3000

@orlp 지금 당장 혼란을 더할 수 있지만 의견을 삭제하려면;)
FryAmTheEggman

"\n".join()목록이 첫 번째 요소를 조건부로 제거하는 데 사용되는 경우에도 3 개의 항목에 대해 의심 됩니다. 아마도 b*(x+"\n")+y+"\n"+z더 짧은 것입니까?
xnor

7

자바 스크립트 (ES6) 101 109

너무 길다

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

설명

함수 정의에 팻 화살표 사용 또한 {}블록은 없습니다 . 함수 본문은 반환 값인 단일 표현식입니다. f=(a,b,c)=>expr에 해당

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

단일 표현식 안에서 ifor 와 같은 문장을 사용할 수는 var없지만

  • 기본값을 가진 매개 변수는 로컬 변수로 사용할 수 있습니다
  • 조건식이 ?:대신 잘 작동합니다.if else
  • 쉼표 연산자를 사용하여 하위 표현식을 더 추가하거나 함수에 사용되지 않는 매개 변수로 더 좋습니다. 이 경우 할당은 w함수에 대한 두 번째 (사용하지 않은) 매개 변수입니다.z

f함수를 다음과 같이 다시 작성할 수 있습니다

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 콘솔에서 테스트

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

산출

 /\   
/__\ 

  ____
 /\  /
/__\/

  ____
 /\  /\   
/__\/__\ 

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

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

잘 했어요! 어제 너무 짧아서 짧아지고 109를 다른 방식으로 재현하는 데 최선을 다했습니다. -8이 상당히 뛰어납니다.
DocMax

시원한. 설명을 게시 해 주시겠습니까? 나는 사용을 완전히 이해하지 못합니다w
BadHorsie

@BadHorse 설명이 추가됨 (실제로 이번에)
edc65

관심이 없다면 나는 후행 공백없이 시도했지만 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 (의도적으로 템플릿 문자열 등을 사용하지 않음)를 생각해 냈습니다 .

6

CJam, 55 53 51 바이트

SSri:I2/4*'_*N]I1>*" /\ "I*I)2*<N"/__\\"I*I2*)I2%+<

나는 파이썬 답변을 이식하려고 시도했지만 다른 CJam보다 짧았습니다.

퍼머 .


6

하스켈 155 153 139 131 바이트

원래의 방법보다 약간 짧은 접근법이 발견되었습니다. 내 원래 시도는 아래에 보존됩니다. 이전과 마찬가지로 골프 팁이 높이 평가됩니다.

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

골프 팁을위한 Nimi에게 감사합니다.


이전 시도 197 179 바이트

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
골프에 대한 몇 가지 힌트 : (mod n 2)==0even n이상 사용 odd n하고, 교환 thenelse부분. concat.take(div n 2).repeat이다 take(4*div n 2).cycle모든 목록 요소는 긴 이름, 예와 기능 4. 할당 짧은 이름의 길이 때문에 z=zipWith다음 사용 - z. 몇 칸을 쫓아 낼 수 있습니다 ...repeat""else[....
nimi

@nimi 힌트를 주셔서 감사합니다! 그것들을 사용하여 원래 솔루션을 179 바이트로 골프화 할 수있었습니다. 내 접근 방식을 재고함으로써 솔루션을 155 바이트로 줄일 수있었습니다.
ankh-morpork

1
힌트 : 파트 II : foldr z["","",""]foldr1 z입니다. 접을 목록이 절대로 비어 있지 않기 때문입니다. 대신에 all(==' ') 사용할 수있는 ==" "-이 여기에 N = 1의 경우 빈 줄을 제거하는 데 사용되기 때문에, (<그 사이 두 개의 공백)를 첫 번째 줄입니다 " ". 의 첫 번째 정의 t는 한 줄로 작성할 수 있습니다 t n|odd....
nimi

4

CJam, 73 68 63 62 60 바이트

이것은 확실히 골프가 필요합니다 ...

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

여기에서 테스트하십시오.

설명

"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

줄리아, 115 바이트

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

이것은 정수를 받아들이고 삼각형을 인쇄하는 명명되지 않은 함수를 만듭니다. 호출하려면 이름을 지정하십시오 (예 :) f=n->(...).

언 골프 + 설명 :

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

출력 예 :

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

나는 이것이 너무 길다라고 꽤 부풀어 오른다. 골프 기회가 충분하다고 확신하지만 지금은 분명하지 않습니다. 제안 사항이 있거나 추가 설명이 필요하면 알려주세요!



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);}

언 골프

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
잘 했어! while루프 를 사용하는 것이 좋지 않으며 루프 를 사용하는 것이 좋습니다 for. 이 경우 mfor 루프 초기화에 정의를 포함 b=!b하고 마지막에 호출 한 것을 정의하여 2 바이트를 절약 할 수 있습니다 . stringbool로 교체하여 비용을 절약 할 수도 있습니다 var. 또한 "()"around n>1절이 필요하지 않으며 절에서 부수적 인 부작용이나 역 참조가 없기 때문에 s+=단락이 &아닌 회로를 사용할 수 있습니다 &&. 마지막으로 ;) 1>0보다 짧습니다 true.
VisualMelon

3

C #, 257 183 바이트

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);}

편집 : @ VisualMelon의 팁 덕분에 74 바이트가 절약되었습니다.

나는 그것이 최고의 언어에서 골프에 이르기까지는 없다는 것을 알고 있지만, 경쟁에서이기는 것이 아니라 C #의 다양한 뉘앙스에 대해 배우는 데 주로 관심이 있습니다. 이것은 기본적 으로이 Pyth 답변 의 포트입니다 .

나는 for 루프가 더 골프화 될 수 있다고 생각하지만, 3 차 진술이 어떻게 포함되어 있는지 잘 모르겠습니다.

예 (1, 2, 3, 10) :

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

언 골프 드 :

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는 빠르고 사랑 스럽지만 적은 바이트 수를 원한다면 s+=친구입니다. 실제로, 당신은 for 루프를 조금 더 작게 만들 수 있습니다. ++and --연산자 의 기쁨 / 공포 는 조건부 검사에서 대부분의 작업을 수행 할 수 있음을 의미합니다 for(i=0;i++<=t;)(이것이 i작거나 같은지 확인한 t 증가시킵니다). int ifor 루프 외부 를 정의 하고 재사용하는 것이 좋으며 i, 음수가 아닌 것을 보장 i%2==0할 수 있으므로를 바꿀 수 있습니다 i%2<1. 이러한 변경으로 200 바이트 이하의 점수를 쉽게 얻을 수 있습니다.
VisualMelon

1
또한 LINQPad 또는 이와 유사한 것으로 작성했다고 생각합니다. 일반적으로 액세스 Enumerable하려면 using System.Linq지시문이 필요 하기 때문에 일반적으로 그러한 조항이 포함되어 있다고 생각합니다. 그러나이 경우 LINQ var s=" "+string.Join("____",new string[1+t/2])+n;를 포함하지 않고 현재 코드보다 짧은 LINQ 로만 대체 할 수 있습니다 . 다른 "____"에 맞추려면 다른 null 문자열이 필요하기 때문입니다. 변수 n는 "\ r \ n"으로 선언됩니다.
VisualMelon

좋은 팁! Enumerable에 System.Linq가 필요하다는 것을 잊어 버렸습니다. 요즘에는 거의주의를 기울이지 않습니다. for 루프 팁이 편리합니다!
Trent

약간 늦었지만, Console.Write대신 사용하여 4 바이트를 절약 할 수 있습니다.Console.WriteLine
Metoniem

2

자바, 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;}

설명

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 님의 답변에서 영감을 받음

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;}

언 골프

    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
니스, 다른 답변에 댓글을 달기 전에 이것을 어떻게 놓쳤는 지 확실하지 않습니다! 그 과부하는 new String나에게 새로운 것입니다! t=""골프 버전에서 당신 을 놓친 것 같지만 더 좋은 방법 t은 "\ n" 으로 초기화하는 것 입니다. for-loop :에 "{}"을 저장하여 tflip 위치 에 추가하여 몇 바이트를 절약 할 수 있습니다 . bt+=(b=!b)?"/":"__\\"
VisualMelon

1
@tis 당신은 t전에 정의 s하고 ; t보다는 문자열에 추가 하면 몇 가지 더 저장할 수 있습니다 "\n".)
VisualMelon

1

가다, 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)}

언 골프 드 :

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)
}

여기서 유일한 트릭은 (그리고 심지어 좋은 것도 아닙니다) 3 개의 누산기를 사용하는 것이므로 솔루션을 1 루프로 압축 할 수 있습니다.

코드는 여기에서 실행할 수 있습니다 : http://play.golang.org/p/urEO1kIjKv


8c += `__\` if i<n{c+="_"}
Def

@MarcDefiant 업데이트, 감사
Kristoffer Sall-Storgaard

1

> <> (생선) , 215 (183) 156 바이트

편집 : Notepad ++은 CR로 인해 5 바이트를 추가로 제공 했으므로 그에 따라 수정 된 수

약간 더 골프를 쳤지 만 지금까지 나의 첫 번째 물고기 프로그램입니다.> _ <1 개의 삼각형에 빈 첫 줄이 없어야하는 요구 사항이 프로그램 크기의 두 배가되었습니다.

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/ 에서 테스트 가능 (길이는 초기 스택의 정수)

설명:

       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
좋은 통역! 직접 만들었습니까?
Sp3000

조금도 아닙니다. : PI는 언어를 스스로 가르치고 디버깅하기 위해 광범위하게 사용했습니다. 나는 방금 언어가 떠 다니는 것을 보았고 그것이 매우 흥미 로웠다고 생각했다.
Fongoid

1

109 108 106

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

나는 이것이 첫 번째 골프에 괜찮다고 생각합니다. 나는 첫 번째 줄에 Vynce의 섹션을 사용했고 나머지 코드는 1 개의 삼각형으로 새 줄 문제를 극복했습니다.

이제 짧게 할 수 있는지 확인하려면 :)

편집 : 공백

편집 2 : 교체 "\n"와 함께$/

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 버전 :

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);
}

출력 :

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

입력하면 스택이 오버플로 65535되지만 ( -O3!로 컴파일 하면 안됩니다) 이론적으로는 작동합니다 ;-)

편집 : 프로그램은 이제 경우에만 두 줄을 출력해야하는 요구 사항을 충족 1프로그램에 전달됩니다 : 편집이 사용 int*대신을char*


작동하는 main것처럼 선언 할 수 main(c,v)**v;있습니다.
FUZxxl

전역 변수 를 사용 c하거나 n전역 변수로 무언가를 저장할 수 있는지 궁금해서 해당 매개 변수를에 전달할 필요가 없습니다 r(). 귀하의 답변이 다음을 준수한다고 생각하지 않습니다Note that for 1 the output is two lines long but otherwise it's three. This is required.
Level River St

@FUZxxl 불행히도 이것은 작동하지 않습니다 :-(error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
MarcDefiant

@ steveverrill은 그것을 고쳤지만 코드를 강화해야했습니다. 글로벌이 n있거나 c더 짧은 솔루션을 찾을 수 없습니다 .
MarcDefiant

@MarcDefiant 통과 할 수 있었습니까 int**?
FUZxxl

1

C ++ stdlib, 194 바이트

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;}

테스트 프로그램 :

#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

배시, 166 (127) 125 (119) 105 바이트

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

함수에서 :

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

일부 프리젠 테이션으로 :

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

렌더링 할 수 있음 ( 그림을 설치 한 경우) :

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

변수 대신 입력 하는 경우 2 문자를 저장 $1: 103

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

루프로 :

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

다음과 같이 렌더링합니다 (약).

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


 _ _ _ 
(_|_|_)

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

1
figlet 구현 코드 골프에 대한 질문을 게시해야합니다!
sergiol

1

, 27 바이트 (비경쟁)

언어가 도전 과제를 게시하기 때문에 비경쟁.

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

FEN﹪鲫

길이가 교대로 반복되는 비트 목록을 생성 n하고 반복합니다.

P×⁴_

그리기 ____커서를 이동하지 않고.

↗⊗¬ι↓

첫 번째 삼각형과 다른 삼각형마다 왼쪽을 그립니다 /.

P↘²

그리기 \커서를 이동하지 않고 측면을.

↘⊗ι↑

두 번째 삼각형과 다른 모든 삼각형에서 왼쪽을 \다시 그려 커서를 이동하십시오.

P↗⊗ι

두 번째 삼각형과 다른 삼각형마다 /커서를 움직이지 않고 오른쪽을 그립니다 .


1
답변이 더 이상 경쟁이 아닌 것으로 표시 될 필요가 없습니다.
Jo King

1

PowerShell , 116 95 바이트

21 바이트를 저장 한 Mazzy와 ASCII만으로 큰 감사

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

온라인으로 사용해보십시오!

n = 1에 빈 줄을 허용하지 않으면 14 10 바이트 처럼 먹었습니다 . 이 솔루션은 꽤 뇌 죽은 훨씬 더 영리 반복되는 코드의 최소한의 양. 은행가의 반올림은 여전히 ​​실제 악마입니다.


빈 줄은 허용되지 않습니까 ???
ASCII 전용

@ASCII 전용 OP에서 네 번째 글 머리 기호를 읽습니다.
Veskah


1
@ ASCII-only x = 3에서 나누기 문자열 교체는 은행가의 반올림을 우회하는 방법입니다
Veskah

1
@mazzy 첫 번째 줄을 생성 할 수 없습니다. 그렇지 않으면 102입니다.
ASCII 전용

0

C, 368 바이트

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문장 을 세면 더 중요 하지만 경고가 없지만 gcc에서 컴파일되었습니다. 나는 그것이 가장 짧지는 않다는 것을 알고 있지만, 여전히 C에서 그렇게하는 것을 좋아합니다.


매크로 #define p(c)printf(c)가 함수보다 짧습니다. 함수에서 리턴 유형을 생략 할 수 있습니다 (기본값은 int). C89이와 같은 스타일로 함수를 정의 할 수도 있습니다 main(c,v)char**v;{}. 짧게int main(int c, char** v){}
MarcDefiant

0

펄 (단순) 131 125 120

상당히 간단한 첫 패스 :

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

누가 명시적인 정수가 필요합니까?

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

0

프롤로그, 126 바이트

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].

처럼 호출하십시오 $3.

더 읽기 쉬운 :

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]).

예:

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

0

C # : 1 줄 LINQ, 198 바이트

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

레티 나 , 88 바이트 (비경쟁)

언어가 도전 과제를 게시하기 때문에 비경쟁.

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

온라인으로 사용해보십시오! 설명:

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

입력을 한 쌍의 삼각형으로 교체하십시오.

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

삼각형에 원래 입력 값을 곱하십시오.

%`(.+)\1$
$1

삼각형을 2로 나눕니다.

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

왼쪽 반 삼각형을 제거하십시오.

G`\S

첫 번째 줄이 비어 있으면 제거하십시오.




0

05AB1E , 37 바이트

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

온라인으로 시도 하거나 처음 10 개의 출력을 확인하십시오 .

설명:

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

자바 11, 122 바이트

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

온라인으로 사용해보십시오.

설명:

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.