Bir dizgeyi patlat


34

Herhangi bir dize verildiğinde, metnin her köşegen boyunca yukarı ve aşağı doğru gittiği bir üçgen şeklinde yazdırın. Örneğin, bir girdi "Hello World"çıktı olmalıdır:

                    d
                  l  
                r   d
              o   l  
            W   r   d
              o   l  
        o   W   r   d
      l       o   l  
    l   o   W   r   d
  e   l       o   l  
H   l   o   W   r   d
  e   l       o   l  
    l   o   W   r   d
      l       o   l  
        o   W   r   d
              o   l  
            W   r   d
              o   l  
                r   d
                  l  
                    d

Uygun formatı korumak için, bir satırdaki her karakter arasındaki boşluk en az 1 olmalıdır.


1
İpin boş olmadığını varsayabilir miyiz?
Bay Xcoder,

@ Mr.Xcoder Evet olabilir
machiavelli

1
Bir satırdaki her karakter arasındaki boşluk en az 1 olmalıdır : Bu H l o W r dgeçerli bir orta satır olduğu anlamına mı geliyor ? Örnekte, çünkü her satırda her karakterin arasında 3 boşluk var.
Emigna

1
@Emigna Sorunuzu yanlış anladım, özür dilerim. Evet, örneğiniz geçerli olurdu.
machiavelli

1
Önde gelen veya takip eden alanlara izin veriliyor mu?
Luis Mendo,

Yanıtlar:


19

Kömür , 10 7 bayt

↗ELθ✂θιUE¹

Çevrimiçi deneyin! Çevrimiçi deneyin! Bağlantılar, kodun ayrıntılı sürümüne yöneliktir. Açıklama:

    ↗       Print up and to the right
     ELθ✂θι All suffixes of the input, as a list down and to the right
    UE¹     Insert blank columns

UEKomutu ilk kez kullandım .


Kömürün buradaki ilk cevaplardan biri olacağını biliyordum .. Neredeyse kendimi başlatmak için cazip geliyordu, ancak zaman içinde bir çözümü bitirmek için onunla deneyimsiz olduğumu ve yine de dışarıda golf oynayacağımı ..;)
Kevin Cruijssen

6
@Emigna ... ama bu benim kullanma şansımdı UE...
Neil

6
@EriktheOutgolfer ... ama bu benim kullanma şansımdı UE..
Neil

1
@Neil -3 bayt! -3 güzel bir fedakarlık için! Kim hoş bir şey istemez ki -3?
Outgolfer Erik

4
@EriktheOutgolfer Söylemen gereken şey "05AB1E'nin seni yenmesine izin veremezsin, değil mi?"
Neil

12

05AB1E , 10 8 7 bayt

2 bayt kaydettiğiniz için Emigna'ya teşekkürler !

ðâƶ.cðζ

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!


Bu satıra göre Bir satırdaki her karakter arasındaki boşluk kaldırabileceğiniz en az 1 olmalıdır¶« . (ayrıca OP ile geçerliliği doğrulandı)
Emigna

@Emigna Teşekkürler! :)
Adnan,

Tio bağlantısını güncellemek isteyebilir :)
Bay Xcoder

@ Mr.Xcoder ninja'd
Adnan,

1
Zeki kullanımı âiçinde ðâyerine Sð«!
Outgolfer Erik,


8

C, 86 78 73 70 karakter

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

Çevrimiçi deneyin!

açıklama

Naive uygulama: iki döngü, yukarıdan aşağıya doğru, soldan sağa (99 bayt):

for(int j=1;j<n*2;j++){for(int i=0;i<n;i++)printf("%c ",(i+j)%2&&i+1>=abs(j-n)?s[i]:' ');puts("");}

Burada, puts () çıktıya \ n basar. Değişken bildirimlerini birleştirelim ve j ++ 'ı bir şeyle (94 bayt) birleştirelim:

for(int i,j=0;++j<n*2;){for(i=0;i<n;i++)printf("%c ",(i+j)%2&&i>=abs(j-n)?s[i]:' ');puts("");}

İyi. Değişken j, 0 ... 2n aralığına sahiptir; -n ... n olsun, bu matematiği kolaylaştırır. & & 'Nin sağındaki boole ifadesinin her zaman 0 veya 1 değerine sahip olduğuna dikkat edin. 91 bayt:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)printf("%c ",~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

Ve şimdi farkettik ki, fazladan bir alan basıyoruz. Ve evet, sadece tek bir sembol basmak için printf () 'ye ihtiyacımız yok. 86 bayt:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)putchar(~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

