Kwadrat tekstu


29

Wyzwanie

Biorąc pod uwagę ciąg, wyślij tekst w kształcie kwadratu.

Możesz założyć, że tekst zawsze będzie pasował do kwadratu i że nigdy nie będzie pusty ciąg.

Możesz również założyć, że nigdy nie będzie miał nowych linii.

Przykład

Input:
Hi, world

Output:
Hi,
 wo
rld

Przypadki testowe

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

Zasady

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach! Tiebreaker jest najbardziej pozytywną odpowiedzią.
  • Standardowe luki są zabronione.

Czy możemy założyć, że dane wejściowe nigdy nie będą miały nowych wierszy?
MayorMonty,

@MayorMonty tak.
acrolith

2
Czy zamiast tego możemy wypisać tablicę ciągów?
Leaky Nun

@LeakyNun nr 15 znaków
acrolith

2
Czy możemy drukować z końcowym znakiem nowej linii?
Giuseppe,

Odpowiedzi:


21

Vim, 59, 57 , 48 bajtów / naciśnięć klawiszy

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

Ponieważ V jest wstecznie kompatybilny, możesz wypróbować online!

Losowo otrzymałem opinię o tej odpowiedzi, więc ponownie ją przejrzałem. Moje umiejętności gry w vim-golfa znacznie wzrosły w ciągu ostatnich 7 miesięcy, więc zobaczyłem, że ta odpowiedź była bardzo słaba. Ten jest znacznie lepszy.


15

Brainfuck , 116 112 bajtów

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

Wypróbuj online!

Bezpieczny w smakach BF, który nie maskuje komórek 256, nie obsługuje bajtów zerowych.

Usuń początkowe strzałki w prawo, jeśli smak obsługuje pamięć ujemną dla 4 zapisanych bajtów.

Wyjaśnienie

Program podzielony jest na 3 etapy:

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

Scena 1

Na tym etapie umieszczamy wszystkie postacie na taśmie, jednocześnie licząc liczbę znaków.

Oto taśma wejściowa abcdefghipo tej taśmie:

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

To 009jest liczba.

Dla każdej postaci przesuwamy pierwsze zero po lewej stronie, [<]a następnie dodajemy jeden do liczby <<+>>>, a następnie przesuwamy do skrajnego prawego zera, [>]aby przygotować się do następnego znaku.

Etap 2

Ten etap wykonuje pierwiastek kwadratowy z długości przechowywanej w drugiej komórce.

Odejmuje od, 1, 3, 5, 7, ...aż liczba osiągnie zero, jednocześnie sprawdzając liczbę iteracji.

Działa, ponieważ liczby kwadratowe można wyrazić jako 1 + 3 + 5 + ....

Etap 3

Oznacz pierwiastek kwadratowy długości znalezionej powyżej jako n.

Ten etap wypisuje nznaki na raz, a następnie wypisuje nowy wiersz, aż taśma zostanie wyczyszczona.


1
+1 nie przeczytane wygląda jednak niesamowicie
Rohan Jhunjhunwala

11

Python 2, 55 bajtów

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


8

MATL , 6 bajtów

tnX^e!

Wypróbuj online!

Wyjaśnienie

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
kwadratowy „toor”? : P
acrolith

@daHugLenny :-D. Poprawiono
Luis Mendo,

4
@daHugLenny To jest odwrotność pierwiastka kwadratowego. ;-)
WBT

7

Galaretka, 8 7 bajtów

sLƽ$j⁷

Zapisano bajt dzięki @ Dennis .

Wypróbuj online.

Wyjaśnienie

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
œsi szrób to samo tutaj.
Dennis

Dlaczego ½nie działa zamiast ƽ?
Luis Mendo,

@LuisMendo Ponieważ zwraca liczbę zmiennoprzecinkową. Będę załatać si œstak rzucili do int.
Dennis

@ Dennis długo oczekiwana łatka wciąż czeka ...
Erik the Outgolfer

7

JavaScript (ES7), 49 bajtów

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

Tylko 44 bajty w Firefoksie Nightly 43-46 ( **wprowadzono jakiś czas między Firefox Nightly 42 a 43 i gjako oddzielny parametr usunięto jakiś czas pomiędzy Firefox Nightly 46 i 47):

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

W pierwszej wersji, dlaczego potrzebujesz +ins.length*+.5
Downgoat

Nigdy wcześniej nie widziałem tej *+składni. Czy ktoś mógłby to wyjaśnić?
MayorMonty,

On prawdopodobnie ma na myśli **.
Conor O'Brien,

@MayorMonty Tak, to była literówka przepraszam.
Neil,

@Downgoat Przepraszam za literówkę.
Neil,

7

J, 9 bajtów

$~,~@%:@#

To monadyczny hak na łańcuch wejściowy:

$~ ,~@%:@#

Właściwy ząb to seria kompozycji:

,~ @ %: @ #

Lewy to czasownik kształtujący, przełączony tak, że działa w formacie haka.

Oto kilka wyników pośrednich:

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

W słowach:

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

2
Podoba mi się fakt, że $~,~@przypomina emotikon, ale @wydaje się dziwny dla ucha, ale &pasuje lepiej lub$~,~&
mile

1
I przypuszczam, że są funkcjonalnie równoważne. Cóż, głównie. Jedna pozwala lepiej słyszeć niż druga;)
Conor O'Brien

1
+1 za uzyskanie wyniku wynosi n². Mój też jest :)
Digital Trauma

@DigitalTrauma fun! +1 podobnie!
Conor O'Brien,

1
$~2#%:@#wynosi 8. Lewa część widelca może być stała.
FrownyFrog,

5

C, 64 bajty

Zadzwoń f()za pomocą ciągu na kwadrat.

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

Wypróbuj na ideone .


1
Czy możesz sprawić, by działał z niejawnym intargumentem zamiast char*?
anatolyg

Nie wydaje mi się Trzeba go wyrejestrować, aby typ liczbowy nie działał i nie może być inaczej, int*ponieważ podczas dodawania źle się skaluje.
owacoder

Zaproponuj s+=write(puts(""),s,m));zamiasts+=m)printf("%.*s\n",m,s);
ceilingcat

5

Perl, 23 + 4 (-pF flagi) = 27 bajtów

-2 bajty dzięki @DomHastings
-1 bajtów dzięki @DomHastings

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

Wypróbuj online!

Objaśnienia : oblicza pierwiastek kwadratowy (nazwijmy to Swyjaśnieniem) wielkości danych wejściowych (zawsze będzie to liczba całkowita) ( @Fjest używany w kontekście skalarnym, zwracając w ten sposób swój rozmiar), a następnie dodaje nowy wiersz po każdym bloku Spostacie.


Ładne użycie $@;;) Możesz zapisać bajt używając y///czamiast długości i myślę, że możesz również użyć dosłownie nowej linii. Chciałem zrobić coś z ustawianiem $,i dopasowywaniem, ale myślę, że jest to znacznie krótsze!
Dom Hastings,

1
@DomHastings Tak, myślałem, że ci się spodoba $@! Dzięki za y///c, zwykle zapominam, że istnieje.
Dada,

1
@DomHastings udało się zapisać 1 bajt, używając $=zamiast $@, co pozwala nie używać -lflagi.
Dada,

Dobrze idzie! Dobrze jest używać magicznych zmiennych również z prawdziwych powodów!
Dom Hastings,

Hej, mam nadzieję, że wszystko w porządku! Zostało to uderzone w stronę główną i zauważyłem kolejną optymalizację dla kodu 1: 23 bajtów + 4 dla-pF
Dom Hastings

4

zsh, 36 bajtów

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

Pobiera dane wejściowe jako argument wiersza poleceń, wysyła do 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 za uzyskanie wyniku wynosi n². Mój też jest :)
Digital Trauma

4

05AB1E , 8 6 bajtów

Dzięki @quartata za poinformowanie mnie o funkcji pierwiastka kwadratowego

Dgtô¶ý

Wypróbuj online!

Wyjaśnienie

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

Bardzo dobrze! Jest także «skrótem od dołączania do nowych linii :).
Adnan,

1
@Adnan Thanks! Teraz wygram z siebie :-D
Luis Mendo

Cofnąłem się do mojej 6-bajtowej wersji, ponieważ była poprzednia odpowiedź z«
Luis Mendo

