テキストの正方形


29

チャレンジ

文字列を指定すると、テキストを正方形の形状で出力します。

テキストは常に正方形に収まり、空の文字列になることはないと想定できます。

また、改行がないことも想定できます。

Input:
Hi, world

Output:
Hi,
 wo
rld

テストケース

Input:
Hi, world! Hello

Output:
Hi, 
worl
d! H
ello

Input:
Lorem ipsum dolor sit amt

Output:
Lorem
 ipsu
m dol
or si
t amt

Input:
H

Output:
H

ルール

  • これはなので、バイト単位の最短回答が勝ちです!タイブレーカーは最も支持された答えです。
  • 標準的な抜け穴は禁止されています。

入力に改行がないことを想定できますか?
MayorMonty

@MayorMontyうん。
アクロリス

2
代わりに文字列の配列を出力できますか?
漏れの修道女

@LeakyNun 15文字
アクロリス

2
末尾に改行を付けて印刷できますか?
ジュゼッペ

回答:


21

VIM、59、57、48バイト/キーストローク

$:let @q=float2nr(sqrt(col('.')))."|li<C-v><cr><C-v><esc>@q"<cr>@q

Vは下位互換性があるため、オンラインで試すことができます!

この回答に対してランダムに賛成票を受け取ったので、もう一度調べました。私のヴィムゴルフのスキルは過去7か月で大きく向上したので、この答えは非常に粗末なものでした。これははるかに優れています。


15

Brainfuck116 112バイト

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

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

でセルをマスクしないBFのフレーバーで安全で256、nullバイトをサポートしません。

フレーバーが保存された4バイトのネガティブメモリをサポートする場合、最初の右矢印を削除します。

説明

プログラムは3つの段階に分かれています。

Stage 1: >>>>,[[<]<<+>>>[>],]<[<]
Stage 2: <+<[>>+<[-<-<+>>]<<++[->>+<<]>]>[-]>>
Stage 3: [<[->.[-]<[->+<]<+[->+<]>>]++++++++++.[-]<[->+<]>>]

ステージ1

この段階では、文字の数をカウントしながら、すべての文字をテープに入れます。

これは、abcdefghiこのテープの後の入力用のテープです。

000 009 000 000 095 096 097 098 099 100 101 102 103
             ^

009カウントです。

各文字について、左側の最初のゼロを移動して[<]からcount <<+>>>に1を追加し、右端のゼロ[>]に移動して次の文字の準備をします。

ステージ2

この段階では、2番目のセルに格納されている長さの平方根を実行します。

1, 3, 5, 7, ...繰り返し回数をチェックしながら、数値がゼロになるまで減算を続けます。

平方数はとして表現できるため機能し1 + 3 + 5 + ...ます。

ステージ3

上記の長さの平方根をとして示しnます。

このステージnは一度に文字を出力し、テープがクリアされるまで改行を出力します。


1
+1は読みませんでしたが、見た目は素晴らしかった
Rohan Jhunjhunwala

11

Python 2、55バイト

s=input()
n=int(len(s)**.5)
while s:print s[:n];s=s[n:]

10

05AB1E、5バイト

Dgtô«

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

D    duplicate a (implicit input)
g    length of a
t    square root of a
ô    push a split in pieces of b
«    join by newlines (implicit output)

1
素晴らしい答え。しかし、それはどのように機能しますか?編集して説明を追加してもらえますか?
グルーブプレックス

@grooveplex完了。
アクロリス

非常に印象的!
グリフォン-モニカの復活

3
古い05AB1Eの答えが»現在どこにあるかを見るのは奇妙です。
魔法のタコUr

8

MATL、6バイト

tnX^e!

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

説明

t     % Take input implicitly. Push another copy
n     % Get number of elements of the copy
X^    % Take square root
e     % Reshape the input into that number of rows, in column-major order
      % (which means: down, then across)
!     % Transpose so that text reads horizontally. Implicitly display

1
正方形の「toor」?:P
アクロリス

