Meledakan string


34

Diberikan string apa pun, cetak dalam bentuk segitiga di mana teks berjalan naik dan turun di sepanjang setiap diagonal. Misalnya, input dari "Hello World"output harus:

                    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

Ruang antara setiap karakter dalam satu baris harus minimal 1, untuk mempertahankan format yang tepat.


1
Bolehkah kita menganggap string tidak kosong?
Tn. Xcoder

@ Mr.Xcoder Ya Anda boleh
machiavelli

1
Ruang antara setiap karakter dalam satu baris harus minimal 1 : Apakah ini berarti bahwa itu H l o W r dadalah baris tengah yang valid? Bertanya karena dalam contoh Anda setiap baris memiliki 3 spasi antara setiap karakter.
Emigna

1
@ Emigna Saya salah mengerti pertanyaan Anda, saya minta maaf. Ya, contoh Anda akan valid.
machiavelli

1
Ruang terdepan atau tertinggal diizinkan?
Luis Mendo

Jawaban:


19

Arang , 10 7 byte

↗ELθ✂θιUE¹

Cobalah online! Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Pertama kali saya menggunakan UEperintah.


Saya tahu Charcoal akan menjadi salah satu jawaban pertama di sini .. Hampir tergoda untuk memulai sendiri, tapi saya cara untuk tidak berpengalaman untuk menyelesaikan solusi tepat waktu, dan bagaimanapun juga akan keluar main golf ..;)
Kevin Cruijssen

6
@Emigna ... tapi ini adalah kesempatan besar saya untuk menggunakan UE...
Neil

6
@EriktheOutgolfer ... tapi ini adalah kesempatan besar saya untuk menggunakan UE..
Neil

1
@Neil Ini -3 byte! -3 untuk pengorbanan yang bagus! Siapa yang tidak mau -3 bagus?
Erik the Outgolfer

4
@EriktheOutgolfer Apa yang seharusnya Anda katakan adalah, "Anda tidak bisa membiarkan 05AB1E mengalahkan Anda, bukan?"
Neil

12

05AB1E , 10 8 7 byte

Terima kasih kepada Emigna untuk menghemat 2 byte!

ðâƶ.cðζ

Menggunakan penyandian 05AB1E . Cobalah online!


Sesuai baris ini, ruang antara setiap karakter dalam satu baris harus minimal 1 yang dapat Anda hapus ¶«. (juga memverifikasi validitas dengan OP)
Emigna

@Emigna Terima kasih! :)
Adnan

Mungkin ingin memperbarui tautan Tio :)
Tn. Xcoder

@ Mr.Xcoder ninja'd
Adnan

1
Pandai menggunakan dari âdalam ðâbukan Sð«!
Erik the Outgolfer


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

Cobalah online!

Penjelasan

Implementasi naif: dua siklus, isi dari atas ke bawah, kiri ke kanan (99 byte):

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

Di sini, menempatkan () hanya mencetak \ n ke output. Mari kita gabungkan deklarasi variabel dan gabungkan j ++ dengan sesuatu (94 byte):

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

Baik. Variabel j memiliki kisaran 0 ... 2n; biarkan di dalam -n ... n, ini membuat matematika lebih sederhana. Perhatikan bahwa ekspresi boolean di sebelah kanan && selalu bernilai 0 atau 1. Ini berarti kita dapat mengganti && dengan &. 91 byte:

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

Dan sekarang kami menyadari bahwa kami mencetak ruang ekstra. Dan ya, kita tidak perlu printf () untuk mencetak hanya satu simbol. 86 byte:

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

Bahkan lebih baik. Perhatikan bahwa kondisi i * i> = j * j sama dengan i> = abs (j), tetapi lebih pendek. Mari kita memindahkan put () ke dalam untuk ekspresi kenaikan loop. Dan coba tebak? Sebenarnya, kita tidak perlu kawat gigi di sekitar i + j. 78 byte:

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

