Tulis program atau fungsi yang mengambil string yang dijamin hanya berisi karakter ASCII yang dapat dicetak kecuali ruang, dan menjadi angka segitiga positif (panjang 1, 3, 6, 10, 15, ...).
Cetak atau kembalikan string yang sama, tetapi bentuk menjadi segitiga menggunakan spasi. Beberapa contoh terbaik akan menunjukkan apa yang saya maksud:
Jika inputnya R
maka output akan menjadi
R
Jika inputnya cat
maka output akan menjadi
c
a t
Jika inputnya monk3y
maka output akan menjadi
m
o n
k 3 y
Jika inputnya meanIngfu1
maka output akan menjadi
m
e a
n I n
g f u 1
Jika inputnya ^/\/|\/[]\
maka output akan menjadi
^
/ \
/ | \
/ [ ] \
Jika inputnya
Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?
maka hasilnya akan menjadi
T
h i
s r u
n o f c
h a r a c
t e r s i s
m e a n t t o
h a v e a l e n
g t h t h a t c a
n b e e x p r e s s
e d a s a t r i a n g
u l a r n u m b e r . D
i d i t w o r k ? Y o u t
e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?
Pada dasarnya, baris baru disisipkan di antara substring dengan panjang segitiga, spasi ditambahkan di antara semua karakter, dan setiap baris diberi indentasi dengan spasi agar sesuai dengan bentuk segitiga.
Sebuah baris baru dan garis trailing dengan spasi tambahan secara opsional diizinkan, tetapi jika tidak, output Anda harus persis sama dengan contoh-contoh ini. Baris terakhir dari segitiga seharusnya tidak memiliki spasi di depan.
Kode terpendek dalam byte menang.
Jawaban:
Pyth, 22 byte
Cobalah online: Demonstrasi atau Test Suite
Penjelasan:
sumber
Python, 81 byte
Fungsi rekursif. Mulai dari akhir
s
, memotong dan mencetak karakter. Jumlah karakter yang akan diambil dihitung dari panjangs
. Fungsi ini diatur untuk mencetak dalam urutan terbalik dari panggilan rekursif, yang berakhir ketikas
kosong dan kemudian menyelesaikan kembali jalur. Setiap lapisan, awalanp
memiliki ruang tambahan yang ditambahkan.Dalam Python 3,
if
ini dapat dilakukan melalui hubungan arus pendek, meskipun ini tampaknya tidak menghemat karakter:Alternatif yang sama panjangnya dengan rantai ketimpangan:
Keduanya
print
danf
kembaliNone
, yang sulit digunakan.sumber
Retina ,
1081029487826463 byteTerima kasih kepada Sp3000 untuk membuat saya mengejar pendekatan asli saya, yang membawa jumlah byte dari 108 ke 82.
Terima kasih banyak kepada Kobi yang menemukan solusi yang jauh lebih elegan, yang memungkinkan saya untuk menyimpan 19 byte lagi.
Dimana
<space>
mewakili karakter spasi tunggal (yang kalau tidak akan dilucuti oleh SE). Untuk tujuan penghitungan, setiap baris masuk dalam file terpisah dan\n
harus diganti dengan karakter linefeed yang sebenarnya. Untuk kenyamanan, Anda dapat menjalankan kode seperti dari satu file dengan-s
bendera.Cobalah online.
Penjelasan
Yah ... seperti biasa saya tidak bisa memberikan pengantar penuh untuk menyeimbangkan kelompok di sini. Untuk primer, lihat jawaban Stack Overflow saya .
Tahap pertama adalah tahap
S
plit, yang membagi input menjadi garis-garis yang semakin panjang. Yang_
menunjukkan bahwa potongan kosong harus dihilangkan dari pemisahan (yang hanya mempengaruhi akhir, karena akan ada kecocokan di posisi terakhir). Regex itu sendiri sepenuhnya terkandung dalam look-around sehingga tidak akan cocok dengan karakter apa pun, tetapi hanya posisi.Bagian ini didasarkan pada solusi Kobi dengan golfitude tambahan yang saya temukan sendiri. Perhatikan bahwa lookbehinds dicocokkan dari kanan ke kiri di .NET, jadi penjelasan berikut sebaiknya dibaca dari bawah ke atas. Saya juga memasukkan yang lain
\G
dalam penjelasan untuk kejelasan, meskipun itu tidak perlu untuk pola untuk bekerja.Saya masih mengagumi karya Kobi di sini. Ini bahkan lebih elegan daripada regex pengujian utama. :)
Mari kita beralih ke tahap selanjutnya:
Sederhana: masukkan spasi setelah setiap karakter non-linefeed.
Tahap terakhir ini membuat indentasi semua garis dengan benar untuk membentuk segitiga. Ini
m
hanya mode multiline biasa untuk^
mencocokkan awal baris. The+
memberitahu Retina mengulangi tahap ini sampai string berhenti berubah (yang, dalam hal ini berarti bahwa regex pertandingan tidak lagi).Jadi ini cocok dengan awal dari setiap baris yang tidak memiliki indentasi lebih besar dari yang berikutnya. Dalam posisi apa pun kita memasukkan spasi. Proses ini berakhir, setelah garis disusun dalam segitiga yang rapi, karena itulah tata letak minimal di mana setiap baris memiliki indentasi yang lebih besar daripada yang berikutnya.
sumber
Candy ,
675957 byte&iZ1-=yZ1+Z*2/>{0g}0=z@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&1-8*1+r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&8*7-r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
atau:
bentuk panjang:
sumber
CJam,
2726 byteTerima kasih kepada Sp3000 untuk menghemat 1 byte.
Anehnya dekat dengan Pyth, mari kita lihat apakah ini bisa golf ...Uji di sini.
Penjelasan
sumber
'
keS
???S
adalah string, bukan karakter, makaf
akan memetakan string yang bukan daftar garis.Ruby,
847773 byte77 byte
Mengurangi beberapa byte lagi dengan menghapus variabel
r
seperti yang disarankan oleh steveverrill.84 byte
Tidak Disatukan:
Pertama menghitung angka segitiga dari string input
yaitu misalnya ukuran string input adalah 120 dan angka segitiga n kita, akan menjadi 15.
Pada baris di atas, ia mencetak spasi diikuti oleh serangkaian string yang diambil dari string input menggunakan pola berikut
[[0,0],[1,2],[3,5],[6,9]]
Pemakaian:
sumber
upto
tidak memerlukan argumen integer, (times
tentu saja tidak.) Saya telah memasukkan beberapa sintaks Anda ke dalam revisi jawaban saya. Kiat terbesar yang saya miliki untuk Anda adalah, Anda tidak perlu variabel itur
. Cukup gunakan,
alih - alih..
dan nomor setelah koma adalah jumlah total elemen yang akan dikembalikan, bukan akhir rentang.Pyth, 27 byte
Test Suite
Pendekatan yang menarik - keharusan, dan menggunakan
.I
. Mungkin golf.sumber
C,
138136134 byteMengambil string sebagai input:
sumber
printf(" ")
danprintf("\n")
denganputs(" ")
danputs("\n")
. Setiap subtitusi akan menghemat 2 byte. :)Pendekatan Ruby 2 rev 1, 76 byte
Dioptimalkan menggunakan ide-ide sintaksis dari jawaban Vasu Adari, ditambah beberapa tikungan saya sendiri.
Pendekatan Ruby 2 rev 0, 93 byte
Pendekatan yang sama sekali berbeda. Pertama kita menambahkan spasi di antara karakter input. Lalu kami mencetak baris demi baris.
Pendekatan Ruby 1, 94 byte
ini berakhir jauh lebih lama dari yang diperkirakan.
w
berisi jumlah karakter yang dapat dicetak di baris bawah, atau yang setara, jumlah garis.Setiap baris berisi
w
karakter spasi putih (yang terakhir adalah baris baru) sehingga idenya adalah untuk mencetak karakter spasi putih ini dan masukkan karakter yang dapat dicetak jika perlu.sumber
Minkolang 0,14 , 42 byte
Coba di sini.
Penjelasan
sumber
Python 2,
8885 byteTerima kasih xnor untuk menyimpan 3 byte.
sumber
s
mengacaukan perhitungan jumlah ruang?S=s=raw_input()
?CJam, 50 Bytes
Coba di sini.
Penjelasan
sumber
JavaScript (ES6), 135 byte
De-golf + demo:
sumber
for (s = j = 0; j < w.length; j += s++);
? Juga, di dalam<pre>
, Anda dapat menggunakan\n
bukan<br>
. Juga, Anda lupa menyebutkan bahwa itu adalah ES6.Jawa,
258194Golf:
Tidak Disatukan:
Output program:
sumber
import static System.out;
adalah 25 byte, danSystem.
7 byte. Ini digunakan tiga kali, dan 21 <25 sehingga benar-benar akan meningkatkan ukuran 4 byte. Namun, petunjuk yang baik, impor statis dapat menghemat ruang dan tidak semua orang tahu tentang mereka.JavaScript (ES6), 106 byte
Menggunakan rekursi alih-alih for loop untuk membangun string.
Untuk menemukan panjang baris terpanjang, gunakan rumus untuk angka segitiga n
T_n
tersebutT_n = (n^2 + n)/2
. Diberikann
dan dipecahkan untukT_n
menggunakan rumus kuadratik, kami memiliki:Ternyata setelah lantai, menambahkan 1/4 di dalam akar kuadrat tidak mengubah hasilnya, maka rumus untuk baris terpanjang adalah
Math.sqrt(2*a.length)|0
.sumber
TeaScript , 44 Bytes
Ini menggunakan metode yang sama dengan jawaban JavaScript saya , tetapi jauh lebih pendek.
Tidak disatukan
sumber
Powershell, 69 byte
Skrip uji yang kurang golf:
Keluaran:
sumber
C #, 202
Saya tidak tahu apakah ini legal dalam kode-golf tetapi, apakah meneruskan daftar dalam fungsi berfungsi? Saya tidak dapat menemukan cara untuk mengulang ini tanpa Daftar <string> dideklarasikan di luar fungsi jadi saya menempatkannya sebagai parameter.
Pemakaian:
sumber
C, 102 byte
sumber
Bash + sed, 87
sumber
R, 142 byte
Cukup yakin saya bisa mendapatkan ini lebih banyak. Masih bekerja pada itu. Saya merasa seperti kehilangan rekursi yang mudah - tetapi saya belum dapat mempersingkatnya dengan benar.
ungolfed
sumber
05AB1E , 11 byte
Cobalah online!
sumber