二乗言葉を作る


38

チャレンジ

あなたの仕事は、与えられた文字列入力を取り、二乗形式で入力を出力するプログラムを作成することです。空の文字列は空の文字列を返す必要があります。

入力が与えられた場合:

golf

プログラムは以下を出力するはずです。

golf
o  l
l  o
flog

入力:

123

出力:

123
2 2
321

入力:

a

出力:

a

入力:

Hello, world!

出力(との間のスペースに注意してください-w-ギャップは単なる改行ではありません):

Hello, world!
e           d
l           l
l           r
o           o
,           w

w           ,
o           o
r           l
l           l
d           e
!dlrow ,olleH

得点

これはであるため、各言語の最短の回答が優先されます。


@DJMcMayhemはい、追加するのを忘れていた謝罪。
SpookyGengar

2
心配する必要はありません。ダブルチェックするだけです。ナイスファーストチャレンジBTW!サイトへようこそ:)
DJMcMayhem

@SpookyGengar 1文字の入力用のテストケースを追加しますか?
musicman523

@ musicman523まだ持っていませんか?文字 'a'のみを含む3番目の例。
SpookyGengar

1
私の悪い@SpookyGengar、私は明らかに盲目だ
musicman523

回答:


17

7 5バイト

θ‖O↙↘

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:@CarlosAlejoのおかげで2バイトを保存しました。説明:

θ       Print the input string, making the top row
 ‖O     Reflect with overlap...
   ↙    ... down and left, to create the left side
    ↘   ... down and right, to create the bottom and right sides

(Reflectコマンドへの複数の方向は、同時ではなく連続的に実行されます。)


うわー、イエス、私はまだチャコールが最もクールなエソランのアイデアだと思います。
魔法のタコUr

1
入力文字列を印刷して、それを左下および右下に反映するだけであれば、2バイト節約できますθ‖B↙↘オンラインでお試しください!
チャーリー

考えてみると、文字の反転を避けるためにReflectOverlap代わりに使用すべきだったかもしれませんReflectButterfly。:-)
チャーリー

1
これは、難解な言語でのゴルフの解答が、一般的な汎用言語の完全な未使用版よりも読みやすく、理解しやすいまれなケースの1つです。
カレブ

ここでの答えは4バイトも有効です。
オリバー

10

MATL20 16 11バイト

otYTO6Lt&(c

MATLオンライン試しください

編集:このコードは、チャレンジの前のリリース20.2.1で機能します。リンクはそのリリースを使用します。(20.2.2では、コードは短くなりますが、チャレンジは後付けになります)。

説明

o     % Implicitly input a string. Convert chars to ASCII codes
t     % Duplicate
YT    % 2-input Toeplitz matrix
O     % Push 0
6L    % Push predefined literal [2, -1+1j]. When used as an index, this is
      % interpreted as 2:end-1 (indexing is 1-based)
t     % Duplicate
&(    % 4-input assignment indexing. This writes 0 at the square formed by
      % rows 2:end-1 and columns 2:end-1 
c     % Convert to char. Char 0 is shown as space. Implicitly display

非常に印象的!:)すべての出力の下部にある空白行を削除することは可能ですか、それとも機能に必要ですか?
SpookyGengar

2
@SpookyGengar単一の末尾改行を許可することは非常に一般的な要求です。
ジョナサンアラン

@SpookyGengarありがとう!MATLは常に末尾の改行を表示します。ジョナサンが言うように、それは通常許可されています
ルイスメンドー

1
@LuisMendoあなたは毎日新しいことを学びます。:)提出してくれてありがとう-これまでのところ間違いなく最高です!
SpookyGengar

6

ゼリー 29 22  17 バイト

木炭 このスコア切り捨て+します...

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY

文字のリストを取得して返すモナドリンク。または結果を印刷する完全なプログラム。

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

どうやって?

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY - Link: list of characters, w     e.g. "whole"
 ⁶                - literal space character              ' '
