Ini adalah dandelion ASCII:
\|/ \ / |
/|\ | \|/ |
| | | _\|/_
| | | /|\
Dandelion ASCII memiliki tiga parameter: Panjang batang (jumlah positif antara 1 dan 256, jumlah biji (jumlah positif antara 0 dan 7), dan orientasi (^ atau v). Dandelion di atas memiliki panjang, biji dan orientasi, ( 3,5, ^), (3,2, ^), (2,3, ^) dan (3,7, v) masing-masing.
Biji-biji diisi dengan urutan sebagai berikut (dibalik terbalik untuk dandelion head-down), diilustrasikan pada dandelion dengan panjang 2:
seeds: 0 1 2 3 4 5 6 7
| \ / \|/ \ / \|/ _\ /_ _\|/_
| | | | /|\ /|\ /|\ /|\
| | | | | | | |
Tantangan:
Tulis sebuah program / fungsi yang ketika diberi dandelion ASCII sebagai input, mengembalikan panjangnya, jumlah benih, dan orientasi yang diformat mirip dengan contoh di atas dan ketika diberikan parameter dalam format itu mengembalikan dandelion ASCII dengan parameter tersebut. Anda dapat mengabaikan tanda kurung dan menganggap input / output akan berupa angka, koma, angka, koma, dan salah satu ^
atau v
. Anda dapat mengganti karakter lain dengan ^
/ v
selama mereka masih dapat dengan mudah diartikan sebagai 'naik' / 'turun' (misalnya, u
/ d
). Anda tidak perlu membedakan antara dandelion yang terlihat sama, seperti (2,1, ^) dan (3,0, ^) atau (2,1, ^) dan (2,1, v). Mengingat seni ASCII, set parameter akan menjadi output yang dapat diterima, dan kedua set parameter dapat memberikan seni ASCII yang sama.
Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
Contoh program dalam C # (bahkan tidak sedikit golf):
string Dandelion(string s)
{
if (s.Contains(','))
{
//got parameters as input
string[] p = s.Split(',');
//depth and width (number of seeds)
int d = int.Parse(p[0]);
int w = int.Parse(p[1]);
//draw stem
string art = " |";
while (d > 2)
{
d--;
art += "\n |";
}
//draw head
string uhead = (w % 2 == 1 ? "|" : " ");
string dhead = uhead;
if (w > 1)
{
uhead = "\\" + uhead + "/";
dhead = "/" + dhead + "\\";
if (w > 5)
{
uhead = "_" + uhead + "_\n /|\\";
dhead = "_\\|/_\n " + dhead;
}
else if (w > 3)
{
uhead = " " + uhead + " \n /|\\";
dhead = " \\|/ \n " + dhead;
}
else
{
uhead = " " + uhead + " \n |";
dhead = " |\n " + dhead;
}
}
else
{
uhead = " " + uhead + "\n |";
dhead = " |\n " + dhead;
}
//add head to body
if (p[2] == "^")
{
return uhead + "\n" + art;
}
return art + "\n" + dhead;
}
else
{
//ASCII input
string[] p = s.Split('\n');
int l = p.Length - 1;
int offset = 0;
//find first non-' ' character in art
while (p[0][offset] == ' ')
{
offset++;
}
int w = 0;
if (p[0][offset] == '|')
{
//if '|', either head-down or no head.
if (offset == 0 || p[l][offset - 1] == ' ')
{
//if no space for a head to the left or no head at the bottom, no head.
return l.ToString() + ",1,^";
}
//head must have at least size 2, or else indistinguishable from no head case
w = 6;
if (p[l][offset] == '|')
{
//odd sized head
w = 7;
}
if (offset == 1 || p[l - 1][offset - 2] == ' ')
{
//not size 6 or 7
w -= 2;
if (p[l - 1][offset - 1] == ' ')
{
//not size 4 or 5
w -= 2;
}
}
return l.ToString() + "," + w.ToString() + ",v";
}
else if (p[0][offset] == '\\')
{
//head at least size 2 and not 6/7, or indistinguishable from no head.
w = 4;
if (p[0][offset + 1] == '|')
{
w = 5;
}
if (p[1][offset] == ' ')
{
w -= 2;
}
}
else
{
w = 6;
if (p[0][offset + 2] == '|')
{
w = 7;
}
}
return l.ToString() + "," + w.ToString() + ",^";
}
}
^
danv
?Jawaban:
Bean , 321 byte
Menerima input sebagai string tunggal di stdin tanpa tertinggal baris baru. Parameter akan diambil dengan cara yang sama, tetapi diformat sebagai
Parameter output program ketika input dandelion akan berada dalam format yang sama seperti di atas.
Hexdump:
JavaScript Setara:
Secara implisit mengambil stdin sebagai array string baru yang tidak diformat dalam baris baru
_
dan secara implisit menampilkan parameter sebagai triplet. Test suite di bawah ini dan demo di sini :sumber
Javascript
513391379355 byteTerima kasih kepada @Neil untuk membantu golf dari 134 byte dan @Kritixi Lithos untuk membantu golf dari 13 byte. Program ini mengasumsikan bahwa setiap dandelion ASCII yang ia coba identifikasi memiliki lebar garis 5 untuk semua baris string. yaitu: batang 2 spasi, garis vertikal 2 spasi lagi. (Itu tidak dapat mengklasifikasikan dandelion yang dibuatnya karena masalah ini)
Bagaimana itu bekerja
Fungsi memeriksa apakah argumen pertama yang diberikan memiliki panjang> 1 (adalah sebuah string). Jika argumen pertama adalah string, ini mengidentifikasi detail dandelion ASCII.
Untuk mendapatkan ketinggian dandelion, ia membagi string di sekitar karakter baris baru dan menghitung jumlah elemen - 1. Untuk mendapatkan jumlah benih, ia menghitung jumlah karakter non spasi di dua baris teratas dan dua baris terbawah. jika ada lebih banyak karakter di bagian atas, itu dinyatakan sebagai tegak dan menggunakan hitungan-1 atas, jika tidak maka dinyatakan terbalik dan menggunakan penghitungan-1 bawah. Jika tinggi total hanya 2, itu menentukan kelurusan dengan memeriksa jumlah setiap baris secara individual dan memilih sisi dengan lebih banyak karakter non spasi.
Jika tidak, fungsi menggunakan matematika bitwise untuk menetapkan nilai dari 0 hingga 7 sesuai dengan bentuk setiap tingkat dandelion yang akan ditarik sebelum mengubah setiap tingkat menjadi string yang sesuai.
Cobalah online
sumber
(x,y,z,a=[...Array(x+1)].fill(1))=>a.map(n=>', |, \\ /, \\|/,_\\ //,_\\|/_, / \\, /|\\'.split`,`[n],z<'v'?(a[0]=y&4?y-2:y,a[1]=y&4?7:1):(a[x-1]=1+(y>4)*2+(y>4)*(y&2),a[x]=y&1+(y>2)*6)).join`\n`
else
karena Anda kembali diif
bagian itu. Juga ketika saya di sini, saya hanya ingin menunjukkan bahwa beberapa fungsi sepertisplit
danjoin
tidak perlu()
ketika Anda memanggil mereka pada`
string literal-dikutip, itulah sebabnya saya tidak memasukkan mereka dalam komentar saya sebelumnya.`
s, bukan'
s atau"
s.\n
injoin`\n`
ke baris baru (seperti dalam karakter). Anda juga dapat mengubah(h>2?1:0)
to justh>2
and the(h>2?2:1)
to(h>2)+1
. tio.run/#IRiKFPython 3.6,
476453448413394 byteSolusi :
Hasil
Membuka
sumber