文字列を爆発させる


34

任意の文字列を指定して、テキストが各対角線に沿って上下に移動する三角形の形式で印刷します。たとえば、の入力は次"Hello World"を出力する必要があります。

                    d
                  l  
                r   d
              o   l  
            W   r   d
              o   l  
        o   W   r   d
      l       o   l  
    l   o   W   r   d
  e   l       o   l  
H   l   o   W   r   d
  e   l       o   l  
    l   o   W   r   d
      l       o   l  
        o   W   r   d
              o   l  
            W   r   d
              o   l  
                r   d
                  l  
                    d

適切な形式を維持するために、行の各文字間のスペースは少なくとも1でなければなりません。


1
文字列が空でないと仮定できますか?
Mr Xcoder

@ Mr.Xcoderはい、できます
machiavelli

1
行の各文字間のスペースは少なくとも1でなければなりません。これは、それH l o W r dが有効な中央行であることを意味しますか?あなたの例では、各行には各文字の間に3つのスペースがあるため、尋ねます。
エミグナ

1
@エミグナ質問を誤解した、私の謝罪。はい、あなたの例は有効です。
machiavelli

1
先頭または末尾のスペースは許可されますか?
ルイスメンドー

回答:


19

10 7バイト

↗ELθ✂θιUE¹

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

    ↗       Print up and to the right
     ELθ✂θι All suffixes of the input, as a list down and to the right
    UE¹     Insert blank columns

初めてUEコマンドを使用するようになりました。


..私はほとんど自分自身を開始したくた..炭は、ここで最初の答えの一つであることを知っていたが、私は時間内に解決策を完了することで、経験の浅いへの道だし、それはとにかく、アウトgolfedになるだろう;)
ケビンクルーッセン

6
@Emignaが...しかし、これは使用に私の大きなチャンスだったUE...
ニール

6
@EriktheOutgolfer ...しかし、これは使用する私の大きなチャンスでしたUE..
ニール

1
@Neil -3バイトです!素敵な犠牲のために-3!素敵な-3が欲しくないのは誰か
エリックアウトゴルファー

4
@EriktheOutgolferあなたが言うことになっているのは、「05AB1Eがあなたを打ち負かすことはできませんよね?」
ニール

12

05AB1E10 8 7バイト

2バイトを節約してくれたEmignaに感謝します!

ðâƶ.cðζ

05AB1Eエンコードを使用します。オンラインでお試しください!


この行とおり、行の各文字間のスペースは、少なくとも1つ削除できます¶«。(OPで有効性も検証)
エミグナ

@Emignaありがとう!:)
アドナン

Tioリンクの更新が必要な場合があります:)
Mr. Xcoder

@ Mr.Xcoder忍者 '
アドナン

1
賢い利用âðâの代わりにSð«
エリックアウトゴルファー


8

C、86 78 73 70文字

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

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

説明

単純な実装:2サイクル、上から下、左から右(99バイト)を埋める:

for(int j=1;j<n*2;j++){for(int i=0;i<n;i++)printf("%c ",(i+j)%2&&i+1>=abs(j-n)?s[i]:' ');puts("");}

ここでは、puts()は出力に\ nを出力するだけです。変数宣言を組み合わせて、j ++を何か(94バイト)と組み合わせましょう。

for(int i,j=0;++j<n*2;){for(i=0;i<n;i++)printf("%c ",(i+j)%2&&i>=abs(j-n)?s[i]:' ');puts("");}

良い。変数jの範囲は0 ... 2nです。-n ... n内に入れてください。これにより、数学が簡単になります。&&の右側のブール式の値は常に0または1です。これは、&&を&に置き換えることができることを意味します。91バイト:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)printf("%c ",~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

そして今、私たちは余分なスペースを印刷していることに気付きました。そして、1つのシンボルを印刷するためにprintf()は必要ありません。86バイト:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)putchar(~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

さらに良い。条件i * i> = j * jはi> = abs(j)と同じですが、より短いことに注意してください。puts()をforループ増分式に移動しましょう。そして何だと思う?実際、i + jを囲む中括弧は必要ありません。78バイト:

for(int i,j=-n;++j<n;puts(""))for(i=0;i<n;i++)putchar(i*i>=j*j&~i+j?s[i]:' '); 

putchar()が出力した文字を返すことをご存知ですか?XORを使用して、数値の等価性をテストしましょう。スペースをASCIIコードの32に置き換えましょう。行末文字コードは13であることに注意してください。そして最後に、GCC / Clangがhttps://en.wikipedia.org/wiki/Elvis_operatorをサポートしていることを知っていますか?73バイト:

for(int i,j=-n;++j<n;)for(i=0;putchar(i*i>=j*j&~i+j?s[i]?:13:32)^13;i++);

最後に、何を推測しますか?2つのforループは必要ありません。い〜i + jをijだけに置き換えることができます。70バイト:

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

今後の作業:ループの方向を変更しますか?適切に行われた場合、これはいくつかのバイトを節約するかもしれません。


5

SOGL V0.1213の 10 9 バイト

ēI*@∑}¹╚H