J                 - range(length(w))                     [1,2,3,4,5]
  ẋ               - repeat                               [" ","  ","   ","    ","     "]
         Ṛ        - reverse w                            "elohw"
        "         - zip with:
       ¦          -   sparse application of:
   a              -     and (vectorises)
    0,1           -     to indexes: [0,1] (last and 1st) ["e","ll","o o","h  h","w   w"]
            $     - last two links as a monad:
          Ṛ       -   reverse                            ["w   w","h  h","o o","ll","e"]
           ;      -   concatenate                        ["w   w","h  h","o o","ll","e","e","ll","o o","h  h","w   w"]
             Ṗ    - pop (remove last entry)              ["w   w","h  h","o o","ll","e","e","ll","o o","h  h"]
              ŒḌ  - reconstruct matrix from diagonals    ["whole","h   l","o   o","l   h","elohw"]
                Y - join with newlines                   "whole\nh   l\no   o\nl   h\nelohw"
                  - if running as a full program implicit print

とてもかっこいい!これまでのところ最短の解決策ですが、単一文字入力、および数字で構成される文字列(「123」)では機能しません。
SpookyGengar

ああ、私ははい、単一文字のエッジケースを処理する必要があります。それは数字文字列で動作し、プログラム入力は実際に引用符で囲む必要があります'Hello'。たとえば、「Spooky's」"123"などです(入力の解釈にはPythonが使用されます)。
ジョナサンアラン

@SpookyGengar-1文字の場合の問題を修正しました。
ジョナサンアラン

素敵な長さ短縮!
ルイスメンドー

2
あなたは炭について正しいです。
ニール

3

C、109バイト

i,j;f(char*s){for(i=j=printf("%s\n",s)-2;1[++s];)printf("%c%*c\n",*s,i,s[j-=2]);for(;*s*~i--;)putchar(*s--);}

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

注目すべきトリック:

  • バイトを浪費する代わりにstrlen、文字列の長さを取得すると同時に、最初の行を印刷します。

    i=j=printf("%s\n",s)-2

    これprintfは、書き込まれたバイト数を返すため機能します。

  • 中央の行については、文字列をループする必要がありますが、最初と最後の文字の両方を除外する必要があります。これは条件で達成されます

    1[++s]

    (これは)よりも短い(++s)[1])、++条件にあるために最初の文字をスキップし、現在の文字を過ぎた文字が'\0'(で停止するの はなく'\0')停止する最後の文字をスキップします。

  • 最初のループの本体では、

    printf("%c%*c\n",*s,i,s[j-=2])

    現在の文字を印刷し、次に適切な「ミラー化された」文字(j負の数になる文字列へのインデックス付けという奇妙な状況をもたらす、負の値になるトラックを保持)iをスペースの長さで埋めます(ここiで便利にstrlen(s) - 1)。

  • 最後の行の逆の印刷は非常に簡単です。唯一のトリックはで*s*~i--、これはi+2ループ本体の反復を取得する最短の方法です(これは依存せずi、すべてiがカウントに使用されます)。ファンキーな*s*部分*s'\0'、isの場合にループが実行されないようにします。これは、長さ1の入力で発生します。


3

オクターブ、40バイト

@(s,t=toeplitz(s),u=t(x=2:end-1,x)=32)t;

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

それは私の答えですが、@ Luis MATLの答えの後に投稿されました


2
とてもいい答えです。ところで:あなたのコードはGNU Octave開発ブランチ4.3.1(b481a9baeb61)をクラッシュさせ、テストスイートの一部になりました:-) hg.savannah.gnu.org/hgweb/octave/rev/c94e9509461b
Andy

1
@Andyありがとう、codegolfへようこそ!Octaveプロジェクトの改善に役立てば幸いです!
-rahnema1

3

Haskell84 78バイト

f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]
r=reverse

オンラインでお試しください! 使用法:f "test"。行のリストを返します。

編集:ダイアンのおかげで-6バイト!


1
パターンガードをガードとして使用し、reverse;の同義語を定義することにより、数バイトを節約できます。 r=reverse;f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]78バイトです。
ダイアン



2

05AB1E17 16 15 19バイト

ÂDÂø¦¨Dgú€Ás)˜»Igi¨

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

説明

の例 input = golf

