ハッピーバースデーV!


72

この挑戦で助けてくれた @KritixiLithosに感謝します!


Vは、コードゴルフの課題でvimを使用および拡張できるように作成したプログラミング言語です。最初のコミットは2016年3月3日でした。つまり、今日Vは1歳になります。ウーフー

存在のVの最初の一年間、四つの異なる貢献者から176回のコミットがあった12人の異なるユーザからの140件の回答、およびカウントする、あまりにも多くの壊れた重複事業者。@Dennisがgeneしみなくホストしているオンライン通訳があり12月以来ほぼ8,000回実行されています。

Vの誕生日を祝うために挑戦しましょう!Vのほとんどの機能は文字列操作とを念頭に置いて設計されているため、Vを祝うための課題はアスキーアートに関するものであることが当然のように思えます。したがって、今日の課題は、単語を入力として受け取り、その単語をV字の形に変更することです。たとえば、入力 "Hello"は次のVを与える必要があります。

Hello         olleH
 Hello       olleH
  Hello     olleH
   Hello   olleH
    Hello olleH
     HellolleH
      HellleH
       HeleH
        HeH
         H

Vがどのように見えるかについての詳細を次に示します。入力文字列の長さがn文字の場合、V n*2は行の高さでなければなりません。最初の行は次のもので構成されている必要があります。

<input string><(n*2) - 1 spaces><input string reversed>

新しい行ごとに、先頭にスペースが1つ追加され、文字列の両側が互いに向かって移動し、重複する文字が削除されます。入力の最初の文字である最後の行まで。各行の末尾の空白は許容され、末尾の改行も許可されます。

入力は常に空白を含まない印刷可能なASCIIであると想定でき、任意の妥当な方法で入力および出力を取得できます。いくつかのサンプル入力を次に示します。

Happy:

Happy         yppaH
 Happy       yppaH
  Happy     yppaH
   Happy   yppaH
    Happy yppaH
     HappyppaH
      HapppaH
       HapaH
        HaH
         H

Birthday:

Birthday               yadhtriB
 Birthday             yadhtriB
  Birthday           yadhtriB
   Birthday         yadhtriB
    Birthday       yadhtriB
     Birthday     yadhtriB
      Birthday   yadhtriB
       Birthday yadhtriB
        BirthdayadhtriB
         BirthdadhtriB
          BirthdhtriB
           BirthtriB
            BirtriB
             BiriB
              BiB
               B

V!:

V!   !V
 V! !V
  V!V
   V

~:

~ ~
 ~

もちろん、これは、標準の抜け穴は禁止されており、目標はこのタスクを完了するために可能な限り短いプログラムを書くことです。ハッピーゴルフ!


価値があるのは、vimの回答がソフトスポットであるため、vimまたはVを使用した場合の想像上のボーナスポイントですが、どの言語でも受け入れられます。:)


すべての改行の後に単一のヌル文字(0x00)を印刷できますか?
小麦ウィザード

@wheatwizardうーん。それは少し奇妙ですが、出力が視覚的に同じである限り、それは問題ないと思います。
DJMcMayhem

21
5歳の誕生日は別のものになります!(ローマ数字)
アルバートレンショー

5
VeeによるV言語への最高の願い:-)
The Vee

回答:


44

MATL21 14バイト

MATLはVにお誕生日おめでとう!

tnEXyY+c3MZvZ)

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

説明

入力を検討する

'Hello'

長さのn=5。コードは、この文字列とサイズの単位行列の2D畳み込みを計算します2*n

[1 0 0 0 0 0 0 0 0 0;
 0 1 0 0 0 0 0 0 0 0;
 0 0 1 0 0 0 0 0 0 0;
 0 0 0 1 0 0 0 0 0 0;
 0 0 0 0 1 0 0 0 0 0;
 0 0 0 0 0 1 0 0 0 0;
 0 0 0 0 0 0 1 0 0 0;
 0 0 0 0 0 0 0 1 0 0;
 0 0 0 0 0 0 0 0 1 0;
 0 0 0 0 0 0 0 0 0 1]

畳み込みの結果は、charに変換され、char 0がスペースとして表示され、

['Hello         ';
 ' Hello        ';
 '  Hello       ';
 '   Hello      ';
 '    Hello     ';
 '     Hello    ';
 '      Hello   ';
 '       Hello  ';
 '        Hello ';
 '         Hello']

次に、[1, 2, ..., 2*n-1, 2*n, 2*n-1, ..., 2, 1]このcharマトリックスから列が選択され、目的の結果が生成されます。

['Hello         olleH';
 ' Hello       olleH ';
 '  Hello     olleH  ';
 '   Hello   olleH   ';
 '    Hello olleH    ';
 '     HellolleH     ';
 '      HellleH      ';
 '       HeleH       ';
 '        HeH        ';
 '         H         ']

コメント付きコード

t      % Implicitly input string. Duplicate
nE     % Length, say n. Multiply by 2
Xy     % Identity matrix of that size
Y+     % 2D convolution. This converts chars to ASCII codes
c      % Convert to char
3M     % Push 2*n, again
Zv     % Push symmetric range [1, 2, ..., 2*n, 2*n-1, ..., 1]
Z)     % Apply as column indices. This reflects the first 2*n columns
       % symmetrically, and removes the rest. Implicitly display

非常に興味深いアプローチ!+1
seshoumara

3
@seshoumaraありがとう!flawrが言うように、コンボリューションは、成功への鍵です :-)
ルイスMendo

