Một hình vuông của văn bản


29

Các thách thức

Cho một chuỗi, xuất văn bản theo hình vuông.

Bạn có thể giả định rằng văn bản sẽ luôn nằm gọn trong một hình vuông và nó sẽ không bao giờ là một chuỗi trống.

Bạn cũng có thể cho rằng nó sẽ không bao giờ có dòng mới.

Thí dụ

Input:
Hi, world

Output:
Hi,
 wo
rld

Các trường hợp thử nghiệm

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

Quy tắc

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng! Tiebreaker là câu trả lời nâng cao nhất.
  • Sơ hở tiêu chuẩn bị cấm.

Chúng ta có thể cho rằng đầu vào sẽ không bao giờ có dòng mới?
Thị trưởngMonty

@MayorMonty vâng.
acrolith

2
Thay vào đó chúng ta có thể xuất mảng chuỗi không?
Leaky Nun

@LeakyNun no 15 chars
acrolith

2
Chúng tôi có thể in với một dòng mới?
Giuseppe

Câu trả lời:


21

Vim, 59, 57 , 48 byte / tổ hợp phím

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

Vì V tương thích ngược, bạn có thể dùng thử trực tuyến!

Tôi ngẫu nhiên nhận được một upvote về câu trả lời này, vì vậy tôi nhìn qua nó một lần nữa. Kỹ năng chơi golf vim của tôi đã tăng lên rất nhiều trong 7 tháng qua, vì vậy tôi thấy rằng câu trả lời này rất kém khi chơi golf. Điều này là tốt hơn nhiều.


15

Brainfuck , 116 112 byte

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

Hãy thử trực tuyến!

An toàn trong các hương vị của BF không che dấu các ô 256, không hỗ trợ byte rỗng.

Xóa các mũi tên phải ban đầu nếu hương vị hỗ trợ bộ nhớ âm cho 4 byte được lưu.

Giải trình

Chương trình được chia thành 3 giai đoạn:

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

Giai đoạn 1

Trong giai đoạn này, chúng tôi đặt tất cả các ký tự lên băng, trong khi vẫn đếm số lượng ký tự.

Đây là băng cho đầu vào abcdefghisau băng này:

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

009số đếm.

Đối với mỗi ký tự, chúng ta di chuyển số 0 đầu tiên bên trái [<]và sau đó thêm một số vào số đếm <<+>>>, sau đó di chuyển sang số 0 ngoài cùng bên phải [>]để sẵn sàng cho ký tự tiếp theo.

Giai đoạn 2

Giai đoạn này thực hiện căn bậc hai của chiều dài được lưu trữ trong ô thứ hai.

Nó tiếp tục trừ đi 1, 3, 5, 7, ...cho đến khi số đạt đến 0, trong khi vẫn kiểm tra số lần lặp.

Nó hoạt động vì số vuông có thể được thể hiện là 1 + 3 + 5 + ....

Giai đoạn 3

Suy ra căn bậc hai của độ dài tìm thấy ở trên như n.

Giai đoạn này xuất các nký tự tại một thời điểm, và sau đó xuất một dòng mới, cho đến khi băng được xóa.


1
+1 đã không đọc trông tuyệt vời mặc dù
Rohan Jhunjhunwala

11

Python 2, 55 byte

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

10

05AB1E , 5 byte

Dgtô«

Hãy thử trực tuyến!

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
Câu trả lời chính xác. Nhưng làm thế nào nó hoạt động? Bạn có thể vui lòng chỉnh sửa để thêm một lời giải thích?
grooveplex

@grooveplex xong.
acrolith

Rất ấn tượng!
Gryphon - Tái lập Monica

3
Thật kỳ lạ khi thấy các câu trả lời cũ của 05AB1E »hiện đang là dòng mới.
Bạch tuộc ma thuật Urn

8

MATL , 6 byte

tnX^e!

Hãy thử trực tuyến!

Giải trình

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" vuông? : P
acrolith

@daHugLenny :-D. Đã sửa
Luis Mendo