ÂDÂ                  # bifurcate, duplicate, bifurcate
                     # STACK: 'golf', 'flog', 'flog', 'golf'
   ø                 # zip the top 2 items
                     # STACK: 'golf', 'flog', ['fg', 'lo', 'ol', 'gf']
    ¦¨               # remove the first and last element
                     # STACK: 'golf', 'flog', ['lo', 'ol']
      Dg             # get the length of the list
                     # STACK: 'golf', 'flog', ['lo', 'ol'], 2
        ú            # prepend that many spaces to each element
                     # STACK: 'golf', 'flog', ['  lo', '  ol']
         €Á          # rotate each right
                     # STACK: 'golf', 'flog', ['o  l', 'l  o']
           s         # swap the top 2 items
                     # STACK: 'golf', ['o  l', 'l  o'], 'flog'
            )˜       # wrap in a flattened list
                     # STACK: ['golf', 'o  l', 'l  o', 'flog']
              »      # join on newline
               Igi¨  # if input is length 1, remove last char

1文字入力の修正は非常に高価でした。
今は別のアプローチの方が良いと思う。


1

Pythonの299の 88バイト

musicman523のおかげで-4バイト。

lambda s:s[1:]and[s]+[s[i]+' '*(len(s)-2)+s[~i]for i in range(1,len(s)-1)]+[s[::-1]]or s

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

文字列のリストを返します。


閉じる!出力は、私が求めているものとまったく異なります。
SpookyGengar

1
移動ss[::-1]て、89バイトjoin
musicman523

これは非常に長さ1の文字列では動作しません
musicman523

2
ただ注意してください、すべての問題が修正されました。
完全に人間

1

Mathematica、128バイト