38

V24、23、20のバイト

3Ù2Ò Íî
Xæ$òâÙHãêxx>

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

Vには「逆」演算子があるため、はるかに短くなりました

答えた他のゴルフ言語と比べてそれほど印象的ではありませんでしたが、やらなければなりませんでした。Hexdump:

00000000: 33d9 32d2 20cd ee0a 58e6 24f2 e2d9 48e3  3.2. ...X.$...H.
00000010: ea78 783e                                .xx>

説明:

3Ù                  " Make three extra copies of this current line
  2Ò                " Replace each character on this line and the next line with spaces
     Íî             " Join all lines together
X                   " Delete one space
 æ$                 " Reverse the word under the cursor

この時点で、バッファーは次のようになります。

Happy         yppaH

いいえ、再帰的に三角形を作成します。

ò                   " Recursively:
 â                  "   Break if there is only one non-whitespace character on this line
  Ù                 "   Make a copy of this line
   H                "   Move to the first line
    ã               "   Move to the center of this line
     ê              "   Move to this column on the last line
      xx            "   Delete two characters
        >           "   Indent this line

ここで、Vのお気に入りの機能の1つを紹介します。多くのコマンドには引数が必要です。たとえば、>コマンドは引数に応じて可変数の行をインデントします。

>>    " Indent this line (this command is actually a synonym for '>_')
>j    " Indent this line and the line below
>k    " Indent this line and the line above
6>>   " Indent 6 lines
>}    " Indent to the end of this paragraph
>G    " Indent to the last line
...   " Many many many more

しかし、ほとんどのコマンドは、プログラムの最後にあり、指定されていない場合、デフォルトの引数(通常は現在の行)で強制的に終了します。たとえば、再帰ループに対してVが実際に実行するものは次のとおりです。

òâÙHãêxx>>ò

第二は、ò暗黙的に充填されています。クールなものは暗黙のうちに終了したコマンドは、いくつかの層が深い適用することで、我々は唯一の書いたようにもかかわらず>、Vは、暗黙的に与える_ことは引数のために、それは現在の行をインデントします。


私はそれに取り組んでいましたが、答える方がよりふさわしいと思います!
nmjcman101

29

Brainfuck、152バイト

これは非常に重要な機会です。私はol 'BFインタプリタをクラックし、これを試してみることにしました。

++++++++++[->+>+++<<]>>++>>+>>>,[[<]<<+>>>[>],]<[<]<<-[->+>>[>]>++++[-<++++++++>]<[<]<<]>[->++<]>[-<+>]<[<[-<+<.>>]<[->+<]>+>->>[.>]<[-]<[.<]<<<<<.>>>>]

コメント付き

++++++++++
[->+>+++<<] Insert 0 into the first buffer (Which we don't care about) 10 into the second and 30 into the thrd
>>++    Raise the third buffer to 32 making us our space
>   This buffer is reserved for the Insertable spaces counter
>
+>>>    Raise our incrementer This will be used to fill the other half of the string with spaces
,[  Read a byte
    [<]<<   Move to the back of the string buffer which is our incrementer
    +       increment it
    >>>[>]      And move to the next space of the string
    ,       And then read a new byte
]
<[<]<<-     Decrement the incrementer and begin to add spaces
[
    -       Decrement the incrementer
    >+      Raise the incrementer in the padding
    >>[>]   Move to a new part of the string buffer
    >++++[-<++++++++>]< Write a space
    [<]<<   Move all the way back to the string counter
]
BEGIN WRITING!!
>
[->++<]>[-<+>]<Double the incrementer
[
    <[  Move to the space counter
        -<+<.>> Decrement the space counter increment the temporary one to the left of it then print the space we stored to the left of that then return
    ]<[->+<]>+> Move the temporary space counter back
    -   Decrement the incrementer
    >>[.>]  Print every character from left to right
    <[-]    Snip the end off this
    <[.<]   Print every character from right to left
    <   Move back ot the incrementer
    <<<<.>>>> Print a newline aswell
]

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


23

> <>、221バイト

私はこれにあまりにも多くの時間を費やしました。誕生日おめでとう、V!

l:2*01           p84*/v
 !@:$-1         /!?:$<
  1.v/ ^       v\~~>a
   vv\}o<     >ao  /
    1\/84/   :}o:$-
     \\!?<: l;!?\v
      p10-1:g10r\
       >  :>?\vv
        v:$-1/~
         </r+*
          </~
           l

オンライン試すことができますが、このインタープリターを取得して--playフラグを使用して実行する方がはるかに楽しいです

python3 fish.py v.fish -s "ppcg" --tick 0.05 --play

以下のアニメーションになります。

魚の実行例

(2分弱かかります)

説明

この答えの興味深い部分は、それをV形に包むことであるため、これに適合する説明を以下に示します。参考のために、次の行番号バージョンを使用します。

1. l:2*01           p84*/v
2.  !@:$-1         /!?:$<
3.   1.v/ ^       v\~~>a
4.    vv\}o<     >ao  /
5.     1\/84/   :}o:$-
6.      \\!?<: l;!?\v
7.       p10-1:g10r\
8.        >  :>?\vv
9.         v:$-1/~
10.         </r+*
11.          </~
12.           l