Tahukah Anda bahwa putchar () mengembalikan karakter yang telah dicetak? Mari kita gunakan XOR untuk menguji angka untuk kesetaraan. Mari ganti ruang dengan kode ASCII-nya, 32. Ingat kode karakter end-of-line adalah 13. Dan akhirnya: tahukah Anda bahwa GCC / Dentang memang mendukung https://en.wikipedia.org/wiki/Elvis_operator ? 73 byte:

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

Akhirnya, coba tebak? Kami tidak membutuhkan dua untuk loop. Kita bisa mengganti yang jelek ~ i + j hanya dengan ij. 70 byte:

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

Pekerjaan masa depan: mengubah arah loop? Ini mungkin menghemat beberapa byte, jika dilakukan dengan benar.


5

SOGL V0.12 , 13 10 9 byte

ēI*@∑}¹╚H

Ini menggunakan fitur yang baru saja saya tambahkan , tetapi sudah didokumentasikan beberapa waktu lalu.

Coba di sini!
Dalam tautan ,itu ditambahkan karena ini mengharapkan input pada stack dan {ditambahkan karena jika tidak ,akan dieksekusi setiap kali dalam loop

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 byte

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

Cobalah online!

Penjelasan

$                 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 byte (maaf)

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
Anda dapat menghapus baris baru, jika tidak, ini terlihat cukup golf!
Zacharý

1
Anda bisa bermain golf lebih banyak: 1 boolean a=1<0,o=L%2>0;.. 2. Jika Anda tidak perlu i, menggunakan loop ini: for(i=0;i++<n;). 3. Anda dapat menyingkirkan o: j%2<L%2lalu j%2>L%2. 4. Menggunakan dsebagai flip membutuhkan begitu banyak karakter: lakukan saja j<(x<0?-x:x). 5. Anda memiliki lebih banyak variabel daripada yang dibutuhkan. 6. Anda tidak perlu program lengkap: lambda atau metode sudah cukup. - Jika Anda ingin contoh Java golf, periksa jawaban saya .
Olivier Grégoire


3

Java (OpenJDK 8) , 116 byte

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

Cobalah online!

Penjelasan

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 byte

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

Cobalah online!

Disimpan 3 byte byte ke Challenger5

Saya tidak berpikir itu optimal ...

fmenghasilkan salah satu garis ( m= 0 atau 1 adalah modulo dari nomor baris,n adalah jumlah baris)

g interkalasi baris "ganjil" dan "genap", dan tambahkan ke cermin hasil itu sendiri.


Anda dapat menyimpan byte dengan mendefinisikan fsebagai fungsi infix (seperti pada (m#n)s=...) daripada fungsi awalan.
Buah Esolanging



2

Mathematica 105 Bytes

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

Mungkin saya bisa mengurangi satu atau dua byte lagi, tetapi jumlah karakter di atas berurusan dengan string di Mathematica membuat tantangan sederhana seperti ini tidak kompetitif.


2

J, 54 byte

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

Cobalah online!(perhatikan bahwa output pada TIO memiliki baris baru dan tiga spasi, tapi itu bukan dari pemanggilan fungsi - itu mungkin hanya apa yang dilakukan penerjemah J secara otomatis).

Saya pikir ide umum untuk menyelesaikan ini benar, tetapi ada hal-hal kecil yang mungkin saya lakukan secara kurang optimal yang menambah bytecount.

Varian sebelumnya

55 byte

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

56 byte

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

Penjelasan

Ini akan dibagi menjadi beberapa fungsi. Juga, saya tidak teliti dengan bagian terakhir dari penjelasan, jadi beri tahu saya jika Anda ingin penjelasan yang lebih baik untuk bagian tertentu dan saya dapat mengeditnya.

dup   =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad   =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
  • dup menduplikasi setiap karakter sebanyak indeksnya (ditambah satu) dalam string
  • space menyisipkan spasi antara masing-masing karakter
  • pad mengisi karakter dengan jumlah ruang yang tepat
  • trans transposes matriks yang dihasilkan

Contoh panggilan:

   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

Hasilnya dikotak untuk mencegah J dari mengisi ujungnya dengan spasi (karena panjangnya tidak merata).

Contoh panggilan:

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

Ruang

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

Contoh panggilan:

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

Bantalan

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

Pada dasarnya, pad elemen pertama dengan panjang - 1 spasi, yang kedua dengan panjang - 2, dll. Ini juga menghilangkan tinju.

Contoh panggilan:

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

Mengubah urutan

Ini hanya fungsi built-in |:yang mengambil transpose dari sebuah matriks.


1
Saya menggunakan pendekatan yang sama, tetapi menghindari tinju. 45 byte: |:@(-@i.@-@#|."0 1((,@,.~' '#~#)@$"0~1+i.@#)). itu pasti bisa bermain golf lebih lanjut. bagian ini -@i.@-@#adalah beberapa buah tergantung rendah, kemungkinan besar
Yunus

@Jonah Saya tidak bisa dengan cepat menguraikan cara kerja jawaban Anda, jadi saya akan menyerahkan kepada Anda untuk mempostingnya jika Anda mau, karena saya ingin memasukkan penjelasan tentang jawaban saya. Saya kira J bagi saya saat ini adalah bahasa hanya menulis.
cole

membantu untuk menguraikan dengan cepat:, f=. <some tacit expression>kemudian 5!:2 <'f'memberikan visualisasi kotak dan 5!:4 <'f'memberikan visualisasi pohon. dalam kasus saya, coba jalankan $"0~1+i.@#dengan beberapa string terlebih dahulu, kemudian jalankan semuanya ke kanan |."0 1, lalu pahami itu |."0 1dan semuanya ke kiri, simpan transpos akhir, hanya melakukan rotasi yang diperlukan.
Jonah

1
oh saya tidak mengharapkan Anda untuk memperbarui jawaban Anda. itu lebih dari "hei, kamu mungkin menemukan ini menarik." saya bisa mempostingnya, tetapi merasa pendekatan tingkat tinggi cukup mirip itu tidak layak.
Jonah

2
Baru ingat argumen kompleks #bantuan di sini, 26 byte dengan|:@((-#)|."_1(1j1##)"0)~#\
mil

1

JavaScript (ECMAScript 6), 161 byte

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

Cobalah online!


1

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

Menggunakan saran @ Dom dan beberapa tweak saya sendiri untuk menurunkan jumlah byte.

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

Cobalah online!


Maaf tentang itu, senang Anda mendapat jawaban Anda di luar sana! Memiliki sedikit permainan ketika saya mencoba untuk memperbaiki milik saya dan tidak bisa mendapatkan solusi, Anda adalah pendekatan yang lebih baik! Dimungkinkan untuk menjatuhkan beberapa byte menggunakan -aFuntuk memasukkan semua huruf @Fdan beberapa tweak kecil ( -Fdihitung sebagai 3 karena perlu spasi setelah): Cobalah online!
Dom Hastings

1
Mengapa -F dihitung sebagai 3? Bukankah seharusnya paling banyak 2? Bukankah perbedaan antara perl -e'code...'dan perl -eF 'code...'. Juga -atidak perlu saat menggunakan -F, sehingga byte itu dapat dipotong.
Xcali

Tepat seperti itu. Jadi -Fmenerima argumen, tapi kami tidak ingin menyampaikannya ( -Fmemungkinkan kami untuk mengontrol apa yang -adibagi, tidak ada argumen, membagi masing-masing karakter dengan sendirinya) sehingga perbedaan antara perl -ae '...'dan perl -aF -e '...'. Secara default -aterpecah /\s+/. Semoga itu membantu memperjelas!
Dom Hastings

Juga, penggunaan yang bagus $#F! Selalu lupakan itu!
Dom Hastings

0

q / kdb +, 55 byte

Larutan:

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

Contoh:

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

Penjelasan:

MELAKUKAN. versi takung adalah 66 byte:

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

Bonus:

Untuk mendapatkan hasil yang sama dengan contoh (74 byte):

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.