Daha iyi. Bu koşul i * i> = j * j i> = abs (j) ile aynı, ancak daha kısa olduğuna dikkat edin. Döngü artışı ifadesi için puts () öğesini hareket ettirelim. Ve tahmin et ne oldu? Aslında, i + j etrafındaki parantezlere ihtiyacımız yok. 78 bayt:

for(int i,j=-n;++j<n;puts(""))for(i=0;i<n;i++)putchar(i*i>=j*j&~i+j?s[i]:' '); 

Putchar () öğesinin yazdırdığı karakteri döndürdüğünü biliyor muydunuz? Sayıları denklik açısından test etmek için XOR kullanalım. Boşluğu ASCII koduyla değiştirelim, 32. Satır sonu karakter kodunun 13 olduğunu unutmayın. Son olarak: GCC / Clang'ın https://en.wikipedia.org/wiki/Elvis_operator'i desteklediğini biliyor muydunuz ? 73 bayt:

for(int i,j=-n;++j<n;)for(i=0;putchar(i*i>=j*j&~i+j?s[i]?:13:32)^13;i++);

Sonunda ne oldu? Döngüler için iki kişiye ihtiyacımız yok. Çirkin ~ i + j'yi sadece ij ile değiştirebiliriz. 70 bayt:

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

Gelecek iş: döngü yönünü değiştir? Doğru yapılırsa, bu bazı baytları kurtarabilir.


5

SOGL V0.12 , 13 10 9 bayt

ēI*@∑}¹╚H

Bu, az önce eklediğim ancak bir süre önce belgelendirilen bir özelliği kullanıyor .

Burada dene!
Bu bağlantıya ,, bu yığındaki girdiyi beklediği ve {eklediği için eklenir çünkü aksi halde ,döngüde her seferinde yürütülür.

implicitly start loop over POP
ē            increase the variable E, on first push which will be 0
 I           increase by 1
  *          multiply the current character that many times
   @∑        join with spaces
     }     end loop
      ¹    wrap everything on stack in an array
       ╚   center vertically
        H  rotate counter-clockwise


3

Gaia , 16 bayt

$:ċ⟪×$§×⟫†€|$¦tụ

Çevrimiçi deneyin!

açıklama

$                 Split into list of chars
 :ċ               Push [1 .. len(input)]
   ⟪×$§×⟫†        Apply this block to corresponding elements of the two lists:
    ×              Repetition
     $             Split into chars
      §×           Join with spaces
          €|      Centre align the rows
            $¦    Split each line into chars
              t   Transpose
               ụ  Join each row with spaces, then join the rows together with newlines




3

Java, 292 bayt (özür dilerim)

public class D{
public static void main(String[]r){
String s=r[0];int L=s.length(),n=L*2-1,x=L-1,d=-1,i,j;boolean a=false,o=L%2==1;
for(i=0;i<n;i++){
for(j=0;j<L;j++)System.out.print(j<x||a&&j%2==(o?0:1)||!a&&j%2==(o?1:0)?' ':s.charAt(j));
System.out.println();
x+=d;if(x<0){x=0;d=1;}a=!a;}}}

1
Yeni hatları kaldırabilirsiniz, aksi takdirde bu oldukça golf gibi görünüyor!
Zacharý

1
Sen golf daha yapabilirsiniz: 1. boolean a=1<0,o=L%2>0;. Eğer ihtiyacınız yoksa 2. iBu döngü kullanın: for(i=0;i++<n;). 3. Bundan kurtulabilirsin o: j%2<L%2o zaman j%2>L%2. 4. dKapak olarak kullanmak çok fazla karakter alır: sadece yapın j<(x<0?-x:x). 5. Gerekenden çok daha fazla değişkeniniz var. 6. Tam bir programa ihtiyacınız yoktur: bir lambda veya yöntem yeterlidir. - Bir golfed Java örneği istiyorsanız kontrol cevabımı .
Olivier Grégoire


3

Java (OpenJDK 8) , 116 bayt

s->{for(int l=s.length(),i=-l;++i<l;)System.out.printf("%"+l+"s%n",s.substring(i<0?-i:i).replaceAll("(.).","$1 "));}

Çevrimiçi deneyin!

açıklama

s->{                                // Consumer<String> lambda
 for(int l=s.length(),i=-l;++i<l;)  // For each length between l and 1 and back to l, 
  System.out.printf("%"+l+"s%n",    // Print with align to right
    s.substring(i<0?-i:i)           // skip the first |i| characters
     .replaceAll("(.).","$1 ")      // replace every even-positioned character with a space.
   );
}