1
Och, to źle :(
Adnan

Czy ktoś jeszcze uważa, że ​​te języki stworzone specjalnie dla golfa kodowego rujnują atrakcyjność tego wszystkiego?
René Roth,

4

Python, 94 75 71 65 63 bajtów

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

Stara wersja:

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

Zauważ, że input() domyślnie możesz używać do wprowadzania danych w cudzysłowie, chyba że chcesz specjalnie usunąć tę opcję.
xnor

@ xnor O rany, kilka dni temu zastanawiałem się, czy mógłbym użyć cytatów na wejściu ...
acrolith

Czy nie byłoby krótsze stosowanie lambda?
Leaky Nun

@LeakyNun true ...
acrolith

3

CJam , 8 bajtów

l_,mQ/N*

Wypróbuj online!

Wyjaśnienie

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 bajtów

⊢⍴⍨2⍴.5*⍨≢

Wyjaśnienie:

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

Testy:

      (⊢⍴⍨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 bajtów (niekonkurencyjny)

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

Dodałem tę .chunkfunkcję jakiś czas temu, ale usunąłem ją w przejściu do nowego formatu stdlib i zapomniałem ponownie ją dodać. Cheddar ma dedykowanego sqrtoperatora, ale**.5 jest krótszy

Wypróbuj online!

Wyjaśnienie

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

Narzędzia Bash + GNU, 25

fold -`dc -e${#1}vp`<<<$1

Nie różni się tak bardzo od odpowiedzi @ Doorknob , ale dcjest krótszym sposobem uzyskania pierwiastka kwadratowego.


3

𝔼𝕊𝕄𝕚𝕟, 11 znaków / 14 bajtów

ѨĊ(ï,√ ïꝈ⸩Ė⬮

Try it here (ES6 browsers only).

Wygenerowano przy użyciu tego kodu (uruchom w konsoli przeglądarki tłumacza):

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

3

Brainfuck, 83 bajty

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

Wypróbuj online!

Wykorzystuje to ten sam pomysł, co Dziurawej Zakonnicy odpowiedzi . Poprosił o grę w golfa na czacie, a następnie zasugerował, żebym dodał to jako nową odpowiedź. (Właściwie to, co napisałem na czacie, było 84-bajtowym rozwiązaniem bardzo podobnym do tego.)

Dla porównania, dodatek > na początku potrzebna jest implementacja „pieprzenia mózgu”, która nie pozwala na ujemne adresy pamięci.

Zgodnie z oczekiwaniami, znajdzie to długość danych wejściowych, następnie pierwiastek kwadratowy, a następnie odpowiednio wydrukuje linie. Wykorzystuje idealne kwadraty będące częściowymi sumami 1 + 3 + 5 ....


3

Brain-Flak , 110 96 bajtów

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

Wypróbuj online!

Drugie rozwiązanie, 96 bajtów

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

Wypróbuj online!

Wyjaśnienie

Tutaj wyjaśniam pierwsze rozwiązanie, oba mają tę samą długość, ale podoba mi się pierwsze, ponieważ jest fajniejsze i wykorzystuje kilka fajnych sztuczek.

Najważniejszą częścią kodu jest zmodyfikowana funkcja pierwiastka kwadratowego, którą napisałem jakiś czas temu. Pierwotna wersja była

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

I to działa, ale tak naprawdę chcemy dwóch kopii ujemnego pierwiastka kwadratowego. Czemu? Potrzebujemy dwóch kopii, ponieważ zapętlamy ciąg znaków na dwóch poziomach, jeden do tworzenia linii, a drugi do zliczania liczby linii. Chcemy, aby była ujemna, ponieważ pętla z negatywami jest tańsza.

Aby uczynić to negatywnym, poruszamy się [...]tak, aby wyglądało tak

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

Aby wykonać dwie kopie, zmieniamy się, gdy pojawiają się trzaski

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

Teraz, gdy mamy ten bit, możemy go połączyć z wysokością stosu, aby uzyskać pierwszą potrzebną część kodu.

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

Przechodzimy do offstacka, ponieważ nasza funkcja pierwiastka kwadratowego potrzebuje dwóch wolnych zer do obliczeń i ponieważ sprawia, że ​​rzeczy są nieco tańsze w przyszłości pod względem przełączania stosu.

Teraz konstruujemy główną pętlę

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

Jest to całkiem proste, za każdym razem n razy zapętlamy n przedmiotów i zamykamy je nową linią (ASCII 10).

Po zakończeniu pętli musimy odwrócić kolejność naszych wyników, więc po prostu wybieramy standardową konstrukcję odwróconą.

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



2

Perl 6 , 38 bajtów

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

Wyjaśnienie:

$_ = 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 bajtów

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

Ponieważ zmienne są zepsute, musiałbym przekazywać zmienne poprzez aplikację lambda.

Okazuje się również, że nawet gdyby zmienne działały, użycie aplikacji lambda byłoby jeszcze krótsze.

Stosowanie

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 bajtów

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

Spróbuj! (Ideone)

Wypróbowałem inne podejście z funkcją zwracającą wynik jako ciąg znaków, ale po prostu muszę zadeklarować ciąg, a instrukcja return jest już droższa (liczenie bajtów) niż instrukcja print.

Uwielbiam gadatliwość Javy ... :)


Dobra odpowiedź +1. Można go golf o 1 bajt za pomocą i=0, i<ki s.substring(i*k,i++*k+k)zamiast i=-1, ++i<k, s.substring(i*k,i*k+k). Ponadto zwykle używamy tylko Java 7zamiast Java 1.7, ale dobrze, że go dodałeś, wiele osób zapomina o tym.
Kevin Cruijssen

2

R , 59 54 bajtów

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

Wypróbuj online!

Drukuje z końcowym znakiem nowej linii. Zaskakująco krótki, biorąc pod uwagę, jak źle R radzi sobie z łańcuchami.




Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.