Metin dikdörtgeni


14

Programınız, en az 8 karakter uzunluğunda ve her zaman çift sayıda karakterden oluşan bir girdi olarak metin alır. (girişin doğruluğunu değerlendirmeye gerek yoktur).

Amacınız bu metni bir dikdörtgen olarak görüntülemek. Örneğin, HelloWorldgirdi olarak verilen ekran

Hell
d  o
lroW

Kurallar:

  • Metin saat yönünde döner (başlangıç ​​konumu istediğiniz gibi)
  • Kenarları 1 karakter genişliğinde kapalı bir dikdörtgen oluşturacaktır.
  • Dikdörtgenin içindeki en çok alanı kapsaması gerekir. (metni iki satırda göstermenin önemsiz cevabını dışlamak için)
  • Metnin kendisinin ve gerekli dolgu boşluklarının ve satır beslemelerinin yanında başka hiçbir karakter yazdırılmaz.

Kod golfü olarak en kısa kod kazanır.

Kazanan ilk geçerli cevaptan en geç 10 gün sonra seçilir.

Yanıtlar:



7

PostScript 50 ikili, 113 ASCII

Bu grafiksel çıktı kullanır. İkili simgeleri kullanarak programın onaltılık dökümü:

$ 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

Denemek için indirin . Ghostscript kullanılarak oluşturulacak metin programa aşağıdaki gibi aktarılabilir:

gs -st=helloworld textRect_binary.ps 

Grafiksel çıktı şöyle görünür:

render çıktı

ASCII jetonlarını kullanan aynı kod şöyle görünür:

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

Strateji, xyshowher karakteri gösterdikten sonra bir sonraki karakteri göstermeden önce nereye hareket ettiğimizi tanımlamak için kullanmaktır . Sol alt köşeden başlıyoruz, saat yönünde hareket ediyoruz, yani önce yukarı, sonra sağa, sonra aşağı sonra sola. Her zaman 9 birim hareket ediyoruz, bu yüzden önce göreceli bir hareketimiz var 0 9, sonra 9 0, sonra 0 -9, o zaman -9 0. Bu sayıların bir çiftinden sekansla diğerine geçebiliriz exch neg.

Her xyshowsayı için bir çift olmak üzere bu sayı çiftlerini barındıran bir dizi oluşturmamız gerekiyor . Bu helloworld, 10 karakterlik bir örnek dizgimiz varsa, iki kez yukarı, sonra üç kez, sonra iki kez aşağı ve üç kez gitmek istiyoruz demektir. Bu değerleri (iki ve üç) dize uzunluğunu zemine yuvarlandıktan sonra bir kez tavana 8'e bölerek elde ederiz.

Böylece, 0 9iki kez kopyalıyoruz , ardından kullanarak x / y koordinatlarına exch neggeçiyoruz, bunları üç kez kopyalıyoruz vb.

Yorum yapılan bu kod yığında ne olduğunu gösterir:

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

+1 kutsal bajeezus. Seviye-2 ve ötesi bilgimde ciddi şekilde eksikim.
luser droog

Yani xyshow? Sizi kshowbununla tanıştırmaktan mutluluk duyuyorum - bir süre önce beni tanıttınız , ki ;-) 'nin gerçekten farkında değildim.
Thomas W.

@luserdroog: BTW: Mevcut GolfScript girişinin ikili girişime göre% 10'dan fazla karaktere sahip olması beni gururlandırıyor, ancak ASCII sürümümün Ruby'li bir çekilişten bir karakter uzakta olduğunu söylüyor (aslında, hatta üç, çünkü Ruby kodu daha da golf edilebilir). Daha fazla optimizasyon için fikriniz var mı?
Thomas W.

@ThomasW. Şimdi GolfScript girişim ikili kodunuzdan% 24 daha kısa ;-) Hala hala bir veya iki karakter daha kısaltma şansı olduğunu düşünüyorum.
Howard

@Howard: Argh !!! Herkes GolfScript'i yenebilir mi?
Thomas W.

7

Yakut 112 100

Ruby için yeniyim ve bu benim ilk kod golf. Memowe'un perl uygulaması üzerine çizim yaptım ve Ruby versiyonunu yapmaya çalıştım. Bu 112100 karakterdir ve x'e bir dize atadığınızı varsayar. Başkalarını görmek için sabırsızlanıyoruz.

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

Önerileri uygulamak için düzenlendi. Sanırım şimdi 100 karakter. Teşekkürler beyler!