スニペットに到達する方向を示すために、矢印(→↓←)が使用される場合があります。

  1. 初期化

       1.→l:2*01           p84*/v
       2.  !@:$-1   X     /!?:$<
       3.   1.            \~~>a
    

    最初の行は、2nを[0,1]にプッシュし、nをスタックに残して、スペースを1つ追加します。次に、上に移動し、右側の2行目に戻り、そこから左に移動します。n + 1個のスペースを追加するためのループがあります。これは次のように機能します。

                    Initial:                 "ppcg4 "
    !@:$-1 /!?:$<
               $     Swap.                   "ppcg 4"
              :      Duplicate.              "ppcg 44"
             ?       If more spaces to add:
        -1            Subtract 1.            "ppcg 3"
       $              Swap.                  "ppcg3 "
      :               Duplicate.             "ppcg3  "
     @                Rotate top 3.          "ppcg 3 "
    !                 Jump over stored value
                             and wrap around.
                    Else:
            /         Go to next part.
    

    これが完了すると、行3に戻ります。そこで、上の2つのスタック要素(0とスペース)が削除され(~~)、X位置[10,1](a1.)にジャンプし、右方向に進みます。で、/7行目に戻り、メインプログラムループを開始します。

  2. メインループ2n回行う)

     6.              ;!?\
     7.       p10-1:g10r\   ←
    

    これがループ状態です。最初に、スタックは印刷用に反転されます。次に、[1,0](01g)からカウンターを取得し、デクリメントされたバージョンを保存します(:1-01p)。ラップアラウンドし、右にぶつかることで、プログラムを終了するための条件に遭遇します。終了しない場合は、最初の印刷ループにジャンプします。

    • 最初の印刷ループ(左半分)

      5.    1\   /   :}o:$-
      6.     \\!?<: l         ←
      

      スタックの一番上の長さから始めて、一番上の要素が0でない限り、次のコードを実行します。

      1-$:o}
      
      1-        Subtract 1.    "ppcg3"
        $       Swap.          "ppc3g"
         :      Duplicate.     "ppc3gg"
          o     Output.        "ppc3g"
           }    Rotate right.  "gppc3"
      

      これにより、スタックは破棄されずに印刷されます。ループが終了すると、5行目で右にジャンプして、次の印刷ループの準備をします。

    • 右半分の準備

      5.  →    /84/   
      6.       \     
      7.            :    
      8.            >
      9.         v:$-1/~
      10.         </r+*
      11.          </~
      12.           l
      

      これは最も適合する部品の1つでした。以下は、何が起こるかを示すためにすべての方向の折り返しを取り除いたバージョンです。

                   Initial stack:   "    gcpp0"
      84*+r~
      84*          Push 32 == " ".  "    gcpp0 "
         +         Add 32 and 0.    "    gcpp "
          r        Reverse.         " gcpp    "
           ~       Remove top.      " gcpp   "
      

      次に、印刷対象の長さをプッシュし、2番目の印刷ループを開始します(ループの一部ではない最初の複製を使用)。

    • 2番目の印刷ループ(右半分)

      3.     / ^ 
      4.     \}o<
      5.    
      6.           ↓   
      7.           
      8.       >  :>?\vv
      9.        v:$-1/~ 
      

      実行されているコードは、最初の印刷ループとまったく同じo}ですが、使用可能な場所があったため、もう少し配置されています。終了後、メインループの不変条件を再度検証する前に、いくつかの作業が残っています。~9行目が実行された後、垂直方向に折り返して、次のコードで終わります。

                      ↓
      2.          X     / 
      3.  1.v/             >a
      4.              >ao  /
      

      最初aoに改行を印刷します。次に、バウンスして、初期化後とまったく同じ場所に到着します。つまり、にジャンプしますX


あなたはおそらくゴルフバージョンをメインバージョンにする必要があります
破壊可能なレモン

1
@DestructibleWatermelonの投稿はVバージョンに関するものですが、使用可能なバイト数が限られているため、すべてを特定の形状に成形することははるかに困難でした。したがって、説明は単純なバージョンではなく、Vバージョンについて続きます。後で実際にゴルフしたものを作るかもしれません。
PidgeyUsedGust

これは金だけ金です
クリストファー

この答えは、名前がローテーションされた「V」だけで構成される言語であることに感謝します。
セリーム

19

Brain-Flak、486 + 1 = 489バイト

Brain-FlakのハッピーバースデーV!

また、この回答で使用されたコードの一部を提供してくれた0に感謝します

-cASCIIの入出力に必要なフラグのために+1

((([]<{({}<>)<>}<>([]){({}[()]<(([][()])<{({}[()]<({}<>)<>>)}{}><>)<>({}<<>{({}[()]<({}<>)<>>)}{}><>)(({})<>)<>>)}{}([][][()]){({}[()]<((((()()()()){}){}){})>)}{}<>{({}<>)<>}<>>){}[()])<{((({})<((({}){}())){({}[()]<(({}<(({})<>)<>>)<(({}<({}<>)<>>[()])<<>({}<<>{({}[()]<({}<>)<>>)}{}>)<>>){({}[()]<({}<>)<>>)}{}<>>)>)}{}{}((()()()()()){})(<()>)<>>)<{({}[()]<({}<>)<>>)}{}{}{}{({}<>)<>}<>>[()])}{}>()())([][()]){{}(({}[()])<{({}[()]<((((()()()()){}){}){})>)}{}{({}<>)<>}{}>)([][()])}{}<>

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

これは間違いなく、Brain-Flakでこれまで行った中で最も難しいことです。

Brain-Flakは弦の複製と反転で悪名が高く、この課題は弦の複製と反転以外の何ものでもありません。