これは、私が追加したばかりの機能を使用しますが、しばらく前に文書化されました

ここで試してみてください!
そのリンク,に追加されるのは、これがスタック上の入力を予期する{ためであり、そうでない場合,はループ内で毎回実行されるためです。

implicitly start loop over POP
ē            increase the variable E, on first push which will be 0
 I           increase by 1
  *          multiply the current character that many times
   @∑        join with spaces
     }     end loop
      ¹    wrap everything on stack in an array
       ╚   center vertically
        H  rotate counter-clockwise


3

ガイア、16バイト

$:ċ⟪×$§×⟫†€|$¦tụ

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

説明

$                 Split into list of chars
 :ċ               Push [1 .. len(input)]
   ⟪×$§×⟫†        Apply this block to corresponding elements of the two lists:
    ×              Repetition
     $             Split into chars
      §×           Join with spaces
          €|      Centre align the rows
            $¦    Split each line into chars
              t   Transpose
               ụ  Join each row with spaces, then join the rows together with newlines




3

Java、292バイト(申し訳ありません)

public class D{
public static void main(String[]r){
String s=r[0];int L=s.length(),n=L*2-1,x=L-1,d=-1,i,j;boolean a=false,o=L%2==1;
for(i=0;i<n;i++){
for(j=0;j<L;j++)System.out.print(j<x||a&&j%2==(o?0:1)||!a&&j%2==(o?1:0)?' ':s.charAt(j));
System.out.println();
x+=d;if(x<0){x=0;d=1;}a=!a;}}}

1
改行を削除することもできますが、そうでない場合、これはかなりゴルフのように見えます!
ザカリー

1
1.:あなたはより多くのゴルフをすることができますboolean a=1<0,o=L%2>0;。2.必要ない場合はi、次のループを使用しますfor(i=0;i++<n;)。3.あなたは取り除くことができますoj%2<L%2それからj%2>L%2。4. das flipの使用には非常に多くの文字が必要ですj<(x<0?-x:x)。5.必要以上の変数があります。6.完全なプログラムは必要ありません。ラムダまたはメソッドで十分です。-ゴルフのJavaのサンプルが必要な場合は、私の答えを確認しください。
オリビエグレゴワール


3

Java(OpenJDK 8)、116バイト

s->{for(int l=s.length(),i=-l;++i<l;)System.out.printf("%"+l+"s%n",s.substring(i<0?-i:i).replaceAll("(.).","$1 "));}

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

説明

s->{                                // Consumer<String> lambda
 for(int l=s.length(),i=-l;++i<l;)  // For each length between l and 1 and back to l, 
  System.out.printf("%"+l+"s%n",    // Print with align to right
    s.substring(i<0?-i:i)           // skip the first |i| characters
     .replaceAll("(.).","$1 ")      // replace every even-positioned character with a space.
   );
}


3

Haskell140 137バイト

