文字列を三角形に折ります


22

長さが4で割り切れる文字列を指定すると、以下に示すように三角形を作成します。

文字列がの場合、abcdefghijkl三角形は次のようになります。

   a
  b l
 c   k
defghij

文字列がの場合、iamastringwithalengthdivisiblebyfour三角形は次のようになります。

         i
        a r
       m   u
      a     o
     s       f
    t         y
   r           b
  i             e
 n               l
gwithalengthdivisib

文字列がの場合、thisrepresentationisnotatriangle三角形は次のようになります。

        t
       h e
      i   l
     s     g
    r       n
   e         a
  p           i
 r             r
esentationisnotat

ノート

  • 文字列はからaまでの文字のみで構成されzます。
  • 形状が壊れていない限り、先頭と末尾の空白と改行は許可されます。
  • 出力としての文字列のリストが許可されています。

これはです。バイト単位の最短回答が優先されます。標準の抜け穴が適用されます。

回答:


7

25 22 21バイト

≔÷Lθ⁴λ↙…θλ→✂θλ±λ↖✂θ±λ

オンラインでお試しください!リンクは、コードの詳細バージョンです。文字列を3つの部分にスライスし、適切な方向に印刷します。編集:整数の除算とスライスを使用して3バイトを保存しました。文字列の先頭のCycleChop代わりにSliceを使用して、さらにバイトを保存しました。編集:木炭は、ポリゴンのエッジに沿って任意のテキストを描画できるようになり、コードが12バイトに簡素化されました。

GH↙→→↖⊕÷Lθ⁴θ

オンラインでお試しください!リンクは、コードの詳細バージョンです。


sは何をしますか?
エリックアウトゴルファー

@EriktheOutgolferこれが新しいスライス演算子です。
ニール

:| おっとPolygonHollowこれを行うにするためのもの、GH↙→→↖⊕÷Lθ⁴θ私は炭を押して次の時間に動作します
ASCIIのみ

6

05AB1E、23バイト

ćsIg4÷GćsÁćsŠN·<ú«s}».C

オンラインでお試しください!

説明

ć                        # extract head of input
 s                       # swap the remaining string to top of stack
  Ig4÷G                  # for N in [1...len(input)/4-1] do:
       ć                 # extract head
        sÁ               # swap remaining string to top of stack and rotate right
          ć              # extract head
           sŠ            # reorder stack as tail, head, remaining
             N·<ú        # prepend N-1 spaces to tail
                 «s      # concatenate with head and swap remaining string to top
                   }     # end loop
                    ».C  # join by newlines and center

6

JavaScriptの(ES6)、119の 117 108 105バイト

s=>(l=s.length/4,S=' ',g=([c,...s],p)=>S.repeat(l)+c+(l--?p+s.pop()+`
`+g(s,p?p+S+S:S):s.join``))(s+S,'')

書式設定およびコメント化

s => (                            // given the input string s:
  l = s.length / 4,               // l = length of side edge - 1
  S = ' ',                        // S = space (defining S costs 6 bytes but saves 7)
  g = (                           // g = recursive function which takes:
       [c,                        //   - c = next character
           ...s],                 //   - s = array of remaining characters
                  p) =>           //   - p = middle padding string
    S.repeat(l) + c + (           // append left padding + left character
      l-- ?                       // if side edges are not complete:
        p + s.pop() + '\n' +      //   append middle padding + right character + Line Feed
        g(s, p ? p + S + S : S)   //   and do a recursive call with updated middle padding
      :                           // else:
        s.join``                  //   append all remaining characters and stop recursion
    )                             //   (this is the bottom edge)
  )(s + S, '')                    // initial call to g()

テストケース


4

C#、260バイト

namespace System{using static Console;class P{static void Main(){var d=ReadLine();int e=d.Length/4,x=e,y=0,g=0,i=0;Action<int,int>a=(p,q)=>{SetCursorPosition(p,q);Write(d[g++]);};for(;i<e;i++)a(x--,y++);for(i=0;i<e*2;i++)a(x++,y);for(i=0;i<e;i++)a(x--,y--);}}}

本当に使用したかったSetCursorPosition

ゴルフをしていない:

namespace System {
    using static Console;

    class P {
        static void Main() {
            var d = ReadLine();
            int e = d.Length / 4, x = e, y = 0, g = 0, i = 0;
            Action<int, int> a = (p, q) => { SetCursorPosition(p, q); Write(d[g++]); };
            for (; i < e; i++)
                a(x--, y++);
            for (i = 0; i < e * 2; i++)
                a(x++, y);
            for (i = 0; i < e; i++)
                a(x--, y--);
        }
    }
}

私の無知を許してください。しかし、あなたの解決策における行動の目的は何ですか?void関数よりもバイト数が少ないのですか?
混乱して混乱

1
@confusedandamused私は単一の関数の答えを書くのに慣れているので、関数を普通に置くことさえ考えませんでしたが、それはもっと短くなります。
LiefdeWen