私はこの作業スニペットを1時間弱のハードワークで管理することができましたが、最後のいくつかのスペースを追加することは、Brain-Flakでこれまでにやった最も難しいことの1つであることがわかりました。

説明

基本的なアイデアは、最初にVの上部を作成し、各反復で中央から2文字を削除し、先頭にスペースを追加することです。

実際には、これは非常に困難になります。

コピーおよびリバース用の既存のアルゴリズムが存在するため、それらのいずれかを使用して、オフスタック上のコードのリバースコピーを作成しました。それが終わったら2n-1、元のスタックの上にスペースを置き、オフスタックをオンスタックに戻し、サンドイッチを作成します。

テスト1

これで一番上の行ができました。ここで、先頭から2文字を削除し、先頭にスペースを追加します。これが最も難しい部分であることが判明しました。これは、現在のスニペットの深さと、削除が発生するVの中心までの深さの2つの値を本質的に保存する必要があるためです。

これは難しいです。

両方のスタックで行われているすべての複製と反転のため、常にフルに使用されています。これらのスタックには何も置く場所がありません。世界のすべてのサードスタックマジックを使用しても、この問題を解決するために必要な種類のアクセスを取得することはできません。

では、どうすれば修正できますか?つまり、実際にはそうではありません。現時点ではスペースを無視し、後でパッチを適用します。スペースの移動先をマークするためにコードにゼロを追加しますが、それ以外は実際には何もしません。

したがって、各反復で、最後の反復のコピーを作成し、それをオフスタックに配置します。格納した深さを使用してこれを半分に分割し、Vの左半分を右スタックに、Vの右半分を左スタックに配置します。2つの要素を削除し、2つをパッチで戻します。適切な測定のために改行を追加し、次の反復を開始します。Vの中心までの深さが1減少するたびに、ゼロに達するとループを停止します。

これで、Vの大部分が作成されました。ただし、適切なスペースが不足しているため、現在のVは少し(完全に)逆さまになっています。

テスト2

ひっくり返します。他のスタックにフリップするには、各要素を1つずつ移動する必要があります。要素を移動しているときに、ゼロをチェックします。遭遇した場合は、スペースを元の場所に戻す必要があります。ゼロをチャックして、たくさんのスペースを追加します。いくつ知っていますか?追跡します。スタックの反転や反転とは異なり、スタックを反転することは非常に非集中的なタスクであるため、追加するスペースの数を追跡するために追加のカウンターを格納およびアクセスするためのメモリが実際にあります。スペースを追加するたびに、カウンターを1つ減らします。カウンターは最後の改行(Vの一番上)でゼロになるはずなので、印刷する準備ができています。

最後に、ぶらぶらするいくつかのものをクリーンアップし、暗黙的な出力のためにプログラムを終了します。

テスト3


なんとかそれを機能させることができたのは非常に印象的です!逆にして-rフラグを追加することでバイトを節約できると思いますか?
DJMcMayhem

@DJMcMayhem私はそうは思わない。反転プロセスとスペースの挿入は同時に行われるため、-rフラグを追加した場合、実際に別の時間に反転する必要があります。私は今のところ遅れていますが、明日はこれを大幅にダウンさせようと努力しています。スペースの問題を修正できる場合は、必ず-rフラグを使用します。
小麦ウィザード

16

ゼリー15 12バイト

⁶ṁ⁸;;\Uz⁶ŒBY

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

使い方

⁶ṁ⁸;;\Uz⁶ŒBY  Main link. Argument: s (string)

⁶ṁ            Mold ' ' like s, creating a string of len(s) spaces.
  ⁸;          Prepend s to the spaces.
    ;\        Cumulative concatenation, generating all prefixes.
      U       Upend; reverse each prefix.
       z⁶     Zip/transpose, filling empty spots with spaces.
         ŒB   Bounce; map each string t to t[:-1]+t[::-1].
           Y  Join, separating by linefeeds.

12文字ですが、わずか12バイトとして出力されるエンコーディングはありますか?
カスペルド

1
はい、Jellyは独自のカスタムコードページを使用します
デニス


16

JavaScriptの(ES6)、108の 106 98 94バイト

f=
s=>s.repeat((j=l=s.length*4)*2).replace(/./g,_=>--j?s[j+j<l?j-i:l-i-j]||` `:(j=l,++i,`
`),i=1)
<input oninput=o.textContent=f(this.value)><pre id=o>


これを説明する投稿をすることができますか?置換と正規表現に少し混乱しています。
ジェイコブペルシ

@JacobPersi彼らは赤いニシンです。私が必要とするすべてのサイズの出力領域であるn*2ことにより、n*4(各行の最後に改行を含みます)。次に、各セルに表示される文字を計算します。
ニール

いいね!f=との間の改行を削除することで、バイトを削ることができますs=>
おいしいパスタ

@yummypasta f=はスニペットの一部であり、答えではありません。そのため、バイトカウントには含まれません。
ニール

11

網膜51 47バイト

仲間の文字列処理言語からの誕生日おめでとう!

バイトカウントはISO 8859-1エンコードを前提としています。

$
$.`$* 
$
¶$`
O$^r`.\G

;{*`.¶

(\S.*).¶.
 $1¶

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

説明

$
$.`$* 

これは、文字列の末尾に一致し、で文字列の長さを取得し、で文字列の長さを何回も繰り返すことにより、nスペース(n文字列の長さ)を追加します。$.`$*

