Sebagai seorang programmer, Anda mungkin pernah mendengar tentang garis miring ke depan dan garis miring ke belakang. Tetapi apakah Anda pernah mendengar tentang downslash? Saat itulah Anda mengambil banyak garis miring, hubungkan ujungnya dan tarik turun.
Untuk tantangan hari ini, Anda harus menulis sebuah program atau fungsi yang mengambil string yang murni terdiri dari garis miring, dan menampilkan semua garis miring yang ditarik ke bawah dalam garis yang menghubungkannya. Ini akan jauh lebih jelas jika Anda melihat contoh. Mengingat string \\\//\/\\
, Anda harus menampilkan:
\
\
\
/
/
\
/
\
\
Berikut ini beberapa klarifikasi:
Harus ada satu garis miring per baris.
Baris pertama akan memiliki 0 spasi utama.
Untuk setiap pasang garis miring:
Jika mereka berbeda satu sama lain, mereka akan ditarik di kolom yang sama. Misalnya,
\/
akan memberi:\ /
Jika mereka memiliki karakter yang sama, yang lebih rendah berada di arah yang ditunjukkan , yaitu bergerak ke kanan untuk backslash, dan bergerak ke kiri untuk tebasan ke depan. Jadi
\\//
akan memberi\ \ / /
Setiap baris mungkin memiliki spasi spasi tambahan selama ini tidak mengubah tampilan visual dari output. Hingga satu trailing dan newline terkemuka juga dapat diterima. Ruang pemimpin tambahan tidak diizinkan !
Agar lebih sederhana, Anda dapat mengasumsikan bahwa string tidak akan pernah mengandung terlalu banyak garis miring ke depan. Dengan kata lain, tidak ada awalan input yang akan mengandung garis miring yang lebih maju dari garis miring terbalik, sehingga input seperti \\////
atau //
tidak akan pernah diberikan. Ini juga berarti bahwa setiap input akan mulai dengan garis miring terbalik.
Jika input Anda diambil sebagai string literal, Anda dapat lolos dari garis miring terbalik jika ini diperlukan. Anda juga tidak perlu menangani input yang kosong, atau mengandung karakter selain garis miring.
Anda dapat menampilkan dengan format apa pun yang masuk akal .
Seperti biasa, ini adalah tantangan kode-golf , jadi cobalah membuat solusi sesingkat mungkin, bahkan jika Anda memilih bahasa yang agak sulit. Poin bonus untuk menjelaskan teknik menarik yang Anda gunakan untuk melepas byte!
Contohnya
#Input
\\\\\\\\\\\
#Output
\
\
\
\
\
\
\
\
\
\
\
#Input
\\\//\\/\//\\///
#Output
\
\
\
/
/
\
\
/
\
/
/
\
\
/
/
/
#Input
\/\/\/
#Output
\
/
\
/
\
/
Jawaban:
GNU Sed, 20
Catat itu
^L
dan^H
merupakan karakter formfeed dan backspace literal (0x12 dan 0x8).Jawaban ini berfungsi dengan menggerakkan kursor menggunakan karakter backspace dan formfeed. Garis miring / garis miring terbalik tidak diberi spasi - Tidak yakin akan mendiskualifikasi jawaban ini. Ini tidak berfungsi di TIO, tetapi terlihat baik di bawah terminal umum seperti
xterm
dangnome-terminal
.Buat kembali skrip sed ini sebagai berikut:
Jalankan sebagai berikut:
Penjelasan:
sumber
Arang ,
131211 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Mendukung ekstra
//
s. Penjelasan:sumber
↓¶
= "Bergerak ke kiri" dalam deskripsi tidak benar.\n/
"print \n/ down
karena saya merasa lebih membantu untuk menggambarkan efek kode daripada terjemahan literalnya.MyCode - Do the spec
). Saya mengerti sekarang meskipun pengaruhnya adalah bergerak ke kiri; mungkin layak dikatakan "Bergerak ke kiri (dengan mencetak baris baru dengan arah pencetakan ke bawah)".Python 2 ,
5554515753 byte-3 byte (dan perbaikan bug) berkat Felipe Nardi Batista
Cobalah online!
sumber
/// , 119 byte
/// tidak memiliki perintah input, jadi input harus disematkan dalam program. Untuk yang ini, string input hanya ditambahkan, tanpa perlu melarikan diri.
-d
opsi (status program ditunjukkan dalam tanda kurung sebelum setiap perintah dijalankan).Bagaimana itu bekerja
\\/\//
akan ditambahkan ke program untuk demonstrasi.
digunakan untuk mewakili baris baru dalam kode inline.Singkatan
Awal
/=/\/\///M/|%%=N/%|||=C/BA=
program berisi pergantian singkatan golf.=
meluas ke//
,M
ke|%%
,N
ke%|||
danC
keBA
.Setelah ini, program saat ini menjadi
Pengodean ulang input
Tahap selanjutnya mengubah string input yang ditambahkan ke bentuk yang lebih bermanfaat. Karena sepenuhnya terdiri dari dua karakter perintah ///, ini membutuhkan perhatian untuk menghindari penyusunan program dasar.
/\/\\/\/BA\\/
,, menggantikan string/\
dengan/BA\
./\
pada saat ini, sehingga substitusi ini tidak mempengaruhinya.\
s diikuti oleh urutan/
s, yang bersama-sama denganABA
pada akhir program dasar memungkinkan untuk beralih melalui itu dengan penggantian berikut.ABA
awalan sebelumnya, contoh string input sekarang menjadiABA\\/BA\//
./BA\\/BAbBA/
,, digantikanBA\
olehBAbBA
.\
s dari string input, yang dengan awalan sekarang menjadiABAbBAbBA/BAbBA//
/B\A\//BAfBA/
perubahanBA/
untukBAfBA
, iterasi melalui/
s.\
dalam substitusi ini diperlukan karena jika tidak maka akan hancur oleh yang sebelumnya.ABAbBAbBAfBABAbBAfBAfBA
./AB//
menghapus beberapa bagian berlebihan dari pengkodean, mengubahnya menjadiAbBAbBAfBAbBAfBAfBA
.AB
dari/|/AB\\/
substitusi nanti dalam program, yang diperlukan untuk melindunginya dari/\
manipulasi di atas .\
string input asli telah menjadiAbB
, dan setiap/
telah menjadiAfB
. (b
danf
berdiri untuk maju dan mundur.) Ada yang tersesatA
di akhir.A
danB
dengan fragmen program untuk dijalankan pada tahap akhir. Dalam string pengganti,%
s dan|
s mengkode apa yang akan menjadi/
dan\
masing-masing. Ini memiliki dua manfaat:/
dan\
,%
dan|
tidak perlu melarikan diri untuk disalin./\
, yang seharusnya telah hancur oleh manipulasi sebelumnya./|/\\/
(sebelumnya/|/AB\\/
) sekarang menerjemahkan kode|
s, setelah yang berikut/%/|//
ini menjadi/%/\//
dan menerjemahkan kode%
s.Struktur program pada tahap akhir
Pada titik ini, program dasar telah menjalankan semua substitusinya, dan yang tersisa hanyalah program-pengkodean dari string input.
Setiap karakter input telah menjadi subprogram
(trailing newline), di mana
*
mewakilif
untuk dokumen asli/
, ataub
untuk dokumen asli\
./\//xy
di akhir program, yang tidak akan berpengaruh kecuali untuk memberikan yang diperlukan/
untuk penggantian subprogram sebelumnya.Substring bersama
Sebelum iterasi terakhir melalui subprogram dimulai, ada substring yang melintasi batas setelah setiap subprogram karakter dari formulir
\//
./
, yang menopang substitusi) akan dijalankan untuk mencetak baris untuk itu. karakter./
, yang merupakan "baris sebelumnya" imajiner yang tepat untuk menyebabkan karakter input pertama dicetak pada awal barisnya.\\
atau\/
, baris baru, dan berikut ini/
.Menjalankan subprogram karakter
Beberapa dari pergantian berikut ini mengandung lebih banyak
\
bagian dalam untuk mencegah agar tidak dicocokkan dan dihancurkan satu sama lain (termasuk salinan lain dalam subprogram lain). Pencapaian ini juga merupakan alasan mengapa keduax
dany
dibutuhkan./\//xyf\z/
atau/\//xyb\z/
, menyebabkan/
substring bersama di akhir menjadixyfz
atauxybz
, segera setelah\/
atau\\
./\\\\x\y/ /
diganti\\xy
dengan spasi, dan subtitusi tidak/\\\/x\y//
diganti\/xy
oleh apa pun.\
atau/
.\
berikutnya, diikuti olehfz
ataubz
./ \fz/\\\/\//
diganti fz
oleh\//
, dan/b\z/\\\\\//
digantibz
oleh\\/
./
atau\
, masing-masing./
dengan benar.///
, yang merupakan infinite loop./
di akhir substring bersama.Setelah subprogram karakter terakhir dijalankan, apa yang tersisa dari program ini adalah
/\//xy
. Karena ini merupakan substitusi yang tidak lengkap dengan final yang hilang/
, program akan melewatinya dan berhenti secara normal.sumber
Jelly , 14 byte
Program lengkap mencetak hasilnya.
Cobalah online!
Bagaimana?
sumber
Haskell , 49 byte
Cobalah online!
sumber
Perl 5 , 44 byte
42 byte kode + 2 untuk
-F
benderaCobalah online!
sumber
JavaScript (ES8),
665963 byte7 byte disimpan berkat Justin Mariner
+4 byte untuk diperbaiki
/\\/\\/
(diperhatikan oleh Neil )Cobalah online!
sumber
MATL ,
231918 byte1 byte off berkat @Sanchises
Input adalah string yang dilampirkan dalam tanda kutip tunggal.
Cobalah online! Atau verifikasi kasus uji: 1 , 2 , 3 .
Penjelasan
Pertimbangkan input
'\\\//\/\\'
sebagai contoh.sumber
C # (.NET Core) ,
748882787776 + 18 byte-1 byte terima kasih kepada Kevin Cruijssen
Menghasilkan kumpulan string, satu untuk setiap baris. Hitungan byte juga mencakup:
Cobalah online!
Penjelasan untuk jawaban 77 byte:
sumber
/\\/\\/
.s.Take(i).Sum(y=>y<92?-1:1)+(x-s[0])/45+1
ke(x-s[0])/45-~s.Take(i).Sum(y=>y<92?-1:1)
05AB1E , 14 byte
Cobalah online!
Penjelasan
sumber
/\\/\\/
.Ç¥.¥0<.SηOv¹Nèy<ú,
terisak dalam binerR ,
122121 byte-1 byte terima kasih kepada Giuseppe
Cobalah online!
Dengan spasi ekstra:
Penjelasan: Jawaban ini didasarkan pada pengamatan bahwa jumlah spasi memimpin mengubah setiap baris dengan -1, ditambah jumlah
/
pada baris sebelumnya dan saat ini.Jika kita memiliki garis miring N, variabelnya
y
adalah vektor dengan panjang N, dengan 1 untuk setiap posisi dengan\
, 0 sebaliknya. Oleh karena itu, untuk mendapatkan perubahan dalam jumlah spasi utama per baris, kami menghitungy[1:(N-1)] + y[2:N] - 1
. Fungsidiffinv
mengubah perbedaan-perbedaan ini menjadi suatu urutan, dimulai dengan 0. Selebihnya hanyalah masalah merakit setiap baris sebagai jumlah ruang trailing yang diperlukan, diikuti oleh garis miring yang relevan dan baris baru.sumber
diffinv
;) Anda juga dapat mengatury=x>")"
untuk -1 bytestrsplit
, yang selalu merupakan pembunuh. Anda juga dapat memanfaatkan yang terkenaldiffinv
!library(methods)
header (yang seharusnya OK tanpa penalti karena paket itu adalah bagian basis R), Anda dapat menggunakanel
. Juga,diffinv
ternyata hanya selamacumsum
! :)*S
mengacaukan semuanya.Brain-Flak , 175 byte (174 karakter + 1 bendera)
Jalankan dengan
-c
bendera.Cobalah online!
Penjelasan
sumber
Ruby ,
8076 byte-4 byte berkat manatwork
Cobalah online!
Penjelasan:
sumber
.each_cons(2){…}
. Sebagai gantinya Anda dapat menyimpan dengan mengganti.each_char
→.chars
.i+=
ke awal ekspresi ternary bersarang, dan akhiri dengan-1:1:0
.Java 8,
121118110109102 byte-7 byte berkat sihir bit-wise @Nevay . :)
Penjelasan:
Coba di sini.
sumber
a->{String r="";int s=0,p=0,i;for(char c:a){for(i=s+=p+(p=c-63)>>5;i-->0;r+=" ");r+=c+"\n";}return r;}
>>
/>>>
/<<
... Saya hanya memeriksa beberapa hal dengan&
/|
/~
/^
..>.>C (GCC),
13713497 byteCobalah online!
• 3 byte terima kasih ATaco
• 37 byte berkat Digital Trauma & ThePirateBay
Tidak ada yang terlalu mewah hanya fungsi rekursif sederhana yang mengambil string dan mencetak garis miring, perhatikan bahwa input harus lolos dari garis miring terbalik terlebih dahulu.
Pemakaian
Tidak disatukan
Ini untuk jawaban lama, lihat tautan coba online untuk yang diperbarui!
Keluaran
sumber
c=='\0'
dengan!c
untuk efek yang sama.printf("%*s%c", n, "", c)
untuk mencetak karakter c dengan n spasi terkemuka?(c!=n)
denganc-n
dan menata ulang ekspresi ternary. Sama dengan(c=='/')
. Anda juga dapat mengganti'/'
dengan angka literal47
. Saya pikir totalnya adalah 7 byte.C, 60 byte
Cobalah online!
sumber
Retina , 47 byte
Cobalah online! Tautan termasuk kasus uji. Penjelasan:
Tambahkan spasi di awal setiap baris dan sebelum masing-masing
\
.Pertimbangkan dua karakter pertama dari string. Jika yang pertama adalah
/
maka indentasi perlu dikurangi; ini dicapai dengan memasukkan ruang sebelumnya dalam tangkapan (yang selalu ada karena tahap pertama menambahkannya); jika yang kedua adalah a\\
maka perlu ditambah; ini dicapai dengan memasukkan ruang yang ditambahkan tahap pertama dalam tangkapan. Setelah memberi indentasi yang benar pada karakter kedua, stage diulang untuk karakter kedua dan ketiga, dll.Hapus indentasi ekstra.
Saya telah menulis versi 94-byte yang (seperti jawaban Arang saya) memungkinkan setiap kombinasi garis miring: Coba online! Penjelasan:
Dapatkan bola bergulir dengan mengambil tebasan terakhir dan indentasi ke posisi yang sama pada garisnya sendiri.
Awali spasi untuk semua garis miring maju sehingga dapat ditangkap.
Berulang kali ambil tebasan terakhir dari input dan sejajarkan pada jalurnya sendiri dengan garis miring di bawah.
Hapus indentasi sisa apa pun.
Hapus input yang sekarang kosong.
sumber
Lua , 96 byte
Cobalah online!
Yang terpendek yang bisa saya dapatkan di Lua. Input diambil dari baris perintah.
Ini memang menggunakan beberapa trik:
(...):gmatch(
Ini harus menjadi bentuk terpendek dari memasukkan string tunggal ke dalam program Lua dari baris perintah. The
...
berekspresi di Lua menangkap kelebihan parameter ke fungsi yang tidak ditentukan dalam deklarasi fungsi dan digunakan untuk varargs. Karena tubuh utama dari program Lua dipanggil sebagai fungsi dengan argumen baris perintah sebagai parameternya, argumen baris perintah akan berakhir di...
.Tanda kurung di sekitarnya mengubah
...
ekspresi yang berpotensi bernilai banyak menjadi ekspresi bernilai tunggal. Pertimbangkan contoh (agak mengejutkan) ini:and
/or
untuk "jika x maka logika value1 else value2".Operator Lua
and
mengembalikan argumen pertamanya jika salah; jika tidak, ia mengembalikan argumen kedua. Theor
Operator mengembalikan argumen pertama jika truthy; kalau tidak, argumen kedua.p
tidak perlu inisialisasi.p==s
selalu salah dalam menjalankan loop pertama, terlepas dari input. Tidak menetapkanp
ke nilai apa pun sebelum memasukkan loop (meninggalkannyanil
) akan membuat itu terjadi dan menyimpan byte juga.Adakah yang bisa bermain golf ini (di Lua)?
sumber
c=0(...):gsub(".",function(s)c=c+(p==s and(s=="/"and-1or 1)or 0)p=s print((" "):rep(c)..s)end)
gmatch(".")
kegmatch"."
seperti yang Anda lakukan dalam jawaban Anda berikutnya.Pyth , 28 byte
Cobalah online!
sumber
Q
gantinya:j.u+?qeNY?>Y\/+PNdPPNPNYtQh
.R , 119 byte
Cobalah online!
Ini agak berbeda dari jawaban user2390246 . Mereka masing-masing mengulangi string, mencetak sejumlah karakter spasi dan kemudian
/\
karakter yang sesuai .Namun, saya menghindari pemisahan string, sebagai gantinya memilih untuk mengganti karakter dengan nilai pengkodean UTF-8 sebagai gantinya, yang kemudian memungkinkan saya untuk melakukan aritmatika pada angka secara langsung, yang menyelamatkan saya hanya beberapa byte.
sumber
diffinv
pasti tidak akan berfungsi di sini.C # (.NET Core) , 60/65 byte
Saya mencoba versi C # yang lebih pendek
seperti yang dinyatakan: "Ini juga berarti bahwa setiap input akan mulai dengan garis miring terbalik." Atau agak lama yang menyelesaikan awal "/"
Cobalah online!
sumber
Lua ,
8884 byteVersi yang ditingkatkan (-4 bytes berkat QuertyKeyboard)
Cobalah online!
Versi asli (88 byte)
Upaya lain di Lua, kali ini dengan pendekatan yang sama sekali berbeda menggunakan manipulasi string, bukan variabel counter.
Tidak Disatukan:
Ada satu hal yang menarik dalam kode:
(...):gmatch"."
Ini menggunakan beberapa kebiasaan dalam Lua parser. Ketika Lua menemukan sepotong kode dalam formulir
func "string"
, itu akan mengubahnya menjadifunc("string")
. Ini agar seseorang dapat menulisprint "string"
untuk mencetak string konstan dan hanya bekerja dengan string tunggal literal setelah fungsi. Yang lain akan memberikan kesalahan sintaksis. Namun, gula sintaksis ini juga berfungsi dengan pemanggilan fungsi di tengah ekspresi, dan yang lebih mengejutkan,:
gula itu bekerja dengan baik bersama-sama dengan metode pemanggilan gula sintaksis. Jadi pada akhirnya, Lua akan menginterpretasikan kode seperti ini:Jika ada yang bisa memikirkan cara untuk menghapus salah satu dari tiga panggilan gsub, tolong katakan padaku.sumber
s=""g=s.gsub g(...,".",function(c)s=g(g(g(s,"\\"," "),"/?$",c)," /","/")print(s)end)
Pyth - 33 byte
Usaha pertama, akan golf.
Cobalah online di sini .
sumber
Perl, 40 + 2 byte
Anda membutuhkan
-F
benderanya.sumber
Perl,
3438 +1 byteuntuk menangani dua kasus
untuk dijalankan dengan
-p
opsiSunting: komentar berikut tidak berfungsi saat karakter pertama
/
namun output akan digeser satu karakter di sebelah kanan jika karakter pertama adalah
\
sumber
/\\/\\/
.34
solusi awal Anda kini benar-benar validVBA (Excel), 181 byte
sumber
[...]
notasi: Saya mendapatkannya hingga 128 BytesSub q
For x=1To[Len(A1)]
c=Mid([A1],x,1)
If c="\"Then Debug.?b;c:b=b+" "
If c="/"Then b=Left(b,Len(b)-1):Debug.?b;c
Next
End Sub
Pyth ,
2421 bytePort dari jawaban Rod .
Cobalah online!
sumber
\
. BTW di mana kode Anda?SOGL V0.12 ,
1613 byteCoba Di Sini! - mengharapkan input pada stack, jadi untuk kemudahan penggunaan
,
ditambahkansumber
Dyalog APL, 31 byte
Coba di sini!
sumber
{↑⍵↑¨⍨a-1-+\¯1*a←⍵='\'}