@daHugLenny :-D。修正
ルイスメンドー

4
@daHugLennyこれは平方根の逆です。;-)
WBT

7

ゼリー、8 7 バイト

sLƽ$j⁷

@ Dennisのおかげで1バイト節約できました。

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

説明

sLƽ$j⁷  Input: string S
    $    Monadic chain
 L         Get the length of S
  ƽ       Take the integer square root of it, call it n
s        Split S into chunks of size n
     j⁷  Join using newline

2
œsそしてs、ここで同じことを行います。
デニス

なぜでは½なく動作しないのƽですか?
ルイスメンドー

@LuisMendoフロートを返すため。パッチsを適用œsして、intにキャストします。
デニス

@Dennis待望のパッチはまだ待っています...
エリックアウトゴルファー

7

JavaScript(ES7)、49バイト

s=>s.match(eval(`/.{${s.length**.5}}/g`)).join`
`

Firefox Nightly 43-46のみで44バイト(**Firefox Nightly 42と43の間に導入さgれ、Firefox Nightly 46と47の間に別のパラメータが削除されたため)

s=>s.match(`.{${s.length**.5}}`,`g`).join`
`

最初のバージョンでは、なぜあなたは必要ですか+s.length*+.5
Downgoat

*+以前に構文を見たことがありません。誰か説明していただけますか?
MayorMonty

彼はおそらく意味し**ます。
コナーオブライエン

@MayorMontyうん、タイプミスでした。
ニール

@Downgoatタイプミスでごめんなさい。
ニール

7

J、9バイト

$~,~@%:@#

これは、入力文字列に対する単項フックです。

$~ ,~@%:@#

右のタインは一連の構成です:

,~ @ %: @ #

左はシェーピング動詞で、フック形式で動作するように切り替えられています。

中間結果は次のとおりです。

   # 'hiya'
4
   %:@# 'hiya'
2
   ,~@%:@# 'hiya'
2 2

言葉で:

   size =: #
   sqrt =: %:
   dup =: ,~
   on =: @
   shape =: $~
   block =: shape dup on sqrt on size
   block 'Hello, World! :)'
Hell
o, W
orld
! :)

2
事実のように私$~,~@の顔文字のいくつかの並べ替えに似ているが@、耳のための奇妙なようだが、&より良いフィット、または$~,~&
マイル

1
そして、機能的に同等であると思います。まあ、ほとんど。1つを使用すると、他の音よりも聞き取りやすくなります;)
コナーオブライエン

1
スコアをn²にした+1。 私も :)
デジタル外傷

@DigitalTrauma楽しい!同様に+1!
コナーオブライエン

1
$~2#%:@#フォークの左部分は定数にすることができます。
-FrownyFrog

5

C、64バイト

f()平方する文字列で呼び出します。

m;f(char*s){for(m=sqrt(strlen(s));*s;s+=m)printf("%.*s\n",m,s);}

ideoneで試してみてください


1
int代わりに暗黙の引数で動作させることはできますchar*か?
アナトリグ

そうは思いません。これは逆参照する必要があるため、数値型は機能しませんint*。また、追加時にスケーリングが間違っているため、数値型は使用できません。
-owacoder

提案するs+=write(puts(""),s,m));代わりにs+=m)printf("%.*s\n",m,s);
ceilingcat

5

Perl、23 + 4(-pFフラグ)= 27バイト

-2のおかげバイト@DomHastings
-1おかげバイト@DomHastingsを

$==sqrt@F;s/.{$=}/$&
/g

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

ExpanationsS入力のサイズの平方根を計算し(説明のために呼び出します)(常に整数になります)(@Fスカラーコンテキストで使用されるため、サイズを返します)、各ブロックの後に改行を追加しますS文字。


の素敵な使用;; $@y///c長さの代わりにバイトを保存でき、リテラルの改行も使用できると思います。私は設定$,とマッチングで何かをしようとしているように見えましたが、これはもっと短いと思います!
ドムヘイスティングス