$
¶$`

文字列の最後を再度照合し、文字列自体をで挿入して、文字列全体を(改行で区切って)複製し$`ます。

O$^r`.\G

これは、右から左にr一致する()、次に一度に1文字を一致さ.せる()が、それらがすべて隣接していることを確認する(\G)ことにより、2行目を逆にします。この方法では、マッチは改行を越えることができません。これは、ソート段階で使用されます。並べ替えモード($)を使用し、各一致を空の文字列で置き換えると、実際の並べ替えは行われません。ただし、^オプションにより、最後に一致が反転し、2行目全体が反転します。

;{*`.¶

このステージは出力用であり、プログラムの残りの部分にも影響します。{残りのステージをループでラップします。ループは、それらのステージがストリングの変更に失敗するまで繰り返されます(これは、最後のステージがこれ以上一致しないために発生します)。;プログラムの最後に無効に出力。*ターンステージが処理され、結果が印刷されるが、その後、前の文字列が復元されることを意味するドライランにこの段階。

ステージ自体は、単に改行と先行文字を削除します。これにより、目的の出力の1行(最初の行から開始)が得られます。

(\S.*).¶.
 $1¶

最後に、この段階では各行が次の行に変わります。これは、最初の非スペース文字の前にスペースを挿入し、最初の行の最後の文字と2行目の最初の文字を削除することによって行われます。このプロセスは、出力の最終行に対応する最初の行にスペース以外の文字が1つだけ残った時点で停止します。


これがどのように機能するかの説明が必要です。sedの構文はコンパクトではありませんが、私のドラフトは2倍長くなります。文字列を逆にして最初の出力行をまとめるのがほとんどです。
seshoumara

@seshoumara確かに、そこに行きます。
マーティンエンダー

ありがとう。倍長のsedスクリプトは悪くないことを知っています:))余分なs///文字が追加されたり、文字列の反転が長くなったり、その他の操作がRetinaの長所を欠いているためです。よく読んでください。+1
seshoumara

9

05AB1E、12バイト

Dgð×J.p€ûR.c

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

説明

D             # duplicate input
 g            # length of copy
  ð×J         # append that many spaces to input
     .p       # get a list of all prefixes
       €û     # turn each into a palindrome
         R    # reverse the list
          .c  # pad each line until centered

または、反対方向からの同じバイトカウントの場合。

Âsgú.sí€ûR.c

説明

             # push a reversed copy of input
 s            # swap the input to the top of the stack
  g           # get its length
   ú          # prepend that many spaces
    .s        # get a list of all suffixes
      í       # reverse each
       €û     # turn each into a palindrome
         R    # reverse the list
          .c  # pad each line until centered

2
コメントを段階的にインデントすると、ソースもVのように見えます:)
aross

9

Japt、22 20 16 14 + 2バイト

Japtは、Vがゴルフの成功をさらに願っています!

²¬£²îU²ç iYU)ê

-Rフラグが必要です。オンラインでテストしてください!

説明

これは、数日前に追加したçおよびî関数を使用します。

²¬£²îU²ç iYU)ê    Implicit: U = input string
²                 Double the input string.
 ¬                Split into chars.
  £               Map each char X and index Y by this function:
     U²             Take the input doubled.
       ç            Fill this with spaces.
         iYU        Insert the input at index Y.
    î       )       Mask: repeat that string until it reaches the length of
   ²                the input doubled.
                    This grabs the first U.length * 2 chars of the string.
             ê      Bounce the result ("abc" -> "abcba").
                  Implicit: output result of last expression, joined by newlines (-R flag)

デニスのテクニックは1バイト長くなります。

U+Uç)å+ mw y mê

5

GNU sedは110 100 + 1(Rフラグ)= 101バイト

編集:ライリーのおかげで9バイト短縮

別の文字列操作言語として、sedはVが最高であることを願っています!

h;G
:;s:\n.: \n:;t
h;:r;s:(.)(\n.*):\2\1:;tr
H;x
s:\n\n ::
:V
h;s:\n::p;g
s:^: :;s:.\n.:\n:
/\n$/!tV

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

説明:入力が最後のテストケース(「V!」)であると仮定します。わかりやすくするために、各ステップでパターンスペースを表示し、スペースを「S」に置き換えます。

h;G                       # duplicate input to 2nd line: V!\nV!
:;s:\n.: \n:;t            # shift each char from 2nd line to 1st, as space: V!SS\n
h;:r;s:(.)(\n.*):\2\1:;tr # save pattern space, then loop to reverse it: \nSS!V
H;x                       # append reversed pattern to the one saved V!SS\n\n\nSS!V
s:\n\n ::                 # convert to format, use \n as side delimiter: V!SS\nS!V
:V                        # start loop 'V', that generates the remaining output
h;s:\n::p;g               # temporarily remove the side delimiter and print pattern
s:^: :;s:.\n.:\n:         # prepend space, delete char around both sides: SV!S\n!V
/\n$/!tV                  # repeat, till no char is left on the right side
                          # implicit printing of pattern left (last output line)

@Riley Answerが更新されました、ありがとう!
seshoumara


4

Jolf、31バイト

ジョルフはしぶしぶVにお誕生日おめでとう!

RΜwzΒώlid+γ_pq_ l+*␅Hi0ΒΒ␅ L_γ1S

ここで試してみてください! 0x05である必要があります。

説明