3

Haskell , 140 137 bayt

(m#n)s=(\(i,x)->' ':(last$"  ":[x:" "|rem i 2==m&&i>n]))=<<zip[0..]s
g s=((++)=<<reverse.tail)$id=<<[[(0#n)s,(1#n)s]|n<-[-1,1..length s]]

Çevrimiçi deneyin!

Challenger5'e 3 byte kazandı

Bunun optimal olduğunu sanmıyorum ...

f satırlardan birini üretir (m = 0 veya 1, satır numarasının modüloudur, satır numarasıdır n)

g "tek" ve "çift" satırlarını birbirine bağlar ve sonuca kendi başına bir yansıtma ekler.


Bir önek işlevi yerine bir ek işlevi folarak tanımlayarak baytları kaydedebilirsiniz (m#n)s=....
Esolanging Fruit



2

Mathematica 105 Bayt

(c=Characters@#;l=Length@c;StringRiffle@Table[If[Abs[j-l]<i&&EvenQ[j+i],c[[i]]," "],{j,1,2l+1},{i,1,l}])&

Belki bir ya da iki baytı tıraş edebilirim, ama karakter Mathematica'da dizelerle başa çıkma yükünü hesaba katarsa, bu gibi rekabetçi olmayan basit zorluklar ortaya çıkar.


2

J, 54 bayt

[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]

Çevrimiçi deneyin!(TIO'daki çıkışın yeni bir satırı ve üç boşluğu olduğunu unutmayın, ancak bu işlev çağrısından değil - muhtemelen J yorumlayıcısının otomatik olarak yaptığı şeydir).

Bunun çözülmesi için genel fikrin doğru olduğunu düşünüyorum, ancak büyük olasılıkla alt bytecount'a ekleyen, muhtemelen en iyi şekilde yaptığım küçük şeyler var.

Önceki değişkenler

55 bayt

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]

56 bayt

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]

açıklama

Bu birkaç fonksiyona bölünecektir. Ayrıca, açıklamanın ikinci bölümleriyle o kadar ayrıntılı değildim, bu nedenle belirli bir bölüm için daha iyi bir açıklama istiyorsanız ve bunu düzenleyebildiğimde bana bildirin.

dup   =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad   =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
  • dup Her karakteri dizgideki indeksi (artı bir) kadar çoğaltır
  • space her karakterin arasına boşluk ekler
  • pad karakterleri doğru miktarda boşlukla doldurur
  • trans Elde edilen matrisi dönüştürür

Örnek arama:

   trans pad space dup 'abc'
  c
 b 
a c
 b 
  c

Dup

>:@i.@# <@#"0 ]
>:@i.@#         Indices of each character plus one
      #          Length of the string
   i.            Range [0,length)
>:               Add one
        <@#"0 ] Duplicate each character as many times as it index (plus one)
           "0   For each
          #   ]  Copy the character
>:@i.@#           as many times as it index
        <        Box the result

Sonuçlar, J'nin uçları boşluklarla doldurmasını engellemek için kutulanmıştır (çünkü düzensiz uzunluktalar).

Örnek arama:

   dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘

uzay

(,' '&,)/&.>
         &.>  For each boxed element
(,' '&,)/      Insert spaces between each

Örnek arama:

   space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘

ped

|.@i.@# (>@],~' '#~[)"_1 ]
        (>@],~' '#~[)      Pad the right arg with spaces given by the left arg
|.@i.@#                    Indices in reverse order
   i. #                     Range [0,length)
|.                          Reverse

Temel olarak, ilk elemanı uzunluk - 1 boşluk, ikincisi uzunluk - 2, vb. İle doldurun.

Örnek arama:

   pad space dup 'abc'
  a  
 b b 
c c c

Transpoze

Bu sadece |:bir matrisin transpozitini alan yerleşik fonksiyondur .


1
Benzer bir yaklaşım kullandım ama bokstan kaçındım. 45 bayt: |:@(-@i.@-@#|."0 1((,@,.~' '#~#)@$"0~1+i.@#)). elbette daha fazla golf oynayabilirdi. Bu bölüm -@i.@-@#muhtemelen düşük asılı meyvelerden oluşuyor, büyük ihtimalle
Jonah

@Jonah Cevabınızın nasıl çalıştığını hızlı bir şekilde çözemiyorum, bu yüzden cevabımın bir açıklamasını da eklemek istediğim gibi, eğer göndermek isterseniz size göndermenizi bırakacağım. Sanırım şu an J benim için sadece yazı dilidir.
cole,

hızlı bir şekilde deşifre etmek için yararlıdır: f=. <some tacit expression>daha sonra 5!:2 <'f'kutulu bir görselleştirme 5!:4 <'f'verir ve bir ağaç görselleştirme verir. Benim durumumda, $"0~1+i.@#önce biraz sicimle koşmayı deneyin , sonra her şeyi sağa doğru çalıştırın |."0 1, sonra şunu anlayın |."0 1ve sola doğru olan her şey, son transpozisyonu kaydedin, sadece gerekli rotasyonları yapıyor.
Jonah

1
oh cevabınızı güncellemenizi beklemiyordum. daha çok "hey, bunu ilginç bulabilirsin." Bunu gönderebilirdim, ancak üst düzey yaklaşımların buna değmeyecek kadar benzer olduğunu hissettim.
Jonah

2
Sadece karmaşık argümanları hatırladı #burada yardımcı olan, 26 bayt|:@((-#)|."_1(1j1##)"0)~#\
mil

1

JavaScript (ECMAScript 6), 161 bayt

(s,n=console.log)=>s.split("").map((q,i,a,p)=>n(p=" ".repeat(q=a.length-++i)+a.map((v,j)=>j>=q&&j%2==q%2?a[j]+' ':'').join(''))||p).reverse().map((v,i)=>i&&n(v))

Çevrimiçi deneyin!


1

Perl 5 , 86 + 2 (-F) = 88 bayt

@ Dom'un önerilerini ve bayt sayısını düşürmek için kendi tweaks'ımdan birkaçını kullandım.

for$k(0..$#F){$i=1;$a[$#F+$k]=$a[$#F-$k]=[map$i++<$k|($i+$k)%2?$":$_,@F]}say"@$_"for@a

Çevrimiçi deneyin!


Bunun için üzgünüm, cevabınızı yine de orada gördüğünüze sevindim! Madeni tamir etmeye çalıştığım ve çözemediğim bir oyun oynadım, sizinki daha iyi bir yaklaşımdı! -aFTüm harfleri koymak için birkaç bayt bırakmak mümkündür @Fve birkaç küçük tweaks ( -Fsonradan boşluk olması gerektiğinden 3 olarak sayılır): Çevrimiçi deneyin!
Dom Hastings

1
-F neden 3 olarak sayılıyor? En fazla 2 olmamalı mı? perl -e'code...'Ve arasındaki fark değil mi perl -eF 'code...'. Ayrıca -a, -Fbayt kesilebilir, böylece kullanırken gereksizdir .
Xcali

İşte bu kadar. Yani -Fbir tartışma kabul eder ama biz bir geçmek istemiyorum ( -Fbizi kontrol etmenizi sağlar -ao arasındaki fark yani, hiçbir argüman üzerinde böler kendi başına her kömürü bölünmüş) perl -ae '...'ve perl -aF -e '...'. Varsayılan olarak -aaçıktır /\s+/. Bu netleşmesine yardımcı olur umarım!
Dom Hastings,

Ayrıca, güzel kullanım $#F! Her zaman bunu unut!
Dom Hastings,

0

q / kdb +, 55 bayt

Çözüm:

-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x};

Örnek:

q)-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x}"Hello World";
          d
         l
        r d
       o l
      W r d
       o l
    o W r d
   l   o l
  l o W r d
 e l   o l
H l o W r d
 e l   o l
  l o W r d
   l   o l
    o W r d
       o l
      W r d
       o l
        r d
         l
          d

Açıklama:

YAPMAK. ungolfed versiyonu 66 bayttır:

-1 flip{{1_a,((2*y)#" ",z),a:x#" "}'[reverse c;1+c:til count x]x};

Bonus:

Örnekle aynı çıktıyı elde etmek için (74 bayt):

q)-1(+){1_'raze{(a,((2*y)#" ",z),a:x#" ";(2*y+x)#" ")}'[(|)c;1+c:(!)(#)x]x}"Hello World";
                    d
                  l
                r   d
              o   l
            W   r   d
              o   l
        o   W   r   d
      l       o   l
    l   o   W   r   d
  e   l       o   l
H   l   o   W   r   d
  e   l       o   l
    l   o   W   r   d
      l       o   l
        o   W   r   d
              o   l
            W   r   d
              o   l
                r   d
                  l
                    d
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.