Prostokąt tekstu

13

Twój program otrzymuje tekst jako dane wejściowe o długości co najmniej 8 znaków i zawsze składający się z parzystej liczby znaków. (nie trzeba oceniać poprawności danych wejściowych).

Twoim celem jest wyświetlenie tego tekstu jako prostokąta. Na przykład podane HelloWorldjako dane wejściowe, display

Hell
d  o
lroW

Zasady:

  • Tekst przesuwa się zgodnie z ruchem wskazówek zegara (dowolna pozycja początkowa)
  • Utworzy zamknięty prostokąt o szerokości boków 1 znaku.
  • Prostokąt będzie musiał obejmować jak najwięcej powierzchni w środku. (aby wykluczyć banalną odpowiedź dotyczącą wyświetlania tekstu w dwóch wierszach)
  • Żadne inne znaki nie są drukowane poza samym tekstem oraz niezbędnymi spacjami i przesunięciami wiersza.

Jako kod-golf wygrywa najkrótszy kod.

Zwycięzca zostaje wybrany nie wcześniej niż 10 dni po pierwszej ważnej odpowiedzi.

vsz
źródło

Odpowiedzi:

5

GolfScript, 56 53 40 38 znaków

1/..,4/):l<n@l>{)" "l*2>@(n@.,l-}do-1%

Możesz przetestować skrypt online .

Howard
źródło
7

Binarny PostScript 50, 113 ASCII

Wykorzystuje to wyjście graficzne. Hexdump programu używającego tokenów binarnych:

$ hexdump -C textRect_binary.ps 
00000000  74 5b 30 20 39 5b 74 92  62 34 92 36 92 38 92 10  |t[0 9[t.b4.6.8..|
00000010  32 92 19 5d 7b 92 2c 7b  32 92 19 7d 92 83 92 3e  |2..]{.,{2..}...>|
00000020  92 6e 7d 92 49 5d 39 20  39 92 6b 91 c7 39 92 8e  |.n}.I]9 9.k..9..|
00000030  92 c3                                             |..|
00000032

Pobierz, aby spróbować . Za pomocą Ghostscript tekst do renderowania można przekazać do programu w następujący sposób:

gs -st=helloworld textRect_binary.ps 

Wyjście graficzne wygląda następująco:

renderowany wynik

Ten sam kod używający tokenów ASCII wygląda następująco:

t[0 9[t length
4 div dup
ceiling
2 copy]{cvi{2 copy}repeat
exch neg}forall]9 9 moveto/Courier 9 selectfont
xyshow

Strategia polega xyshowna określeniu, w którym miejscu poruszamy się po pokazaniu każdej postaci przed pokazaniem następnej postaci. Zaczynamy w lewym dolnym rogu, poruszając się zgodnie z ruchem wskazówek zegara, tj. Najpierw w górę, potem w prawo, potem w dół, a następnie w lewo. Zawsze poruszamy 9 jednostek, więc najpierw mamy względny ruch 0 9, a 9 0potem 0 -9potem -9 0. Możemy przejść od jednej pary tych liczb do następnej z sekwencją exch neg.

Musimy zbudować tablicę dla xyshowtych par liczb, po jednej dla każdej postaci. Oznacza to, że jeśli mamy helloworldprzykładowy ciąg znaków, który ma 10 znaków, chcemy iść dwa razy w górę, następnie trzy razy w prawo, następnie dwa razy w dół i trzy razy w lewo. Otrzymujemy te wartości (dwa i trzy) dzieląc długość struny przez 8, raz zaokrąglając do podłogi, raz do sufitu.

Tak więc kopiujemy 0 9dwa razy, a następnie przełączamy się na względne współrzędne x / y za pomocą exch neg, kopiujemy te trzy razy i tak dalej.

Ten skomentowany kod pokazuje, co dzieje się na stosie:

t[0 9                % t [ 0 9
[t length            % t [ 0 9 [ length
4 div dup            % t [ 0 9 [ length/4 length/4
ceiling              % t [ 0 9 [ length/4=height width
2 copy]              % t [ 0 9 [height width height width]
{%forall             % t [ 0 9 ... x y height_or_width
  cvi                % t [ 0 9 ... x y height_or_width_integer
  {2 copy}           % t [ 0 9 ... x y height_or_width_integer {2 copy}
  repeat             % t [ 0 9 ... x y .. x y
  exch neg           % t [ 0 9 ... x y .. y -x
}forall]             % t [0 9 ... -9 0]
9 9 moveto/Courier 9 selectfont
xyshow
Thomas W.
źródło
+1 święty Bajeezus. Mam poważne braki w znajomości poziomu 2 i wyższych.
luser droog
Masz na myśli xyshow? Z przyjemnością przedstawiam Ci ten - jakiś czas temu przedstawiłeś mnie kshow, czego tak naprawdę nie byłem świadomy ;-).
Thomas W.,
@luserdroog: BTW: Jestem całkiem dumny, że obecny wpis GolfScript ma ponad 10% więcej znaków niż mój wpis binarny, ale wkurza mnie to, że moja wersja ASCII jest jedną postacią od remisu z Ruby (właściwie nawet trzy, ponieważ kod Ruby może być dalej odtwarzany w golfa). Czy masz jakieś pomysły na dalszą optymalizację?
Thomas W.,
@ThomasW. Teraz mój wpis w GolfScript jest o 24% krótszy niż twój plik binarny ;-) I nadal myślę, że nadal istnieje szansa, aby go jeszcze bardziej skrócić o jeden lub dwa znaki.
Howard
@Howard: Argh !!! Czy ktoś może kiedykolwiek pokonać GolfScript?
Thomas W.
7

Ruby 112 100

Jestem nowy w Ruby i to jest mój pierwszy golf. Korzystałem z implementacji perla memowe i próbowałem stworzyć Ruby. Jest to 112 100 znaków i zakłada, że ​​przypisujesz ciąg do x. Nie mogę się doczekać, aby zobaczyć innych.

l=x.size
puts x[0..w=l/2-h=l/4]
1.upto(h-1){|i|puts x[-i]+' '*(w-1)+x[w+i]}
puts x[w+h..l-h].reverse

Edytowane w celu wdrożenia sugestii. Myślę, że teraz ma 100 znaków. Dzięki chłopaki!

jzig
źródło
Ładny! Możesz zapisać dwa znaki w 5. linii (usuń spacje).
Thomas W.
Lubię to. Dzięki. Wygląda dobrze, że ciągi Ruby są dostępne jak tablica, musiałem zbudować jeden sam. :)
memowe
Można wymienić x.lengthz x.size(Zapisuje 2 znaki)
Knut
1
I jeszcze 8 za pomocą puts x[0..w=l/2-h=l/4].
Howard
5

Perl (124 118 109 + 3 = 112)

To dawniej było dość proste. Wszystkie opcje wiersza poleceń zostały policzone jako 1 znak.

-nlE
$w=(@s=split//)/2-($h=int@s/4);say@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h]

Przykład:

$ perl -nlE '$w=(@s=split//)/2-($h=int@s/4);say@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h]'
abcdefghijklmnopqrstuvwxyz
abcdefgh
z      i
y      j
x      k
w      l
v      m
utsrqpon
memowe
źródło
Można to spakować: (1) (@s-$h*2)/2 == @s/2-$h(2) $wmożna przedstawić jako $w=(@s=split//)/2-($h=int@s/4);, oszczędzając w ten sposób dwa średniki
am
Zaktualizowałem kod.
memowe
Kolejne interesujące rzeczy: (1) spacja jest domyślną wartością zmiennej interpolacji tablic var - $"oszczędza 1 znak. (2) - $w+$h == @s/2oszczędza 1 znak. (3) Jeśli $wjest o jeden mniejszy, możemy uprościć $"x($w-1). W tym $_celu należy zwiększyć o 1. Zapisuje jak 3 znaki. (4) Końcowy średnik to überflüssig, oszczędza 1 znak. Prowadzi to do fragmentu kodu say@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h](z kilkoma +dla zabawy, więc nie ma już ani jednej spacji).
amon
Doskonałe golfizacja, @amon, czy mógłbyś go edytować w moim poście? W ten sposób świat może zobaczyć, kto to zrobił. :)
memowe
5

Brainfuck - 194 187

+>,[>+[>+<-],]
>-->++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>[-]>[<<+<<+>>>>-]<<<<
[[<]>+[>]<-]<[<]>-
[>.[-]<[>+<-]>-]>[>]
++++++++++.<.[-]
>[>+++>>+<<<-]>++>--[<.>-]<<<<[<]>.[-]>[>]>>>>.
<<<<<[.<]
captncraig
źródło
Niezła próba, ale to nie działa. Dolna linia jest w złym kierunku, niezgodnym z regułą 1, i ma tylko stałą wysokość, niezgodną z regułą 3.
vsz
Nie jestem pewien, dlaczego przerzuciłem ostatni rząd. Pisząc to miałem całkowicie na myśli. Poprawka faktycznie zapisuje 7 poleceń. Rozmawiałem na rzeczy o stałej wysokości, ale nie jest to trywialna sprawa z 2 liniami, o której mówiłeś. Może poprawię to w przyszłości.
captncraig
4

Mathematica 156 199 344

Edycja : Jest to główne przepisanie wcześniejszego kodu. Działa zasadniczo tak samo, ale teraz pobiera jako ciąg ciąg znaków o długości <120 znaków i automatycznie dostosowuje rozmiar kwadratu.

Nadal może być nieco golfa, ale nie sprowadza się do rozmiarów wcześniejszych i bardziej buggerowych wersji.

f@s_ := ({a, t, w, q} = {Automatic, Text, Quotient[StringLength@s, 2],
 Quotient[StringLength[s], 4] + 1};z = StringSplit[StringInsert[s <> ConstantArray[" ", 0],
 "*", {q, 2 q, 3 q}], "*"];
Graphics[{t[z[[1]], {0, q}],t[z[[2]], {q, 0}, a, {0, -1}],t[z[[3]], {0, -q}, a, {-1, 0}],
t[z[[4]], {-q, 0}, a, {0, 1}]},ImageSize -> 500,BaseStyle -> {FontFamily -> "Courier", 21},
PlotRange -> 34,ImagePadding -> 22])

Przykłady

f["Hello Code Golf World!"]
f["January, February, March,April, May, June, July"]
f["This text is normal, this goes downwards,this is upside-down, and this is upwards"]

pic1

pic2

pic3

DavidC
źródło
Hej, tablica ciągów? To naprawdę naginanie zasad, prawda?
Thomas W.
@ThomasW. Komentarze w odpowiedzi wskazują, że nie jest to ostateczne rozwiązanie.
kojiro
O, rozumiem! Zastanawiam się, czy powinienem podjąć wyzwanie i spróbować czegoś podobnego w PostScript ...
Thomas W.
Lubię teraz, jak to wygląda!
Thomas W.
@Thomas W.Dzięki. Ustawienie odpowiedniego formatu dla szerokiego zakresu długości łańcucha kosztuje dużo bajtów.
DavidC
2

Perl + Regeksy: 104 (101 + 3)

(liczenie kodu + przełączniki)

Oto rozwiązanie wykorzystujące ładne Regexy i trochę Perla:

perl -plE'$w=($l=length)/2-($h=int$l/4);s/..{$w}\K.*/"\n".reverse$&/e;$"x=--$w;s/.\K(.*)(.)$/$"$2\n$1/while--$h'

Działa to poprawnie tylko na jednej linii wejściowej.

Zainspirowany memowe, ale zasadniczo bez żadnych tablic.

amon
źródło
Przepraszam za głupie pytanie: jak mogę to wypróbować? Wklejam twój kod do linii poleceń, a następnie wpisz coś, naciśnij klawisz Enter i coś wyjdzie. Ale to nie jest pudełko. Co ja robię źle?
Thomas W.
@ThomasW. Wydaje mi się, że to działa dla dowolnej liczby znaków. Powyższy kod gwarantuje działanie w wersji bash i perl 5.12+. Dane wejściowe są akceptowane przez STDIN i tylko pierwszy wiersz jest przetwarzany poprawnie. Nie wiem, jak poprawnie podać kod dla cmd.exe.
amon
1
Ach, to chyba mój błąd. Prawdopodobnie użyłem ciągu o nieparzystej długości. Działa to:echo thisworksgreat | perl -plE'$w=($l=length)/2-($h=int$l/4);s/..{$w}\K.*/"\n".reverse$&/e;$"x=--$w;s/.\K(.*)(.)$/$"$2\n$1/while--$h'
Thomas W.
2

PostScript (106)

Jest to inspirowane rozwiązaniem Mathematica dla kolesia .

0{= =
4 add dup
t length mod 4
lt{-90 rotate}if}0[0 3 -3 0 9 9]concat
0 moveto/Courier 5 selectfont
t kshow

Z Ghostscript nazwij to tak

gs -st=hello! boxtext.ps

Daje wydajność jak.

Hello_Code_Golf_World!

Styczeń luty marzec kwiecień maj czerwiec lipiec

Służy kshowdo wyświetlania glifów jeden po drugim. Po pokazaniu wystarczającej liczby glifów dla jednej strony wszystko jest obracane o -90 stopni, zanim przejdzie do pozostałych glifów.

Aby wiedzieć, kiedy z boku pokazano wystarczającą liczbę glifów, zwiększamy licznik o 4 za każdym razem, gdy wyświetlany jest glif. Jeśli wartość licznika modulo długość łańcucha jest mniejsza niż 4, to wiemy, że musimy obrócić:

char  counter  mod 6  compared to 4
 h       4       4          =
 e       8       2          <   => rotate
 l      12       0          <   => rotate
 l      16       4          =
 o      20       2          <   => rotate
 !      24       0          <   => rotate

wprowadź opis zdjęcia tutaj

Skomentowany i niezagrzebany kod źródłowy:

0                      % n
{%kshow                % n char1 char2
  = =                  % n
  4 add dup            % n' n'
  t length mod         % n' (n' mod t_length)
  4 lt                 % n' bool
  {-90 rotate}if       % n'
}                      % n kshowProc
% First 0 for moveto. We add it here to take 
% advantage of the surrounding self delimiting tokens.
0                      % n kshowProc 0
% We change the graphics state so that the drawn
% text is at a nice size and not off screen.
[0 3 -3 0 9 9]concat   % n kshowProc 0
0                      % n kshowProc 0 0
moveto                 % n kshowProc
/Courier 5 selectfont  % n kshowProc
t                      % n kshowProc text
kshow                  % n
Thomas W.
źródło
1

Python 2.x: 137

Nie znam się na golfie i jestem pewien, że można to poprawić…

def s(t):c=len(t);w=1+c/4;h=(c-w-w)/2;u=w+h;n='\n';print t[:w]+n+n.join(map(((w-2)*' ').join,zip(t[:w+u-1:-1],t[w:u])))+n+t[w+u-1:u-1:-1]

Kod testowania wizualnego:

from itertools import chain
from string import letters
for i in range(8,101,2):
    t = ''.join(chain(letters))[:i]
    print '%d: %s' % (i, t)
    s(t)
    print '-----'

Coś interesującego: To rozwiązanie zależy od matematyki liczb całkowitych. Jeśli tylko wykonasz matematykę symbolicznie, znajdziesz to h=(c-w-w)/2 => h=w-2, ale jeśli podmienisz ten wynik, w każdym innym wyniku nie będzie dwóch znaków w lewym dolnym rogu.

kojiro
źródło
1

K, 84

{-1'(*r;((|r 3),\:(w-2)#" "),'r 1;|(r:(0,+\(w;h;w;h:_(l-2*w:-_-(1+(l:#x)%4))%2))_x)2);}

.

k){-1'(*r;((|r 3),\:(w-2)#" "),'r 1;|(r:(0,+\(w;h;w;h:_(l-2*w:-_-(1+(l:#x)%4))%2))_x)2);}"HelloWorld"
Hell
d  o
lroW

k){-1'(*r;((|r 3),\:(w-2)#" "),'r 1;|(r:(0,+\(w;h;w;h:_(l-2*w:-_-(1+(l:#x)%4))%2))_x)2);}"Hellooooooooooooooo Worlddddd!"
Hellooooo
!       o
d       o
d       o
d       o
d       o
d       o
lroW oooo
tartin
źródło
1

Scala (135)

Poniższy fragment kodu zakłada, że xzawiera ciąg do sformatowania i należy go wkleić w Scala REPL:

val (h,w)=((x.size+3)/4,println(_:Any));val s=x.grouped(h)toSeq;w(s(0));for((l,r)<-s(1)zip(s(3)reverse))w(r+" "*(h-2)+l);w(s(2)reverse)

Jeśli nie masz zainstalowanej Scali, możesz szybko to sprawdzić za pomocą tego internetowego interpretera Scala: http://www.simplyscala.com/ . Wystarczy wkleić następujący tekst i naciśnij klawisz oceny:

val x="HelloWorld"
val (h,w)=((x.size+3)/4,println(_:Any));val s=x.grouped(h)toSeq;w(s(0));for((l,r)<-s(1)zip(s(3)reverse))w(r+" "*(h-2)+l);w(s(2)reverse)
Régis Jean-Gilles
źródło
1

Python 3 (120)

s=input()
n=len(s)
h=n//4
q=(n+2)//4-1
p=print
p(s[:q+2])
for i in range(1,h):p(s[n-i]+' '*q+s[q+1+i])
p(s[n-h:q+h:-1])

Test

Wejście:

abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

wynik:

abcdefghijklmn
z            o
y            p
x            q
w            r
v            s
u            t
t            u
s            v
r            w
q            x
p            y
o            z
nmlkjihgfedcba
Promień
źródło
0

PHP (149)

Tekst do wydrukowania powinien być w zmiennej o nazwie $x.

@$s=substr;echo$s($x,-$w=($l=strlen($x)/2)-$h=$i=$l-2>>1).'
';while($i--)echo$x[$l+$i].str_repeat(' ',$w-2).$x[$h-$i-1].'
';echo$s(strrev($x),$l,$w);
Jonathan
źródło
0

Python2.7 (99)

t=''.join(raw_input().split())
u=len(t)/2-1
print t[:u]+"\n"+t[-1]+" "*(u-2)+t[u]+"\n"+t[-2:u:-1]

Edycja: najwyraźniej narusza zasadę obejmowania maksymalnego obszaru wewnątrz.

sidi
źródło
0

JAVA - 320

public class A{
public static void main(String[] a){
String s=a[0];
int l=s.length(),h=l/2,f=h-1,i=0;       
for(i=0;i<f;i++)
System.out.print(s.charAt(i));
System.out.print("\n"+s.charAt(l-1));
for(i=0;i<f-2;i++)
System.out.print(" ");
System.out.println(s.charAt(h-1));
for(i=l-2;i>h-1;i--)
System.out.print(s.charAt(i));}}

Uwaga: - Dane wejściowe są pobierane z wiersza poleceń

Wejście: - HelloWorld

Wynik : -

Hell
d  o
lroW

Dane wejściowe: - abcdefghijklmnopqrstuvwxyz

Wynik : -

abcdefghijkl
z          m
yxwvutsrqpon
Vivekanand SV
źródło
Przeczytaj uważnie zasady, szczególnie nr. 3.
vsz