Güzel! Beşinci satıra iki karakter kaydedebilirsiniz (boşlukları kaldırın).
Thomas W.19

Bunu sevdim. Teşekkürler. Ruby dizelerine bir dizi gibi erişilebileceği iyi görünüyor, kendi başıma bir tane oluşturmak zorunda kaldım. :)
memowe

Sen (2 karakter kaydeder) x.lengthile değiştirebilirsinizx.size
knut

1
Ve 8 tane daha kullanarak puts x[0..w=l/2-h=l/4].
Howard

5

Perl (124 118 109 + 3 = 112)

Bu eskiden oldukça basitti. Tüm komut satırı seçeneklerini her biri 1 karakter olarak sayılır.

-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]

Misal:

$ 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

Bu sıkıştırılmış olabilir: (1) (@s-$h*2)/2 == @s/2-$h(2) $wolarak temsil edilebilir $w=(@s=split//)/2-($h=int@s/4);, böylece iki noktalı tasarruf
amon

Kod güncellendi.
memowe

Diğer ilginç şeyler: (1) boşluk, dizi enterpolasyonu var $"değerlerini 1 varsayılan değerdir . (2) $w+$h == @s/2- 1 karakter kaydeder. (3) $wBirer birer küçükse, basitleştirebiliriz $"x($w-1). Bunun için $_1 artırılmalıdır. 3 karakter gibi tasarruf eder. (4) Son noktalı virgül überflüssig, 1 karakter kazandırır. Bu, kod parçasına yol açar say@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h]( +eğlence için birkaçıyla , bu yüzden tek bir alan kalmaz).
amon

Mükemmel golfifikasyon, @ amon, lütfen yazımda düzenler misiniz? Böylece dünya bunu kimin yaptığını görebilir. :)
memowe

5

Brainfuck - 194 187

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

Güzel deneyin, ama çalışmıyor. Alt satır, kural 1'in aksine yanlış yönde ve kural 3'ün aksine yalnızca sabit bir yüksekliğe sahip.
vsz

Son satırı neden çevirdiğimden emin değilim. Ben yazarken tamamen doğru şekilde aklıma geldi. Düzeltme aslında 7 komut kaydeder. Sabit yükseklikte bir şey yaptım, ama bahsettiğiniz önemsiz, 2 satırlık durum değil. Belki gelecekte daha iyi olurum.
captncraig

4

Mathematica 156 199 344

Edit : Bu önceki kodun büyük bir yeniden yazma. Aslında aynı şekilde çalışır, ancak şimdi giriş olarak <120 karakter uzunluğunda bir dize alır ve kareyi otomatik olarak boyutlandırır.

Hala biraz golf olabilir ama önceki ve buggier sürümlerinin boyutuna inmeyecek.

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])

Örnekler

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


Hey, bir dizi dize mi? Bu gerçekten kuralları büküyor, değil mi?
Thomas W.

@ThomasW. Cevaptaki yorumlar bunun nihai bir çözüm olmadığını gösteriyor.
Ocak'ta kojiro

Ah, anlıyorum! Ben meydan okuma ve PostScript benzer bir şey denemek gerekir merak ediyorum
Thomas W.

Şimdi nasıl göründüğünü seviyorum!
Thomas W.21

@Thomas W. Teşekkürler. Biçimin çok çeşitli dize uzunlukları için doğru görünmesini sağlamak çok bayttır.
DavidC

2

Perl + Regexes: 104 (101 + 3)

(sayım kodu + anahtarlar)

İşte güzel Regexes ve biraz Perl kullanarak bir çözüm:

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'

Bu yalnızca bir giriş hattında doğru şekilde çalışacaktır .

Memowe'den esinlenildi, ancak aslında diziler olmadan.


Aptalca soru için özür dilerim: Bunu nasıl deneyebilirim? Kodunuzu komut satırına yapıştırıyorum, sonra bir şeyler yazıyorum, enter tuşuna basın ve bir şey çıkıyor. Ama bu bir kutu değil. Neyi yanlış yapıyorum?
Thomas W.21

@ThomasW. Benim için çalışıyor, keyfi sayıda bile. Yukarıdaki kodun bash ve perl sürüm 5.12+ altında çalışması garanti edilir. Giriş STDIN ile kabul edilir ve sadece ilk satır doğru şekilde işlenir. Kod cmd.exe için doğru alıntı nasıl bilmiyorum.
amon

1
Ah, muhtemelen benim hatamdı. Muhtemelen garip uzunlukta bir dize kullandım. Bu çalışıyor: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)