(m#n)s=(\(i,x)->' ':(last$"  ":[x:" "|rem i 2==m&&i>n]))=<<zip[0..]s
g s=((++)=<<reverse.tail)$id=<<[[(0#n)s,(1#n)s]|n<-[-1,1..length s]]

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

Challenger5に3バイトのthanlsを保存しました

私はそれが最適だとは思わない...

f行の1つを生成します(m= 0または1は行番号のモジュロ、行の番号nです)

g 「奇数」行と「偶数」行を挿入し、結果にそれ自体のミラーを追加します。


接頭辞関数ではなくf、中置関数(など(m#n)s=...)として定義することにより、バイトを節約できます。
エソランジングフルーツ



2

Mathematica 105バイト

(c=Characters@#;l=Length@c;StringRiffle@Table[If[Abs[j-l]<i&&EvenQ[j+i],c[[i]]," "],{j,1,2l+1},{i,1,l}])&

別のバイトを1つまたは2つ削ることもできるかもしれませんが、Mathematicaで文字列を処理する際の文字数のオーバーヘッドにより、このような非競争的な単純な課題が生じます。


2

J、54バイト

[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]

オンラインでお試しください!(TIOの出力には改行と3つのスペースがありますが、これは関数呼び出しからではなく、Jインタープリターが自動的に実行するものであることに注意してください)。

これを解決するための一般的なアイデアは正しいと思いますが、バイトカウントに追加している、おそらく次善の方法で行っている小さなこともあります。

以前の亜種

55バイト

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]

56バイト

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]

説明

これはいくつかの機能に分割されます。また、説明の後半部分については徹底的ではなかったので、特定の部分についてより良い説明が必要な場合はお知らせください。編集することができます。

dup   =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad   =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
  • dup 文字列内のインデックス(プラス1)と同じ回数だけ各文字を複製します
  • space 各文字の間にスペースを挿入します
  • pad 文字に適切なスペースを埋めます
  • trans 結果の行列を転置します

サンプル呼び出し:

   trans pad space dup 'abc'
  c
 b 
a c
 b 
  c

デュプ

>:@i.@# <@#"0 ]
>:@i.@#         Indices of each character plus one
      #          Length of the string
   i.            Range [0,length)
>:               Add one
        <@#"0 ] Duplicate each character as many times as it index (plus one)
           "0   For each
          #   ]  Copy the character
>:@i.@#           as many times as it index
        <        Box the result

結果はボックス化されており、Jが両端をスペースで埋めないようにします(長さが不均等であるため)。

サンプル呼び出し:

   dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘

スペース

(,' '&,)/&.>
         &.>  For each boxed element
(,' '&,)/      Insert spaces between each

サンプル呼び出し:

   space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘

パッド

|.@i.@# (>@],~' '#~[)"_1 ]
        (>@],~' '#~[)      Pad the right arg with spaces given by the left arg
|.@i.@#                    Indices in reverse order
   i. #                     Range [0,length)
|.                          Reverse

基本的に、最初の要素に長さ-1スペース、2番目に長さ-2などを追加します。また、ボクシングを削除します。

サンプル呼び出し:

   pad space dup 'abc'
  a  
 b b 
c c c

転置

これは|:、行列の転置を行う組み込み関数です。


1
同様のアプローチを使用しましたが、ボクシングは避けました。45バイト:|:@(-@i.@-@#|."0 1((,@,.~' '#~#)@$"0~1+i.@#))。確実にさらにゴルフすることができます。この部分-@i.@-@#は、ぶら下がっている果物です。おそらく、
ジョナ

@ジョナ私はあなたの答えがどのように機能するかをすぐに解読することはできませんので、私の答えの説明を含めたいので、あなたが望むならそれを投稿するためにあなたに任せます。私にとって今のJは書き込み専用言語だと思います。
コール

すばやく解読するのに役立ちます:f=. <some tacit expression>5!:2 <'f'ボックス化された視覚化を5!:4 <'f'提供し、ツリーの視覚化を提供します。私の場合、$"0~1+i.@#まず文字列で実行してから、の右側ですべてを実行してから、左側ですべてを|."0 1理解し|."0 1、最終的な転置を保存して、必要な回転を行うだけです。
ジョナ

1
ああ、答えを更新することを期待していませんでした。それは「ちょっと、あなたはこれを面白いと思うかもしれません」ということでした。私はそれを投稿することもできましたが、高レベルのアプローチは十分に似ており、それは価値がないと感じました。
ジョナ

2
だけの複雑な引数を思い出し#、ここに役立ちますと、26のバイトを|:@((-#)|."_1(1j1##)"0)~#\
マイル


1

Perl 5、86 + 2(-F)= 88バイト

@Domの提案といくつかの独自の調整を使用して、バイト数を減らしました。

for$k(0..$#F){$i=1;$a[$#F+$k]=$a[$#F-$k]=[map$i++<$k|($i+$k)%2?$":$_,@F]}say"@$_"for@a

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


申し訳ありませんが、答えを入手できてうれしいです!私が私のものを修正しようとしていたときに少し遊びがあり、解決策が得られなかったなら、あなたの方がより良いアプローチでした!-aFすべての文字を入力するために数バイトをドロップし、いくつ@Fかの小さな調整を行うことができます(-F後にスペースが必要なので3としてカウントします):オンラインで試してみてください!
ドムヘイスティングス

1
-Fが3としてカウントされるのはなぜですか?せいぜい2であるべきではないでしょうか?それは違いはないperl -e'code...'perl -eF 'code...'。また、-a使用する際に不要である-Fので、そのバイトはカットすることができます。
-Xcali

それだけです。したがって-F、引数を受け入れますが、引数を渡したくないので(引数を分割せずに、各文字を独自に分割-Fできるように制御できます-a)、との違いにperl -ae '...'なりperl -aF -e '...'ます。デフォルトではで-a分割され/\s+/ます。それが明らかになることを願っています!
ドンヘイスティングス

また、$#F!常にそれを忘れてください!
ドムヘイスティングス

0

q / kdb +、55バイト

溶液:

-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x};

例:

q)-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x}"Hello World";
          d
         l
        r d
       o l
      W r d
       o l
    o W r d
   l   o l
  l o W r d
 e l   o l
H l o W r d
 e l   o l
  l o W r d
   l   o l
    o W r d
       o l
      W r d
       o l
        r d
         l
          d

説明:

TODO。改変されていないバージョンは66バイトです。

-1 flip{{1_a,((2*y)#" ",z),a:x#" "}'[reverse c;1+c:til count x]x};

ボーナス:

例と同じ出力(74バイト)を取得するには:

q)-1(+){1_'raze{(a,((2*y)#" ",z),a:x#" ";(2*y+x)#" ")}'[(|)c;1+c:(!)(#)x]x}"Hello World";
                    d
                  l
                r   d
              o   l
            W   r   d
              o   l
        o   W   r   d
      l       o   l
    l   o   W   r   d
  e   l       o   l
H   l   o   W   r   d
  e   l       o   l
    l   o   W   r   d
      l       o   l
        o   W   r   d
              o   l
            W   r   d
              o   l
                r   d
                  l
                    d
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.