4
@daHugLenny Đó là nghịch đảo của căn bậc hai. ;-)
WBT

7

Thạch, 8 7 byte

sLƽ$j⁷

Đã lưu một byte nhờ @ Dennis .

Hãy thử trực tuyến.

Giải trình

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
œsslàm điều tương tự ở đây.
Dennis

Tại sao ½không hoạt động thay vì ƽ?
Luis Mendo

@LuisMendo Vì nó trả về một float. Tôi sẽ vá sœsvì vậy họ cast đến int.
Dennis

@Dennis bản vá được chờ đợi từ lâu vẫn đang chờ đợi ...
Erik the Outgolfer

7

JavaScript (ES7), 49 byte

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

44 byte chỉ trong Firefox Nightly 43-46 ( **được giới thiệu một thời gian giữa Firefox Nightly 42 và 43 và gvì một tham số riêng biệt đã bị xóa một thời gian giữa Firefox Nightly 46 và 47):

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

Trong phiên bản đầu tiên tại sao bạn cần +ins.length*+.5
Downgoat

Tôi chưa bao giờ thấy *+cú pháp trước đây. Ai đó có thể vui lòng giải thích nó?
Thị trưởngMonty

Anh ta có lẽ có nghĩa **.
Conor O'Brien

@MayorMonty Vâng, đó là một lỗi đánh máy.
Neil

@Downgoat Đó là một lỗi đánh máy.
Neil

7

J, 9 byte

$~,~@%:@#

Đây là một hook đơn điệu trên chuỗi đầu vào:

$~ ,~@%:@#

Tine phải là một loạt các tác phẩm:

,~ @ %: @ #

Bên trái là một động từ định hình, được chuyển đổi sao cho nó hoạt động ở định dạng hook.

Dưới đây là một số kết quả trung gian:

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

Trong các từ:

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

2
Tôi thích thực tế là $~,~@giống một số loại biểu tượng cảm xúc nhưng @có vẻ lạ đối với một tai nhưng &phù hợp tốt hơn, hoặc$~,~&
dặm

1
Và tôi cho rằng chúng tương đương về chức năng. Vâng, chủ yếu. Một cho phép bạn nghe tốt hơn so với người khác;)
Conor O'Brien

1
+1 để có điểm số của bạn là n². Của tôi cũng vậy :)
Chấn thương kỹ thuật số

@DigitalTrauma vui! +1 tương tự!
Conor O'Brien

1
$~2#%:@#là 8. Phần bên trái của một ngã ba có thể là một hằng số.
FrownyFrog

5

C, 64 byte

Gọi f()với chuỗi để vuông.

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

Hãy thử nó trên ideone .


1
Bạn có thể làm cho nó hoạt động với intđối số ngầm thay vì char*?
anatolyg

Tôi không nghĩ vậy. Nó cần được hủy đăng ký, do đó, một kiểu số sẽ không hoạt động và nó không thể là int*do điều đó sẽ sai quy mô khi thêm.
owacoder

Đề xuất s+=write(puts(""),s,m));thay vìs+=m)printf("%.*s\n",m,s);
trần mèo

5

Perl, 23 + 4 ( -pFcờ) = 27 byte

-2 byte nhờ @DomHastings
-1 byte nhờ @DomHastings

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

Hãy thử trực tuyến!

Mở rộng : tính căn bậc hai (hãy gọi nó Sđể giải thích) về kích thước của đầu vào (nó sẽ luôn là một số nguyên) ( @Fđược sử dụng trong ngữ cảnh vô hướng, do đó trả về kích thước của nó), sau đó thêm một dòng mới sau mỗi khối Snhân vật.


Sử dụng tốt $@,;) Bạn có thể lưu một byte bằng cách sử dụng y///cthay vì độ dài và tôi nghĩ bạn cũng có thể sử dụng một dòng mới theo nghĩa đen. Tôi đã cố gắng để làm một cái gì đó với thiết lập $,và kết hợp, nhưng tôi nghĩ rằng điều này là ngắn hơn nhiều!
Dom Hastings

