文字方块


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

规则

  • 这是,因此最短答案以字节为单位!决胜局是最令人讨厌的答案。
  • 禁止出现标准漏洞。

我们可以假设输入永远不会有新行吗?
2016年

@MontyMonty是的。
acrolith '16

2
我们可以改为输出字符串数组吗?
Leaky Nun

@LeakyNun没有15个字符
acrolith '16

2
我们可以用尾随换行符打印吗?
朱塞佩

Answers:


21

Vim,59、57、48字节/击键

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

由于V向后兼容,因此您可以在线尝试!

我随机收到有关此答案的赞誉,因此我再次查看了它。在过去的7个月里,我的vim高尔夫技能大大提高了,因此我发现这个答案打得很差。这个好多了。


15

脑干116 112字节

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

在线尝试!

安全的BF格式不会用遮盖单元格256,不支持空字节。

如果风味支持负内存(保留4个字节),请删除最初的右箭头。

说明

该计划分为3个阶段:

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

阶段1

在这个阶段,我们将所有字符放到磁带上,同时保持对字符数的计数。

这是此磁带abcdefghi后面的输入磁带:

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

009是计数。

对于每个字符,我们将第一个零移动到左侧[<],然后将1加到count <<+>>>,然后移动到最右边的零[>]以准备下一个字符。

第二阶段

此阶段执行存储在第二个单元格中的长度的平方根。

它会一直减去1, 3, 5, 7, ...直到数字达到零,同时还要检查迭代次数。

之所以有效,是因为平方数可以表示为1 + 3 + 5 + ...

第三阶段

将上面找到的长度的平方根表示为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:]


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
acrolith '16

@daHugLenny :-D 已更正
Luis Mendo

4
@daHugLenny那是平方根的倒数。;-)
WBT

7

果冻,8 7 个字节

sLƽ$j⁷

感谢@ Dennis节省了一个字节。

在线尝试。

说明

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
œss在这里做同样的事情。
丹尼斯

为什么不起作用½而不是ƽ
路易斯·门多

@LuisMendo因为它返回一个浮点数。我会打补丁,s然后将œs它们转换为整数。
丹尼斯

@Dennis期待已久的补丁仍在等待中……
Outgolfer的Erik '17

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

我以前从未看过*+语法。有人可以解释一下吗?
2016年

他大概是意思**
科纳·奥布莱恩

@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
而且我确实认为它们在功能上是等效的。好吧,主要是。一个让您比其他人听得更好;)
Conor O'Brien

1
+1为n²。 我的也是:)
Digital Trauma

@DigitalTrauma好玩!+1同样!
科纳·奥布莱恩

1
$~2#%:@#是8。叉子的左侧部分可以是一个常数。
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*吗?
anatolyg

我不这么认为。它需要被取消引用,因此数字类型将不起作用,并且也不能是数字类型,int*因为添加时会缩放错误。
owacoder '16

建议s+=write(puts(""),s,m));而不是s+=m)printf("%.*s\n",m,s);
ceilingcat '18 -10-11

5

Perl,23 + 4(-pF标志)= 27个字节

-2字节由于@DomHastings
-1由于字节@DomHastings

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

在线尝试!

扩容:计算S输入大小(将始终为整数)(@F在标量上下文中使用,从而返回其大小)的平方根(让它为解释用),然后在每个bloc之后添加换行符S字符。


很好的使用$@;;)您可以使用y///c而不是长度来保存字节,我想您也可以使用文字换行。我一直在尝试进行设置$,和匹配,但是我认为这要短得多!
Dom Hastings

1
@DomHastings是的,我认为您想要$@!感谢您的支持y///c,我倾向于忘记它的存在。
达达

1
@DomHastings通过使用$=代替来节省了1个字节$@,从而不允许使用-l标志。
达达

太好了!也可以出于真正的原因而使用魔术变量!
Dom Hastings

嘿,希望您一切正常!这碰到了主页,我注意到-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

+1为n²。 我的也是:)
Digital Trauma

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
Luis

我已经回滚到6字节版本,因为之前有过答复«
Luis Mendo,2016年

1
哦,那太糟糕了:(
Adnan

还有其他人会觉得那些专门为打高尔夫球而专门创建的语言会破坏整个游戏的吸引力吗?
勒内·罗斯(

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

使用lambda会更短吗?
Leaky Nun

@LeakyNun true ...
acrolith '16

3

CJam,8个字节

l_,mQ/N*

在线尝试!

说明

l     e# Read line from input
_,    e# Duplicate. Get length 
mQ    e# Integer square root
/     e# Split into pieces of that size
N*    e# Join by newline. Implicitly display


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

Cheddar,27个字节(非竞争)

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

.chunk不久前添加了该函数,但是在过渡到新的stdlib格式时将其删除,却忘记了重新添加它。Cheddar有专门的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字节解决方案。)

为了比较,额外 >开始就需要功能来实现不允许负内存地址的Brainfuck实现。

如预期的那样,这将找到输入的长度,然后取平方根,然后相应地打印行。它利用完全平方作为的部分和的优势1 + 3 + 5 ...


3

Brain-Flak110 96字节

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

在线尝试!

第二种解决方案,96字节

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

在线尝试!

说明

在这里,我解释第一个解决方案,它们的长度相同,但是我喜欢第一个解决方案,因为它比较凉爽,并且使用了一些不错的技巧。

该代码最重要的部分是我前一段时间编写的修改后的平方根函数。原始版本为

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

这行得通,但是我们实际上需要负平方根的两个副本。为什么?我们需要两个副本,因为我们在两个级别上遍历字符串,一个副本用于制作行,另一个副本用于计算行数。我们希望它是负数,因为与负数循环比较便宜。

为了使这个负面的我们走动,[...]所以看起来像这样

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

要制作两份副本,我们会在发生爆裂声时进行更改

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

现在我们有了这个位,我们可以将其与堆栈高度放在一起以获得所需的第一段代码。

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

我们之所以移至堆栈外,是因为我们的平方根函数需要两个免费的零来进行计算,并且因为它在堆栈交换方面使未来的东西便宜一些。

现在我们构造主循环

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

这很简单,每次移动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

Cheddar,57个字节

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

由于变量已损坏,因此我必须通过lambda应用程序传递变量。

而且,事实证明,即使变量起作用,使用lambda应用程序仍然会更短。

用法

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<ks.substring(i*k,i++*k+k)代替i=-1++i<ks.substring(i*k,i*k+k)。另外,通常我们使用Java 7而不是Java 1.7,但是您添加了它很好,很多人都忘记这样做了。
凯文·克鲁伊森

2

R59 54字节

function(s)write(el(strsplit(s,'')),1,nchar(s)^.5,,'')

在线尝试!

用尾随换行符打印。考虑到R处理字符串的严重程度,令人惊讶的简短。




1

,7个字节

_,mQ/N*

在线尝试!

有趣的事实:

_,mQ/\* 由于TIO的工作原理,它也可以工作。

我怎么忘了做一个1个字符的平方根运算呢?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.