RΜzΒώlid+γ_pq_ l+*␅Hi0ΒΒ␅ L_γ1S  i = input
     li                                  i.length
    ώ                                2 * 
   Β                             Β =
  z                              range(1, Β + 1)
 Μ     d                         map with: (S = index, from 0)
                +                 add:
                 *␅H               S spaces
                    i              and the input
               l                  slice (^) from
                     0Β            0 to Β
           pq_         Β␅         pad (^) with spaces to the right
         γ_                       γ = reverse (^)
        +                 L_γ1    γ + behead(γ)
R                             S  join with newlines

4

、29バイト

あなたの仲間からの残念なことに長い挑戦のASCIIアート言語からの誕生日おめでとうV!

SσF…·¹Lσ«Fι§σκMι←↖»Fσ«Pσ↖»‖O→

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

説明

私たちの戦略:Vの左半分を、下から左上に向かって印刷します。それを反映します。

Sσ                                    Input σ as string
                                       The bottom len(σ) half-rows:
   F…·¹Lσ«           »               For ι in inclusive range from 1 to length(σ):
            Fι                          For κ in range(ι):
               §σκ                         Print character of σ at index κ
                  Mι←                   Move cursor ι spaces leftward
                      ↖                  Move cursor one space up and left
                                       The top len(σ) half-rows:
                        Fσ«    »      For each character ι in σ:
                            Pσ          Print σ without moving the cursor
                               ↖         Move cursor one space up and left
                                 ‖O→  Reflect the whole thing rightward, with overlap

(もしチャコールだけが文字列スライスを持っているなら...悲しいかな、まだ実装されていないようです。)


Charcoalには文字列スライシングはありませんでしたが、文字列CycleChopの先頭を抽出するために使用できるので、4バイト節約できます。ただし、9バイトを節約するより良い方法があります。私も当時は働いていたと思ういくつかの節約:Reflectデフォルトは正しい反映になり、さらにバイトを節約し、変数の1つは最初の入力に事前定義され、2バイトを節約します。
ニール

4

ピップ32 25バイト

a.:sX#aL#a{OaDQaPRVaaPUs}

入力文字列をコマンドライン引数として受け取ります。オンラインでお試しください!

説明

                           a is 1st cmdline arg, s is space (implicit)
     #a                    Len(a)
   sX                      Space, string-multiplied by the above
a.:                        Concatenate that to the end of a
       L#a{             }  Loop len(a) times (but NB, a is now twice as long as it was):
           Oa                Output a (no trailing newline)
             DQa             Dequeue one character from the end of a
                PRVa         Print reverse(a) (with trailing newline)
                    aPUs     Push one space to the front of a

4

R、stringiパッケージ、225バイト

library(stringi)
f=function(){
s=scan(,'',1,sep="\n")
m=2*nchar(s)
l=stri_pad(sapply(1:m-1,function(x)substr(paste(paste(rep(" ",x),collapse=""),s),1,m)),m,"right")
r=substr(stri_reverse(l),2,m)
message(paste0(l,r,"\n"))}
f()

対話型コードでRを実行する場合、私の答えを貼り付けた後、何かを入力するだけです。stringi Rパッケージをインストールする必要があります(ルールに反しないことを望みます)。

説明:

基本的な考え方は、左側にスペースを追加し、それを適切な長さにカットすることです。その後、反転したバージョンを右側として貼り付けます。以下は、人間が読めるより長いバージョンの関数です。

library(stringi)
make_V <- function(){                  # declaring the function
  string <- scan(, '', n=1, sep="\n")  # reading input
  max_length <- 2*nchar(string)        # number of chars in each half row

  # creating the left side of the V

  left <- stri_pad(                    
            sapply(1:max_length-1,     # for each row
                   function(x){     
                    substr(            
                      paste0(
                        paste0(rep(" ", x),
                               collapse=""), string), # add spaces to left side
                           1,
                           max_length) # cut the unneeded end
                    }),
            width=max_length,
            side="right")              # add spaces to the right side

  # creating the right side of the V

  right <- substr(stri_reverse(left), 2, max_length)

  # print it without any symbols before the strings 
  message(paste0(left, right, "\n"))
}

# run the function
make_V()

サイトへようこそ!:)
DJMcMayhem

4

ルビー、92 89 85バイト

s=gets.chomp
s<<" "*n=s.size*2
n.times{s=s[0..(n-1)]
puts s+s.reverse[1..-1]
s=" "+s}

私のプロセスは、最初の半分を反転させた後、各行の右半分から最初の文字を削除することでした。このような:

Hello     |    olleH
 Hello    |   olleH 
  Hello   |  olleH  
   Hello  | olleH   
    Hello |olleH    
     Hello|lleH     
      Hell|leH      
       Hel|eH       
        He|H        
         H|         

私はゴルフをするのに慣れていないので、短くするためにできることがあるかどうか教えてください。


サイトへようこそ、これはいい答えです!残念なことに、私は本当にルビーについて多くを知らないので、ヒントを提供することはできません。ただし、このページで何かを見つけることができるかもしれません。
DJMcMayhem

ありがとう!そのページには興味深いことがたくさんありますが、私はすでに多くのことをやっているようです。しかし、副作用と操作の順序を介していくつかのバイトを節約できることに気付きました。
user3334690

1
[Ruby]は単なるRubyであり、多かれ少なかれよく知られたプログラム言語であると思いますか?
Rɪᴋᴇʀ

これをlambdaにすることで 8バイト節約できます。
ヨルダン