1
@DomHastings Yea, tôi nghĩ bạn thích $@! Cảm ơn vì y///c, tôi có xu hướng quên rằng nó tồn tại.
Dada

1
@DomHastings quản lý để lưu 1 byte bằng cách sử dụng $=thay vì $@, cho phép không sử dụng -lcờ.
Dada

Tốt lắm Tốt để sử dụng các biến ma thuật cho lý do chính hãng quá!
Dom Hastings

Hey, hy vọng bạn đang làm tốt! Điều này đã được chuyển đến trang chủ và tôi nhận thấy một tối ưu hóa khác cho mã -1: 23 byte + 4 cho-pF
Dom Hastings

4

zsh, 36 byte

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

Lấy đầu vào làm đối số dòng lệnh, xuất ra 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 để có điểm số của bạn là n². Của tôi cũng vậy :)
Chấn thương kỹ thuật số

4

05AB1E , 8 6 byte

Cảm ơn @quartata đã cho tôi biết về hàm căn bậc hai

Dgtô¶ý

Hãy thử trực tuyến!

Giải trình

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

Rất đẹp! Ngoài ra, «là viết tắt của việc tham gia vào dòng mới :).
Ad Nam

1
@Ad Nam Cảm ơn! Bây giờ tôi đã vượt qua chính mình :-D
Luis Mendo

Tôi đã quay trở lại phiên bản 6 byte của mình vì đã có câu trả lời trước đó với«
Luis Mendo