Bu, dude'nin Mathematica çözümünden esinlenmiştir .

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

Ghostscript ile buna benzer

gs -st=hello! boxtext.ps

Gibi çıktılar üretir.

Hello_Code_Golf_World!

Ocak Şubat Mart Nisan Mayıs Haziran Temmuz

Bu kullanır kshowteker glifleri birini göstermek için. Bir taraf için yeterli glifler gösterildikten sonra, kalan gliflerle devam etmeden önce her şey -90 derece döndürülür.

Yanda yeterli glifin ne zaman gösterildiğini bilmek için, her glif gösterildiğinde bir sayacı 4 arttırırız. Sayaç değeri modulo dize uzunluğu 4'ten azsa, döndürmemiz gerektiğini biliyoruz:

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

resim açıklamasını buraya girin

Yorum yapılan ve golf edilmeyen kaynak kodu:

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

2

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])

Ölçek

giriş:

abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

çıktı:

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

1

Python 2.x: 137

Ben golf kod yeni ve bu geliştirilebilir eminim…

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]

Görsel test kodu:

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

İlgilenilen bir şey: Bu çözüm tamsayı matematiğe bağlıdır. Matematiği sembolik olarak yaparsanız, bunu görürsünüz h=(c-w-w)/2 => h=w-2, ancak bu sonucu değiştirirseniz, diğer tüm sonuçlarda iki sol alt karakter eksik olacaktır.


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

1

Scala (135)

Aşağıdaki snippet x, biçimlendirilecek dizeyi içerdiğini ve scala REPL'e yapıştırılması gerektiğini varsayar :

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)

Scala yüklü değilse, bu çevrimiçi Scala yorumlayıcısını kullanarak hızlı bir şekilde kontrol edebilirsiniz: http://www.simplyscala.com/ . Sadece aşağıdaki metin sonu basın değerlendirme yapıştırın:

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)

1

Kömür , 16 bayt

SθB÷⁺Lθ⁶¦⁴⊕÷Lθ⁴θ

Çevrimiçi deneyin (ayrıntılı) veya çevrimiçi deneyin (saf) .

Açıklama:

Girdi dizesini alın ve bir değişkende saklayın:

InputString(q);
Sθ

Bu dizedeki karakterleri kullanarak, genişliği olan bir kutu çizinL+64L4+1L

Box(IntDivide(Plus(Length(q),6),4), Incremented(IntDivide(Length(q),4)), q);
B÷⁺Lθ⁶¦⁴⊕÷Lθ⁴θ

1

05AB1E , 19 bayt

gD6+‚4÷TS+R4∍IŽ9¦SΛ

Bağlantı noktası cevabım .

Çevrimiçi deneyin.

Açıklama:

g              # Get the length of the (implicit) input-string
 D6+           # Duplicate it, and add 6 to this copy
              # Pair the two together
     4÷        # Integer-divide both by 4
       TS      # Push 10 as digit list: [1,0]
         +     # Add it to both values
          R    # Reverse the list
           4  # And extend it to size 4
I              # Push the input-string
Ž9¦            # Push compressed integer 2460
   S           # And convert it to a digit-list: [2,4,6,0]
Λ              # Use the Canvas builtin with these three values
               # (which is output immediately as result)

Neden Ž9¦olduğunu anlamak için bu 05AB1E ucuma bakın ( Büyük tamsayılar nasıl sıkıştırılır? Bölümü )2460 .

Canvas yerleşiği üç argüman alır:

  1. [L+64,L4+1,L+64,L4+1]
  2. Görüntülemek istediğimiz karakterler, giriş dizesi.
  3. Çizilecek yönler, yani [2,4,6,0]. Bu yol tarifleri ile eşleşir [→,↓,←,↑].

Canvas yerleşiminin daha ayrıntılı bir açıklaması için bu 05AB1E ipucuma bakın .


0

PHP (149)

Yazdırılacak metin adlı bir değişken olmalıdır $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);

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

Not: - Giriş komut satırından alınır

Giriş: - HelloWorld

Çıktı : -

Hell
d  o
lroW

Giriş: - abcdefghijklmnopqrstuvwxyz

Çıktı : -

abcdefghijkl
z          m
yxwvutsrqpon

Lütfen kuralları daha dikkatli okuyun, özellikle no. 3.
vsz

0

Python 2.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]

Düzenleme: Görünüşe göre içindeki maksimum alanı kapsayan kuralını ihlal ediyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.