(c=Column;g=Length[x=Characters@#]-1;If[g==0,#,c@{#,c@Table[""<>{x[[i]],""<>Table[" ",g-1],x[[-i]]},{i,2,g}],StringReverse@#}])&

1

C、96バイト

i,l;f(char*s){for(i=l=puts(s)-2;--i;)printf("%c%*c\n",s[l-i],l,s[i]);for(;l+1;)putchar(s[l--]);}

ボーナスバージョン(122バイト):

x,y,i,l;f(char*s){for(i=l=puts(s)-1;++i<l*-~l;putchar(x==l?10:x%~-l*(y%~-l)?32:s[(x*y?l+l-2-x-y:x+y)%l]))x=i%-~l,y=i/-~l;}


1

Python 3、88バイト

w=input();p=print;l=len(w)-2
[p(w[n+1]+' '*l+w[l-n])for n in range(l)]
l+1and p(w[::-1])

1
PPCGへようこそ!
マーティン・エンダー

サイトへようこそ!私はそれl+1 andl+1andバイトを節約するように書き換えられると信じています。
小麦ウィザード

@WheatWizard編集-ありがとう!私は働いて驚いた
レヴィ

これは、8進数の接頭辞である0orためPythonの解析に失敗するの場合を除いて機能し0oます。
小麦ウィザード

私はこれを実行すると、一番上の行を印刷していないようです... tio.run/##FcoxCsQgEAXQPqeYLk7EwqRL8CRiEVh3Iww/...
コティジョナサンサックスマン

1

JavaScript(ES8)、108 112バイト

let f = 

s=>(n=s.length)<2?s:(r=[...s].reverse()).slice(1,-1).reduce((a,v,i)=>a+`
`+s[i+1].padEnd(n-1)+v,s)+`
`+r.join``

o.innerHTML = f("hello folks!")
<pre id="o"></pre>

ゴルファーが少ない

s=>
   (n=s.length) < 2 ?    // record and check length
   s :                   // s has 0 or 1 char, else
   (r=[...s].reverse())  // reverse characters,
   .slice(1,-1)          // exclude 1st and last
   .reduce((a,v,i)=>     // append inner lines
      a +'\n' +s[i+1].padEnd(n-1) + v
    ,s)                  // to first line
    + '\n' +r.join("")   // append characters reversed

大量のバイトを保存してくれたJustin Marinerに感謝します。そして、すべてが使い果たされ、チャレンジに対応するために必要なゼロまたは1文字のチェックが追加されました。あなたはそれを得る:-(


2行目を作成し、`+s[i+1].padEnd(s.length-1)+v,s)+`を使用して7バイトを節約できますr.join``
ジャスティンマリナー

@JustinMarinerに、String.prototype.padStartテンプレートリテラルに関するヒントとタグ付けをありがとう。長さチェックの追加を最小限に抑えるために必要でした:-)
traktor53

間隔が1文字短すぎます。あなたはそれを修正して行うことでより多くのカップルを保存することができます(n=s.length-1)?(r=<...>+r.join``:sし、使用しましたpadEnd(n)。長さがある場合には1length-1ある0(偽)。
ジャスティンマリナー

@JustinMarinerの間隔は固定されていますが、長さのテストを続けています-私が理解するように、長さゼロの文字列と1文字の文字列の両方は、キャリッジリターンまたは文字列の繰り返しなしで戻ります。
traktor53

1
padEndES2017です。
ニール

1

PHP、118バイト

echo $s=$argv[1];$l=strlen($r=strrev($s))-1;for($i=$l-1;$l&&$i;)echo "\n".str_pad($r[$i],$l).$s[$i].(--$i?"":"\n$r");

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

echo $s = $argv[1];
$l = strlen($r = strrev($s)) - 1;

for ($i = $l - 1; $l && $i;)
    echo "\n" . str_pad($r[$i], $l) . $s[$i] . (--$i ? "" : "\n$r");

1

APL、58バイト

{(' ',⍵)[x+(x←∘.{((c-1)=⍺⌈⍵)∨0=⍺⌊⍵}⍨r)×o⌊⌽⊖o←∘.⌈⍨r←⍳c←≢⍵]}

⎕IO←0

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

どうやって?

c←≢⍵ -ストリングの長さ

r←⍳ - 範囲

o←∘.⌈⍨ -最小の外積

123
223
333

o⌊⌽⊖-180 oになった最小化

123  ⌊  333  =  123
223  ⌊  322  =  222
333  ⌊  321  =  321

× -と乗算する

x←∘....⍨r -範囲の外積

    ((c-1)=⍺⌈⍵)∨0=⍺⌊⍵ -マトリックスのフレーム

111  ×  123  =  123
101  ×  222  =  202
111  ×  321  =  321

x+ -フレームを追加

111  +  123  =  234
101  +  202  =  303
111  +  321  =  432

(' ',⍵)[...] -スペースに連結された文字列からインデックスで取得


すること⍉⊖⍉⊖ができます⌽⊖か?
ザカリー

@Zacharýありがとう
Uriel

0

JavaScript(ES2017)、87バイト

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

ES6バージョン:93バイト

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i]+' '.repeat(l-1)+c:z.join``:s).join`
`

少ないゴルフ

s => (
  l = s.length-1,
  [...s].reverse().map( // scan string backwards
     (c, i, z) => 
     i != 0 // check if top row
     ? l-i != 0 // check if bottom row
       ? s[i].padEnd(l) + c // any middle row
       : z.join`` // bottom row: string reversed
     :s // top row: original string
  ).join`\n`
)

F=
s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

function update() {
  O.textContent = F(I.value)
}

update()
<input id=I value='Hello, world!' oninput='update()'>
<pre id=O></pre>


padEndES2017です。
ニール

@Neilは、私は私の見出しを変更しますありがとう
edc65

を使用するとl+~i、ES6バージョンに1バイトを保存できます。これにより、1を2回減算する代わりに1を2回減算する必要がなくなります。
ニール

それがあるべき@Neill-~-i
edc65

私は考えてs=>[...s].reverse(l=s.length).map((c,i,z)=>i?l+~i?s[i]+' '.repeat(l-2)+c:z.join``:s).join`\n` いましたがs=>[...s].reverse(l=s.length-2).map((c,i,z)=>i?i+~l?s[i]+' '.repeat(l)+c:z.join``:s).join`\n` 、うまくいきました。
ニール

0

Java、191バイト

(s)->{PrintStream o=System.out;int l=s.lenght();o.println(s);for(int i=0;i<l;i++){o.printf("%"+"s%"+(l-1)+"s%n",s.charAt(i),s.charAt(l-1-i));for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}}};