1
@DomHastingsうん、私はあなたが好きだと思った$@!のおかげでy///c、私はそれが存在することを忘れがちです。
ダダ

1
@DomHastings $=$@-lフラグの使用を許可しないの代わりにを使用して1バイトを節約しました。
ダダ

良い調子!真の理由から魔法の変数を使用するのも良いことです!
ドムヘイスティングス

ねえ、あなたが大丈夫だと思います!これはホームページにぶつかり、-1の別の最適化に気付きました:23バイトコード+ 4の-pF
Dom Hastings

4

zsh、36バイト

fold -`sed s/.$//<<<$[$#1**.5]`<<<$1

入力をコマンドライン引数として受け取り、STDOUTに出力します。

                      $#1             get the length of the input string
                    $[   **.5]        take it to the .5 power (sqrt)
                 <<<                  and pass the result to
       sed s/.$//                     sed, which removes the last character
                                      this is because sqrt(9) is 3. instead of 3
     -`                       `       give the result as a command line flag to
fold                                  the fold util, which wraps at nth column
                               <<<$1  pass the input as input to fold

スコアをn²にした+1。 私も :)
デジタル外傷

4

05AB1E8 6バイト

平方根関数について教えてくれた@quartataに感謝

Dgtô¶ý

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

説明

D     Implicit input. Duplicate
g     Number of elements
t     Square root
ô     Split into chunks of that length
¶     Push newline character
ý     Join list by newlines. Implicit display

非常に素晴らしい!また、«改行に参加するための短いです:)。
アドナン

1
@Adnanありがとう!今、私は自分自身をアウトゴルフしました:-D
ルイスメンドー

前の回答があったので、私は私の6バイトのバージョンにロールバックされた«
ルイスMendo