3

Mathematica、164バイト

(b=Length[c=Characters@#];k=Column[#,Alignment->Center]&;T=Table;k@{#&@@c,k@T[""<>{c[[i+2]],T[" ",2i+1],c[[-i-1]]},{i,0,(a=b/4)-2}],""<>T[c[[i]],{i,a+1,b/2+1+a}]})&


入力

["iamastringwithalengthdivisiblebyfour"]


私たちは皆、それ[[1]]をに置き換えることができることを知っています#&@@
user202729

1
あなたはすべてとても賢いお菓子です!
-J42161217


自分がやっていることがわかったら@(...)[...]代わりにやってください。そして、私はテストしていませんが、おそらくColumn名前を付けて(またはColumn[#,Alignment->Center]&回避するためにq)、残りのすべての変数を外側の最初の引数に入れることによってColumn(周囲の括弧を保存するために)おそらく別のバイトを保存できます。
マーティンエンダー

3

Python 3、120バイト

最初のゴルフでは、途中でPythonを習得することも考えられました。

a=input()
l=len(a)//4
print(l*" "+a[0])
for i in range(1,l):print((l-i)*" "+a[i]+(2*i-1)*" "+a[4*l-i])
print(a[l:3*l+1])

オンラインでお試しください!

説明:

最初の文字はlen(a)//4スペースの後に単独で印刷されi、2番目以降の最初と最後の文字は2*i - 1スペースで区切って印刷されます。

最後に、残りの部分文字列が出力されます。


PPCGへようこそ!このソリューションから学ぶことができます
リーキー修道女

ここで考えられるゴルフは、を宣言してp=printから、使用pする3 print秒間だけ使用することです。
FlipTack

また、文字列の長さは常に4で割り切れることが保証されているため、//(フロア分割)はに置き換えることができます/
FlipTack

ところで、オンラインで試すためにリンクしたコードは、答えのコードと同じではありません。
FlipTack

3

GNUはsedの178 158 132 + 1 = 133のバイト

-rフラグ用に+1バイト。

s/(.)(.*)(.)/ \1\n\2;\3/
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1  \6\n\3;\4\5/m
t
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
s/. (.)$/\1/gm

オンラインでお試しください!

説明

以前のリビジョン私は直感的に、私は必ず彼らを避けることができたにもかかわらず、数学、特別な場合、およびクリーンアップを扱うバイトの多くを使用しました。私はそれ以来、ほとんど何とかそうすることができました。

inputがあるとしますabcdEFGHIJKLMnop。文字EFGHIJKLMは三角形の下部になるため、視覚的な補助として大文字を使用しました。

最初に、最初の文字を独自の行(スペースが前に付く)に置き;、最後の文字の前にカーソル()を挿入することにより、入力を準備します。

s/(.)(.*)(.)/ \1\n\2;\3/

今、私たちは持っています:

 a
bcdEFGHIJKLMno;p

次に、ループで、最後の行にいくつかの処理を行います。1.前の行からスペースをコピーし、最初の文字に2を加えた後に挿入します。2.スペースの直後に最後の文字を移動し、その後に改行を続けます。および3.カーソルを左に3文字移動します。

:
  s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1  \6\n\3;\4\5/m
  t

各反復の結果は次のとおりです。

 a
b   p
cdEFGHIJKL;Mno

 a
b   p
c     o
dEFGHI;JKLMn

 a
b   p
c     o
d       n
EF;GHIJKLM

ピラミッドが形になり始めるのを見ることができます。また、カーソルの目的を確認することもできます。各反復で左に3文字移動し、左に3文字がなくなると、ループが中断されます。ピラミッドの。

次に、同様の操作を行いますが、逆にします。ループでは、カーソルのある行の先頭から前の行の先頭に1を加えた行まで、カーソルをその行に移動するプロセスでスペースをコピーします。

:A
  s/(.*\n)( *)(.*);/ \2;\1\2\3/m
  tA

いくつかの反復と最終結果を以下に示します。

 a
b   p
c     o
 ;d       n
EFGHIJKLM

 a
b   p
  ;c     o
 d       n
EFGHIJKLM

...

    ; a
   b   p
  c     o
 d       n
EFGHIJKLM

いくつかの余分な文字を除いて、これですべて完了です。;最初の行のA と余分なスペース、および次の3行のピラミッドの「中央」の2つのスペース。単純な置換はそれらを取り除きます:

s/. (.)$/\1/gm

出来た!

    a
   b p
  c   o
 d     n
EFGHIJKLM


2

パイソン2100の97 96バイト

  • Jacoblawは1バイトを節約しました:整数除算は不要です
a=input()+" "
k=j=len(a)/4
while j:print j*" "+a[0]+(2*(k-j)-1)*" "+a[-1];a=a[1:-1];j-=1
print a

オンラインでお試しください!

説明:

ここで行ったスマートなことの1つは、最初の文字がペアになり、これがループにプッシュされるように、入力に末尾にスペースを埋め込むことです(末尾の空白が許可されているため)

abcdefghijkl[space]   
To print [0] [-1]            Output=>[spaces]a[another_calculated_spaces(=0 here)][space]
Strip at both ends(a[1:-1])  
bcdefghijkl                
To print [0] [-1]            Output=>[spaces]b[another_calculated_spaces]l
Strip at both ends(a[1:-1])
and so on.

続くループの数はと関連付けられていlen(word)//4ます。最後のステップでは、残りの文字列全体が印刷されます(これにより三角形の底辺が形成されます)。スペースは単純なパターンに従います。スペースの最初のセットは1ずつ減少し、スペースの2番目のセットは2ずつ増加します。


1
整数除算をしないことでバイトを削ることができますか?以来a、常に4の倍数になります//> -/
jacoblaw

私はそれは[[4で割り切れない長さの入力]のためにも、すべてのエラーを投げていない驚いて、ありがとうtio.run/...
officialaimm

1
それは、Python 2ではデフォルトで除算が整数だからです。それはPython 3に組み込まれました。–
CalculatorFeline

2

C 225バイト

p(c){putchar(c);}S(n){while(n--)p(' ');}main(int c,char**v){int i= strlen(v[1]),n=i/4,r;char*s=v[1],*e=&s[i-1];S(n);p(*s++);p('\n');for (r=1;r<n;r++){S(n-r);p(*s++);S(2*r-1);p(*e--);p('\n');}e++;while (s!=e)p(*s++);p('\n');}

説明した

p(c){putchar(c);}        // p is alias for putchar
S(n){while(n--)p(' ');}  // S prints n spaces
main(int c,char**v){
    int i= strlen(v[1]), // counter
        n=i/4,           // num rows in figure - 1
        r;               // current row 
    char*s=v[1],         // start char
        *e=&s[i-1];      // end char
    S(n);p(*s++);p('\n');// print first row
    for (r=1;r<n;r++){ 
        S(n-r);p(*s++);S(2*r-1);p(*e--);p('\n'); // print middle rows
    }
    e++;while (s!=e)p(*s++);p('\n'); // print last row
}


1

オクターブ、87バイト

@(s,x=(n=nnz(s))/4)[[' ';flip(diag(s(1:x))')]' [' ';diag(s(n:-1:n-x+2))];s(x+1:n-x+1)];

* Windowsマシンでは、上記のコードは正しい結果を生成しますが、修正するためにいくつかのコードを追加しました。

説明:

[' ';flip(diag(s(1:x))')]'        %left side
[' ';diag(s(n:-1:n-x+2))]         %right side
s(x+1:n-x+1)                      %bottom side

オンラインでお試しください!





1

網膜、99バイト

^(.)(?=(....)+)
$#2$*  $1¶$#2$* 
( ( *).)(.*)(.)$
$1 $4¶$2$3
+`(( +).¶ ( *).)(.*)(.)$
$1$2  $5¶$3$4

オンラインでお試しください!説明:最初の2つのステージは最初の2行を生成しますが、その後は特別なケーシングは不要であり、後続の各行は自動的に生成できます。

thisrepresentationisnotatriangle

        t
       hisrepresentationisnotatriangle

        t
       h e
      isrepresentationisnotatriangl

        t
       h e
      i   l
     srepresentationisnotatriang

...

        t
       h e
      i   l
     s     g
    r       n
   e         a
  p           i
 r             r
esentationisnotat

1

Java 8、213バイト

s->{int n=s.length()/4,i;String r=s(n)+s.charAt(0)+"\n";for(i=1;i<n;r+=s(n-i)+s.charAt(i)+s(i*2-1)+s.charAt(n*4-i++)+"\n");return r+s.substring(i,n*2+i+1);}String s(int n){String r="";for(;n-->0;r+=" ");return r;}

説明:

ここで試してみてください。

s->{                           // Method (1) with String parameter and String return-type
  int n=s.length()/4,          //  The length of the input divided by 4
      i;                       //  And an index-integer
  String r=                    //  Result-String which starts as:
           s(n)                //   Trailing spaces
           +s.charAt(0)+"\n";  //   + the first character and a new-line
  for(i=1;i<n;                 //  Loop from `1` to `n`
      r+=                      //   And append the result-String with:
         s(n-i)                //    Trailing spaces
         +s.charAt(i)          //    + the character of the left diagonal line
         +s(i*2-1)             //    + center spaces
         +s.charAt(n*4-i++)    //    + the character of the right diagonal line
         +"\n"                 //    + a new-line
  );                           //  End of loop
  return r                     //  Return the result-String
         +s.substring(i,n*2+i+1);
                               //   + the bottom part of the triangle
}                              // End of method (1)

String s(int n){               // Method (2) with integer parameter and String return-type
  String r="";                 //  Result-String
  for(;n-->0;r+=" ");          //  Append the result-String with `n` spaces
  return r;                    //  Return the result-String
}                              // End of method (2)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.