(s)ちょうどすることができますs。中に1行のループがある場合は、中括弧を削除できます。バイトを節約できる場合は、印刷する代わりに戻ることができます。int i両方のループで使用します。それらが異なるスコープにあるかどうかはわかりませんが、指摘する価値はあります。同じような変数を一緒に初期化すると、通常バイトが節約されます。for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}-> for(int i=0;i<l;){o.print(s.charAt(l-1-i++));}。末尾のセミコロンは必要ありません。
TheLethalCoder

指摘してくれてありがとう;)(ゴルフにあまり詳しくない)。後で最適化します!
Serverfrog

0

C#(.NET Core)179 161バイト

TheLethalCoderのおかげで-18バイト

using System.Linq;
s=>{int l=s.Length-1,i=1;var d=s.Reverse().ToArray();while(i<l)s+="\n"+s[i]+new string(' ',l-1)+d[i++];if(l>1)s+="\n"+new string(d);return s;};

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

バイトカウントにこれが必要かどうかは、ルールについてはわかりません。

using System.Linq;

誰かがこれについて私を修正してください。

ゴルフをしていない:

s =>
{
    int l = s.Length - 1, i = 1;
    var d = s.Reverse().ToArray();
    while (i < l)
        s += "\n" + s[i] + new string(' ', l - 1) + d[i++];
    if (l > 1)
        s += "\n" + new string(d);
    return s;
};

こんにちは、PPCGへようこそ!Linqを使用しているためusing、バイトカウントに含める必要があります。あなたはLinqを使用しているToCharArray()ので、ちょうどToArray()それができる前に本当に必要Reverse()ですか?使用しているStringときに、完全に修飾するか、使用を含める必要がありますが、これも変更することで簡単に修正できますstring。のifような三項のように短いかもしれませんs+=l>1?if code:"";。をi++ループから削除し、でポストインクリメントできますd[i++]
TheLethalCoder

likeで初期化iします。そして、それがそれだと思う!lint l=s.Length-1,i=1;
TheLethalCoder

@TheLethalCoderありがとう!あなたの提案をコードに追加しました。いくつかのメモ:文字列が実際にIEnumerableを持っていることを完全に忘れていました。文字列の代わりに文字列は、私がまだ戦っているJavaの残留物でした。実際、3成分は驚くほど長いものでした。あなたの変更の後、私はfor(; expr;)をwhile(expr)に変更しました。ありがとうございました。
グジェ

心配ない!ターナリーは時々短くなりますが、通常は短くなりますので、試してみる価値があります。
TheLethalCoder

0

網膜、106バイト

..+
$&¶$&
O$^`.(?=.*$)

\G.
$&$%'¶
r`.\G
¶$%`$&
+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2
T`p` `(?<=.¶.).*(?=.¶.)
G`.

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

..+
$&¶$&

少なくとも2つの文字がある場合は、入力を複製します。

O$^`.(?=.*$)

複製を逆にします。

\G.
$&$%'¶
r`.\G
¶$%`$&

文字列を三角形に変えます。上の三角形は入力から始まり、毎回最初の文字を削除しますが、下の三角形は反転した入力の最初の文字から始まり、毎回文字を追加します。

+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2

最後の文字が/対角線を形成するように、三角形を重ねて結合します。

T`p` `(?<=.¶.).*(?=.¶.)

すべての文字をスペースに変更します(すべての文字が端から少なくとも1文字離れている場合)。

G`.

残っている空白行を削除します。


0

Python 3、85バイト

上の行の入力を使用して:)

a=input()
b=len(a)
for i in range(b-2):print(a[1+i]+" "*(b-2)+a[-2-i])
print(a[::-1])

これで正しい答えが得られますか?
コイショアロイ


0

Python 3、106バイト

機能バージョン...

w=input();p=print;l=len(w)-2
def f(k):p(w[k]+' '*l+w[-k-1]);l-k>0and f(k+1)
l<0 or f(1)or l<1or p(w[::-1])


0

Mathematica、138 91バイト

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&

Wolfram Cloud Sandboxに以下を貼り付けて「セルを評価」をクリックするか、Shift + EnterまたはNumpad Enterを押すと、オンラインで試すことができます:

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&@{"g","o","l","f","y"}//MatrixForm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.