1
Ồ, điều đó thật tệ :(
Adnan

Có ai khác cảm thấy những ngôn ngữ được tạo ra đặc biệt cho môn đánh gôn đang phá hỏng sự hấp dẫn của toàn bộ điều này không?
René Roth

4

Python, 94 75 71 65 63 byte

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

Phiên bản cũ:

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

Lưu ý rằng bạn có thể sử dụng input() theo mặc định để nhận đầu vào trong dấu ngoặc kép, trừ khi bạn muốn loại bỏ tùy chọn đó một cách cụ thể.
xnor

@xnor Ôi chà, vài ngày trước tôi đã tự hỏi liệu tôi có thể sử dụng dấu ngoặc kép trên đầu vào không ...
acrolith

Nó sẽ không ngắn hơn để sử dụng lambda?
Leaky Nun

@LeakyNun đúng ...
acrolith

3

CJam , 8 byte

l_,mQ/N*

Hãy thử trực tuyến!

Giải trình

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

APL Dyalog, 10 byte

⊢⍴⍨2⍴.5*⍨≢

Giải trình:

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

Các xét nghiệm:

      (⊢⍴⍨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 byte (không cạnh tranh)

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

Tôi đã thêm .chunkchức năng này một thời gian trước nhưng tôi đã loại bỏ nó trong quá trình chuyển đổi sang định dạng stdlib mới và quên thêm lại nó. Cheddar có một sqrtnhà điều hành chuyên dụng nhưng **.5ngắn hơn

Hãy thử trực tuyến!

Giải trình

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 ký tự / 14 byte

ѨĊ(ï,√ ïꝈ⸩Ė⬮

Try it here (ES6 browsers only).

Được tạo bằng mã này (chạy trong bảng điều khiển trình duyệt của trình thông dịch):

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

3

Brainfuck, 83 byte

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

Hãy thử trực tuyến!

Điều này sử dụng ý tưởng tương tự như câu trả lời của Leaky Nun . Anh ấy đã yêu cầu giúp đỡ chơi golf trong trò chuyện, sau đó đề nghị tôi thêm điều này như một câu trả lời mới. (Trên thực tế những gì tôi đã viết trong trò chuyện là một giải pháp 84 byte rất giống với điều này.)

Để dễ so sánh, >ban đầu cần có thêm một phần bổ sung cho việc triển khai brainfuck không cho phép các địa chỉ bộ nhớ tiêu cực.

Như mong đợi, điều này tìm thấy độ dài của đầu vào, sau đó lấy căn bậc hai, sau đó in các dòng tương ứng. Nó tận dụng các hình vuông hoàn hảo là một phần của 1 + 3 + 5 ....


3

Brain-Flak , 110 96 byte

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

Hãy thử trực tuyến!

Giải pháp thứ hai, 96 byte

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

Hãy thử trực tuyến!

Giải trình

Ở đây tôi giải thích giải pháp đầu tiên, cả hai đều có cùng độ dài nhưng tôi thích giải pháp đầu tiên vì nó mát hơn và sử dụng một số thủ thuật hay.

Phần quan trọng nhất của mã là một hàm căn bậc hai đã sửa đổi mà tôi đã viết cách đây một thời gian. Phiên bản gốc là

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

Và điều này hoạt động, nhưng chúng tôi thực sự muốn hai bản sao của căn bậc hai âm. Tại sao? Chúng tôi cần hai bản sao vì chúng tôi đang lặp qua chuỗi ở hai cấp độ, một để tạo các dòng và một để đếm số lượng dòng. Chúng tôi muốn nó là tiêu cực bởi vì lặp với tiêu cực là rẻ hơn.

Để làm cho điều này tiêu cực, chúng tôi di chuyển xung quanh [...]để nó trông như thế này

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

Để tạo hai bản sao, chúng tôi thay đổi khi xuất hiện

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

Bây giờ chúng ta có bit đó, chúng ta có thể đặt nó cùng với chiều cao ngăn xếp để có được đoạn mã đầu tiên chúng ta cần.

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

Chúng tôi chuyển sang offstack vì hàm căn bậc hai của chúng tôi cần hai số không miễn phí để tính toán, và vì nó làm cho công cụ rẻ hơn một chút so với tương lai về mặt chuyển đổi ngăn xếp.

Bây giờ chúng ta xây dựng vòng lặp chính

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

Điều này khá dễ dàng, chúng tôi lặp lại n lần mỗi lần di chuyển n mục và giới hạn nó bằng một dòng mới (ASCII 10).

Sau khi hoàn thành vòng lặp, chúng ta cần đảo ngược thứ tự đầu ra để chúng ta giải quyết một cấu trúc đảo ngược tiêu chuẩn.

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



2

Perl 6 , 38 byte

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

Giải trình:

$_ = 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 byte

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

Vì các biến bị hỏng, tôi sẽ phải chuyển các biến qua ứng dụng lambda.

Ngoài ra, nó chỉ ra rằng ngay cả khi các biến hoạt động, nó vẫn sẽ ngắn hơn để sử dụng ứng dụng lambda.

Sử dụng

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 byte

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));}

Thử nó! (Ý)

Tôi đã thử một cách tiếp cận khác với một hàm trả về kết quả dưới dạng một chuỗi, nhưng chỉ cần khai báo chuỗi và câu lệnh return đã đắt hơn (byte-Count-khôn ngoan) so với câu lệnh in.

Phải yêu sự dài dòng của Java ... :)


Câu trả lời hay +1. Bạn có thể chơi golf nó bằng 1 byte bằng cách sử dụng i=0, i<ks.substring(i*k,i++*k+k)thay vì i=-1, ++i<k, s.substring(i*k,i*k+k). Ngoài ra, thông thường chúng tôi chỉ sử dụng Java 7thay vì Java 1.7, nhưng thật tốt khi bạn đã thêm nó, rất nhiều người quên làm điều đó.
Kevin Cruijssen

2

R , 59 54 byte

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

Hãy thử trực tuyến!

In với một dòng mới. Đáng ngạc nhiên là ngắn, xem xét R xử lý chuỗi tồi tệ như thế nào.




1

Lồi , 7 byte

_,mQ/N*

Hãy thử trực tuyến!

Sự thật thú vị:

_,mQ/\* cũng hoạt động trên TIO do cách thức hoạt động của nó.

Làm thế nào tôi đã quên để thực hiện một op vuông 1-char?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.