4

バッチ、186185バイト

@set e=@set 
%e%/ps=
%e%t=%s%
%e%r=
:l
%e%s=%s% 
%e%r= %r%%t:~-1%
%e%t=%t:~,-1%
@if not "%t%"=="" goto l
:g
%e%r=%r:~1%
@echo %s%%r%
%e%s= %s:~,-1%
@if not "%r%"=="" goto g

行1と6には末尾スペースがあります。編集:@ ConorO'Brienのおかげで1バイトを保存しました。


1
byteを保存する複雑な方法を次に示します。(エイリアスを作成し@set て削除し@echo off@必要に応じて挿入します。
Conor O'Brien

@ ConorO'Brienありがたいことに、8 set秒で十分なバイト数が節約できて、それを価値あるものにできるとは思いもしませんでした。
ニール

3

Haskell、76バイト

vString引数を取り、String結果を与えるメイン関数です。

v i=unlines.r$i++(' '<$i)
r""=[]
r s|t<-init s=(s++reverse t):map(' ':)(r t)

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

ノート:

  • i は初期引数/入力です。
  • s最初ilength iスペースが追加されます。
  • v iを呼び出しr s、結果の行を結合します。
  • rString行のリストを返します。
  • tあるs切り落とさ最後の文字で。
  • 再帰r tは、最初の行を除く各行の初期スペースを除いた行を生成します。

2
メイン関数に名前を付けるための+1 v。:D
DJMcMayhem

1
@DJMcMayhem:メイン関数に名前を付けないことは1バイト長くなります:unlines.r.((++)<*>(' '<$))
-nimi

1
@nimi彼は私が選んだ名前が好きだった思います。技術的にはラムダタイ...答えを書いたとき、いくつかの関数にトップレベルの宣言を使用できるとは知りませんでしたが、メイン関数には名前を付けませんでした。私は他の誰かがそれをしているのを見ましたが、やや気がかりです。最近では、少なくともGHCiで動作します。
Ørjanヨハンセン

3

ゼリー、13 バイト

⁶ṁ;@µḣJUz⁶ŒBY

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

どうやって?

⁶ṁ;@µḣJUz⁶ŒBY - Main link: string s
⁶             - space character
 ṁ            - mould like s: len(s) spaces
  ;@          - concatenate s with that
    µ         - monadic chain separation (call that t)
      J       - range(length(t))
     ḣ        - head (vectorises): list of prefixes from length to all
       U      - upend: reverse each of them
        z     - transpose with filler:
         ⁶    -     space: now a list of the left parts plus centre
          ŒB  - bounce each: reflect each one with only one copy of the rightmost character
            Y - join with line feeds
              - implicit print

同様に心は素晴らしいと思います。:P
デニス

ああ、私は累積的な連結については考えませんでした!木炭は、おそらくいくつかの調査その付近、V方向を持っている...
ジョナサン・アラン

3

ルビー、85 83バイト

編集:余分な空白を削除しました

s=ARGV[0];s+=' '*s.length;s.length.times{|i|puts s+s[i..-2].reverse;s=' '+s[0..-2]}

実際、これをルビーでゴルフするのはかなり難しいと感じました。空白を追加すると、かなり読みやすいコードスニペットに展開されます。

s = ARGV[0]
s+=' ' * s.length

s.length.times do |i|
  puts s + s[i..-2].reverse
  s = ' ' + s[0..-2]
end

1
私のようにs.lengthを変数に設定することで、おそらく少し節約できますか?また、長さではなくサイズを検討する必要があると思いますか?
user3334690

@ user3334690が提案したことを実行して、.timesステートメントを移動、79バイト:s=ARGV[0];(s+=' '*s.size).size.times{|i|puts s+s[i..-2].reverse;s=' '+s[0..-2]}
コナーオブライエン

これをlambdaにすると、 5バイト節約できます。
ヨルダン

3

MATLAB(R2016b)、223 183バイト

r=input('');l=nnz(r)*2;for i=1:l;m=l+1-2*i;c={' '};s=cell(1,i-1);s(:)=c;x=cell(1,m);x(:)=c;e=r;y=flip(r);if(m<1);e=r(1:2*end-i+1);y=r(l/2+end-i:-1:1);end;disp(cell2mat([s e x y]));end

初めてのコードゴルフ。ヒントは大歓迎です!

プログラム出力:

MATLABコードゴルフ

編集:

Luis Mendoのおかげで40バイト節約されました。


2
PPCGへようこそ。最初の回答はいいですね。私はあなたにゴルフこれを助けることができていないよので、残念ながら、私はMATLABについて何も知らない、おそらくあなたは、いくつかのでしょうヒント便利:-)
ETHproductions

1
引用符を含む文字列の入力は、デフォルトで許可されています。's'から削除できますinput。また、使用している理由を私は見ていないevalc(disp(...))が、私はあなただけを使用することができると思うcell2mat この方法を
ルイス・Mendo

1
また、flipより短いend:-1:1こちらを
ルイスメンドー

3

PHP、95 92 85 80 78 77バイト

注:IBM-850エンコードを使用

for($s.=strtr($s^$s=$argn,~ ,~▀);~$s[$i++];)echo$s,strrev($s=" $s"^$s^$s),~§;
          # Note that this ^ char is decimal 255 (negating it yields "\0")

次のように実行します:

echo "Hello" | php -nR 'for($s.=strtr($s^$s=$argn,"\0",~▀);~$s[$i++];)echo$s,strrev($s=" $s"^$s^$s),~§;'
> Hello         olleH 
>  Hello       olleH  
>   Hello     olleH   
>    Hello   olleH    
>     Hello olleH     
>      HellolleH      
>       HellleH       
>        HeleH        
>         HeH         
>          H          

説明

for(
  $s.=strtr(             # Set string to the input, padded with spaces.
    $s^$s=$argn,         # Input negated with itself, leads to string with
                         # only null bytes with the same length.
    ~ ,                  # Replace null bytes...
    ~▀                   # ... with spaces.
  );
  ~$s[$i++];             # Iterate over the string by chars, works because 
                         # there are just as many lines as the padded
                         # string has chars.
)
  echo                   # Output!
    $s,                  # The string.
    strrev(              # The reverse of the string.
      $s=" $s"^$s^$s     # After each iteration, prefix string with a
    ),                   # space, and trim the last character.
    ~§;                  # Newline.

微調整

  • 埋め込み文字を削除することで3バイトを節約しました(str_padデフォルトはスペースです。これが必要です)
  • 文字列のバイナリ演算を使用して、文字列を切り捨てる代わりに切り捨てて7バイトを保存しました substr
  • リバースを印刷するときに文字列を回転させることで5バイトを節約しました。バックスペースを印刷する必要はありませんが、各行の末尾にスペースができます。
  • より複雑で短い方法を使用して、文字列をパディングすることで2バイトを節約しました。
  • ~"0"すべての入力が印刷可能なascii(Thx @Titus)であると想定される可能性があるため、ケース(ASCII 207)を考慮する必要がないという事実のために1バイトを保存しました。

echo$s,strrev($s=" $s"^$s^$s),~§;5バイト節約します。
タイタス

@タイタス、thx。通常、私は、末尾の空白を避けるが、OPは、それは許容だと述べた
aross

~$s[$i++](入力が印刷可能なASCII文字であり、そしてそうであるのに十分である$s
タイタス

@タイタス、thx、良いキャッチ。私は安全な側でコーディングする傾向があります
アロス

2

JavaScript(ES6)、169 157バイト

(Conor O'Brienのおかげで-10バイト)

V=(j,i=0,p="")=>i<(f=j.length)*2?V(j,-~i,p+" ".repeat(i)+j.slice(0,f-i*(i>f))+" ".repeat(i<f?(f-i)*2-1:0)+[...j.slice(0,f+~i*(i>=f))].reverse().join``+`
`):p

再帰的なソリューション。私はJavaScriptを初めて使用するので、優しくしてください!ゴルフのヒントは大歓迎です。:)

そして、もちろん、あなたにとても幸せな誕生日をV

テストスニペット


1
これはかなり良いです!通常、s.split("")に変更することができ[...s]、およびa.join("")になることができますa.joinバッククォートのペアが続きます。をで置き換え[r='repeat'][r]プレーンol 'リピートで追加の3バイトを節約できますslice
コナーオブライエン

@ ConorO'Brienヒントをありがとう!彼らは大歓迎です。:)
R.カップ

2

CJam、26バイト

あなたの古い仲間のCJamからの誕生日おめでとう!

q_,2*:L,\f{LS*+m>L<_W%(;N}

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

説明

q                           Push the input
 _,2*:L                     Push 2 times the length of the input, store it in L
       ,                    Take the range from 0 to L-1
        \                   Swap top stack elements
         f{                 Map over the range, using the input as an extra parameter
           LS*+               Append L spaces to the input
               m>             Rotate the resulting string right i positions (where i is the
                               current number being mapped)
                 L<           Take the first L characters of the string
                   _W%        Duplicate it and reverse it
                      (;      Remove the first character from the copy
                        N     Add a newline
                         }  (end of block)
                            (implicit output)

2

PowerShell、126バイト 124バイト

$l=($s="$args")|% Le*;$r=-join$s[-1..-$l];0..($l*2-1)|%{' '*$_+($s+' '*$l).substring(0,$l*2-$_)+(' '*$l+$r).substring($_+1)}

などの単一のパラメータで呼び出します.\V.ps1 Hello

編集:AdmBorkBorkからtipで保存された2バイト


1
A オンラインでお試しください!興味のある方のためにリンクしてください。
デニス

ああ、その小さなツールについては知りませんでした、ありがとう!
トア

こんにちは!正面にいくつかの小さなゴルフ。入力を文字列として受け取り、カプセル化を使用して変数を渡します。2バイト節約します。$l=($s="$args")|% Le*;
AdmBorkBork

うわー、これらの2つのゴルフについて知らなかった、ありがとう!
Torの


2

JavaScript(ES6)、94バイト

f=(s,y=0,x=0,l=s.length*2-1)=>(s[(x>l?l*2-x:x)-y]||' ')+(x<l*2?f(s,y,x+1):y<l?`
`+f(s,y+1):'')

テストケース


2

J、44バイト

(([(,}.@|.)@{."1-@i.@[|."0 1(,#&' ')~)~+:@#)

1
うーん、これをオンラインで実行する方法がわかりません。オンラインでお試しください!私はそれを間違って呼んでいますか?(私はJ初心者です)
DJMcMayhem

@DJMcMayhemこれは関数であり、プログラムではありません。tio.run/nexus/...
デニス・

ゴルフ:|."0 1|."{(保存された2バイト)
コナー・オブライエン

また、外側の括弧は必要ありません。
コナーオブライエン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.