1
ああ、それはあまりにも悪いです:(
アドナン

コードゴルフ用に特別に作成されたこれらの言語が、この全体の魅力を少し台無しにしていると他の誰かが感じていますか?
ルネ・ロス

4

Python、94 75 71 65 63バイト

import re;lambda r:"\n".join(re.findall("."*int(len(r)**.5),r))

古いバージョン:

lambda r:"\n".join(map("".join,zip(*[iter(r)]*int(len(r)**.5))))

明示的にそのオプションを削除する場合を除き、引用符で囲まれた入力を受け取るためinput() にデフォルトで使用できることに注意してください。
-xnor

@xnorああすごい、数日前、入力に引用符を使用できるかどうか疑問に思っていました
...-acrolith

ラムダを使用すると短くなりませんか?
リーキー修道女

@LeakyNun true
...-アクロリス



3

Dyalog APL、10バイト

⊢⍴⍨2⍴.5*⍨≢

説明:

         ≢   length of the argument   
     .5*⍨    square root 
   2⍴        reshape that to a length-2 vector
⊢⍴⍨          reshape the input by that vector

テスト:

      (⊢⍴⍨2⍴.5*⍨≢)'Hi, world'
Hi,
 wo
rld
      (⊢⍴⍨2⍴.5*⍨≢)'Hi, world! Hello'
Hi, 
worl
d! H
ello
      (⊢⍴⍨2⍴.5*⍨≢)'Lorem ipsum dolor sit amt'
Lorem
 ipsu
m dol
or si
t amt
      (⊢⍴⍨2⍴.5*⍨≢) 'H'
H

3

チェダー、27バイト(非競合)

s->s.chunk(s.len**.5).vfuse

.chunk少し前に関数を追加しましたが、新しいstdlib形式への移行時に削除し、再度追加するのを忘れました。チェダーには専用のsqrtオペレーターがいます**.5が、より短いです

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

説明

s ->              // Function with argument s
    s.chunk(      // Chunk it into pieces of size...
      s.len ** .5 // Square root of length.
    ).vfuse       // Vertical-fuse. Join on newlines


3

𝔼𝕊𝕄𝕚𝕟、11文字/ 14バイト

ѨĊ(ï,√ ïꝈ⸩Ė⬮

Try it here (ES6 browsers only).

このコードを使用して生成されます(インタープリターのブラウザーコンソールで実行):

c.value=`Ѩ${alias(_,'chunk')}(ï,√ ïꝈ⸩${alias(Array.prototype,'mjoin')}⬮`

3

Brainfuck、83バイト

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

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

これは、Leaky Nunの答えと同じ考えを使用しています。彼はチャットでゴルフをするのを手伝ってほしいと頼み、それを新しい答えとして追加することを提案した。(実際にチャットで書いたのは、これと非常によく似た84バイトのソリューションでした。)

比較のために、>負のメモリアドレスを許可しないブレインファックの実装には、最初に追加が必要です。

予想どおり、これは入力の長さを見つけ、平方根を取得し、それに応じて行を出力します。それはの部分和である完全な正方形を利用し1 + 3 + 5 ...ます。


3

Brain-Flak110 96バイト

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

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

2番目のソリューション、96バイト

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

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

説明

ここで最初の解決策を説明しますが、どちらも同じ長さですが、最初の解決策が好きです。

コードの最も重要な部分は、先ほど書いた修正平方根関数です。元のバージョンは

{({}[({})({}())])}{}

これは機能しますが、実際には負の平方根の2つのコピーが必要です。どうして?2つのレベルで文字列をループしているため、2つのコピーが必要です。1つは行を作成し、もう1つは行数をカウントします。ネガティブでループする方が安価なので、ネガティブにしたいです。

これをネガティブにするには[...]、次のように動きます。

{({}({})({}[()]))}{}

2つのコピーを作成するには、ポップが発生したときに変更します

{({}{}(({}[()])))}{}

必要なコードの最初のチャンクを取得するために、そのビットをスタックの高さと組み合わせることができます。

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

平方根関数は計算のために2つの空きゼロを必要とし、スタックの切り替えに関しては将来的には少し安くなるため、オフスタックに移行します。

次に、メインループを構築します

{({}()<(({})<{({}()<<>({}<>)>)}{}((()()()()()){})>)>)}{}{}

これは非常に単純です。n個のアイテムを移動し、改行(ASCII 10)でキャップするたびにn回ループします。

ループが完了したら、出力の順序を逆にする必要がありますので、標準の逆構成を追加します。

{({}<>)<>}<>



2

Perl 6、38バイト

$_=get;.put for .comb: .chars.sqrt.Int

説明:

$_ = get;          # get a single line of input


$_.put             # print with trailing newline

for                # every one of the following:

$_.comb:           # the input split into

$_.chars.sqrt.Int  # chunks of the appropriate size

2

チェダー、57バイト

n->(m->(|>m).map(i->n.slice(i*m,i*m+m)).vfuse)(n.len**.5)

変数が壊れているため、ラムダアプリケーションを介して変数を渡す必要があります。

また、変数が機能していても、ラムダアプリケーションを使用する方が短いことがわかります。

使用法

cheddar> (n->(m->(|>m).map(i->n.slice(i*m,i*m+m)).vfuse)(n.len**.5))("abcd")
"ab
cd"


2

Java 1.7、110バイト

void f(String s){for(int i=-1,k=(int)Math.sqrt(s.length());++i<k;)System.out.println(s.substring(i*k,i*k+k));}

それを試してみてください!(イデオン)

結果を文字列として返す関数を使用して別のアプローチを試みましたが、文字列とreturnステートメントを宣言するだけで、既にprintステートメントよりも高価です(バイトカウント単位)。

お奨めは、Javaの冗長性を愛しています... :)


いい答え+1。あなたは使用して1バイト単位でゴルフをすることができi=0i<kそしてs.substring(i*k,i++*k+k)代わりにi=-1++i<ks.substring(i*k,i*k+k)。また、通常はのJava 7代わりに使用Java 1.7しますが、追加したのは良いことです。多くの人がそうするのを忘れています。
ケビンCruijssen




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