Dalam sebuah pertanyaan stackoverflow sekarang dihapus, seseorang diposting berikut:
Menulis sebuah program atau fungsi untuk mencetak pola alternating di *
dan #
berdasarkan bilangan bulat tertentu n
. Beberapa contoh:
Input: n=1
Output:
*
Input n=5
Output:
*####
###**
***##
###**
*####
Input: n=8
Output:
*#######
######**
***#####
####****
****####
#####***
**######
#######*
Sejak itu tampak seperti cukup keren kode-golf tantangan, ini dia.
Bagaimana pola-pola ini dibangun?
Baris pertama dimulai dengan satu *
, diikuti oleh n-1
jumlah tertinggal #
.
Baris kedua kemudian berisi dua *
, dengan n-2
jumlah pemimpin #
.
Baris ketiga dimulai dengan tiga *
, diikuti oleh n-3
jumlah tertinggal #
.
dll.
Setelah kami sampai di tengah ( n/2
), kita menghitung kembali lagi dengan jumlah *
yang dapat dilihat pada contoh di atas.
CATATAN bahwa untuk nomor masukan aneh pasangan yang terbalik garis (jadi pertama dan terakhir; kedua dan di sebelah terakhir; dll) yang persis sama. Dalam n=5
contoh, baris pertama dan terakhir adalah *####
; baris kedua dan berikutnya adalah ###**
.
Untuk nomor masukan bahkan namun pasangan yang terbalik dari garis terbalik. Dalam n=8
contoh, baris pertama dan terakhir adalah *#######
dan #######*
; baris kedua dan berikutnya adalah ######**
dan **######
; dll.
Aturan tantangan:
- Anda dapat menggunakan dua yang berbeda dicetak karakter bukan
*
dan#
. Anda bisa menggunakanA
danB
;3
dan7
;<
dan>
; dll Silahkan negara dalam jawaban Anda apa yang telah Anda gunakan. - Anda dapat mengasumsikan
n
akan menjadi bilangan bulat positif (>= 1
) - Anda diperbolehkan untuk output daftar / array string untuk setiap baris atau matriks 2D karakter, bukannya mencetak mereka untuk STDOUT.
Aturan umum:
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'. - Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program lengkap. Panggilanmu.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, tambahkan link dengan tes untuk kode Anda.
- Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.
Test case (pertama n=1
melalui n=10
)
*
*#
#*
*##
#**
*##
*###
##**
**##
###*
*####
###**
***##
###**
*####
*#####
####**
***###
###***
**####
#####*
*######
#####**
***####
###****
***####
#####**
*######
*#######
######**
***#####
####****
****####
#####***
**######
#######*
*########
#######**
***######
#####****
*****####
#####****
***######
#######**
*########
*#########
########**
***#######
######****
*****#####
#####*****
****######
#######***
**########
#########*
Jawaban:
Jelly , 9 byte
Cobalah online!
Penjelasan
sumber
Python 2 , 62 bytes
Cobalah online!
Penggunaan
x
dan ruang.Baris dihitung seperti ini:
Menggunakan
%*s
specifier untuk memilih antaran
dan-n
.sumber
Perl 6 , 57 byte
Cobalah online!
Menggunakan metode yang sama dengan jawaban Lynn Python . Keluaran menggunakan
*
dan ruang.sumber
MATL,
343118 byteCobalah di MATL Online
Menggunakan 0 untuk * dan 1 untuk #. Berdasarkan jawaban Lynn's Jelly .
Jawabannya lebih tua, 31 bytes:
Cobalah di MATL Online
Gunakan 1 untuk * dan 0 untuk #.
sumber
APL (Dyalog Classic) , 18 byte
Cobalah online!
output
AB
bukan*#
⎕
input yang dievaluasi n⍳⎕
vektor0 1 ... n-1
⊢⌊⌽
min (⌊
) antara mereka (⊢
) dan sebaliknya mereka (⌽
) - lihat kereta⊂>⊢⌊⌽
di mana⍳
vektor secara keseluruhan (⊂
) kurang dari masing-masing⊢⌊⌽
- kembalikan vektor vektor boolean (0/1)⊢∘⌽\
membalikkan setiap vektor lainnya↑
campur menjadi sebuah matriks⎕a
alfabet bahasa Inggris huruf besar,'AB
...Z'
⎕a[
]
ganti0
1
dengan'A'
'B'
sumber
⎕a[...}
mengonversinya menjadiA
danB
tanpa spasi lebih pendek daripada mempertahankannya sebagai0
dan1
tanpa spasi mengingat Anda pernah menggunakannya, tetapi hanya ingin tahu apakah ada banyak perbedaan dalam byte jika Anda menyimpannya sebagai0
dan1
.⎕d[
...]
atau⊃¨⍕¨
... Dalam ekspresi yang terakhir⍕¨
adalah "memformat masing-masing" - ternyata setiap nomor menjadi char bersarang vektor , jadi kita perlu "pertama masing-masing "(⊃¨
) untuk mendapatkan skalar char saja (dan karenanya tidak ada spasi saat mencetak).Arang , 21 bytes
Cobalah online! Penggunaan
0
dan1
. Tautan adalah untuk versi versi kode dan termasuk§*#
yang menerjemahkan output ke*
dan#
dalam pertanyaan. Penjelasan:sumber
Jelly ,
1215 byte+3 memperbaiki
n=1
bug tepi-kasus :(Program lengkap yang menerima integer yang mencetak output seperti yang didefinisikan dalam OP menggunakan
0
dan1
untuk*
dan#
masing - masing.Cobalah online!
Bagaimana?
sumber
Jelly , 15 byte
Cobalah online!
program penuh.
*
=1
#
=0
sumber
Java 10, 145 byte
Semua ternary membuatnya agak berantakan, tetapi berfungsi dengan baik. Saya mencoba merata loop bersarang, dan berbagai hal lain, tetapi mereka hanya meningkatkan jumlah byte. Cobalah online di sini .
Tidak Terkumpul:
Java
811,179127 byteCobalah secara online di sini (TIO tidak memiliki Java 11 belum, jadi ini menggunakan metode kustom yang menghasilkan jumlah byte sama dengan
String#repeat()
).Terimakasih untuk Kevin Cruijssen karena bermain golf 52 byte!
Tidak Terkumpul:
sumber
"*".repeat(...)
dan"#".repeat(...)
(serta mengembalikan String alih-alih mencetak langsung dan bermain golfn-j-1
ken+~j
):n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}
repeat()
metode itu sangat bagus untuk bermain golf.Lua ,
148133 BytesCobalah online!
-15 byte terima kasih kepada @KevinCruijssen dan @JoKing.
sumber
(n+1)/2
untuk-~n/2
;or n-i+1
untukor-~n-i
;i%2==0
untuki%2<1
; danreverse() or
untukreverse()or
. Juga, versi TIO dan byte-count Anda keduanya mengandung semi-colon tambahan yang sepertinya tidak diperlukan. Jawaban pertama yang bagus. +1 dari saya. Dan selamat datang di PPCG! :)-~n
dilakukan dalam saran Anda? Ini pasti berhasil, tetapi saya tidak mengerti mengapa.~
adalah operator negasi bitwise unary. Yang penting untuk codegolfing adalah,~i
memiliki nilai yang sama-i-1
. Karena itu kita dapat menggunakan-~i
sebagai gantii+1
dan~-i
bukani-1
. Ini berguna dalam dua kasus, yang bisa saya manfaatkan dalam jawaban Anda: menyingkirkan tanda kurung, karena-
dan~
memiliki operator yang lebih diutamakan daripada operasi matematika lainnya,(n+1)/2
karena itu bisa jadi-~n/2
. Dan bagian berguna lainnya adalah untuk menghilangkan ruang dalam beberapa kasus, seperti yang saya lakukan denganor-~n-i
.~
untukx+1
danx-1
dan Gunakan unary~
untuka-b-1
dana+b+1
. Semua kiat umum, serta kiat khusus bahasa ( Tip untuk bermain golf di Lua dalam kasus ini), mungkin menarik untuk dibaca. :)Kotlin , 86 byte
Cobalah online!
Penggunaan
x
dan ruang sebagai simbol output. Berasal dari Lynn Answersumber
Perl 5 +
-pa -MPOSIX -M5.010
, 58 byteCobalah online!
sumber
C (gcc) ,
10499 byteCobalah online!
sumber
C (gcc) ,
118108 byteYang ini tidak akan menang, tapi ini pendekatan yang berbeda (atau setidaknya, saya pikir begitu!) Daripada melakukan manipulasi string, saya menggunakan fakta bahwa10x- 1 lebih [ 1 .. n ] = { 9 , 99 , 999 , . . . } , yang kemudian dapat dikalikan untuk mendapatkan pola yang sesuai;
printf()
kemudian melakukan zero-padding untuk pembenaran benar.Sayangnya,
int
hanya memiliki jangkauan yang cukup untuk melakukan hingga 9 digit (pada platform 32-bit), jadi Anda perlu beralih kelong
pola yang lebih besar; bahasa yang secara alami melakukan aritmatika MP mungkin dapat menggunakan ini untuk sesuatu.Terima kasih kepada ceilingcat untuk sarannya.
Cobalah online!
Bukti konsep bahwa ini bekerja dengan aritmatika MP:
C # (Mono C # compiler) ,
187165 byte(143 byte + 22 byte untuk
using System.Numerics;
header)Cobalah online!
sumber
Vim, 99 penekanan tombol
Itu selalu menarik untuk mencoba melakukan vim dengan argumen input. Ini sangat tidak alami, jadi itu tidak akan menjadi sangat pendek. Mungkin ada pendekatan bagus lainnya untuk ini.
Input diasumsikan dengan sendirinya dalam buffer. Register diasumsikan kosong. Editor diasumsikan cukup tinggi untuk menampung hasil tanpa menggulir (ini secara teknis dapat dihindari dengan mengorbankan beberapa penekanan tombol).
Penjelasan
Dan di base64, dengan karakter yang sebenarnya (masukkan input
input
dan penekanan tombolkeys
dan jalankan menggunakanvim -u NONE -s keys input
)sumber
R , 75 byte
Cobalah online!
n
sebagai parameter dan mengembalikan sebuah matriks di0/1
mana0
sesuai dengan'*'
dan1
sesuai dengan'#'
sumber
K (ngn / k) , 22 byte
Cobalah online!
{
}
berfungsi dengan argumenx
!x
daftar(0;1;
...;x-1)
i:
menetapkan kei
i&|i
minima (&
) darii
dan kebalikannya (|
)i>/:
bandingkan dengan lebih dari (>
)i
terhadap setiap elemen dari daftar di sebelah kanan (/:
) - kembalikan matriks boolean (daftar daftar)i|:/'
untuk setiap ('
) j dalami
, mundur (|:
- kita perlu:
memaksa|
unary) elemen yang sesuai j kali (n f/ x
berlakuf
n
kali padax
). Secara efektif, balikkan setiap baris lainnya."*#"
gunakan elemen matriks sebagai indeks dalam string"*#"
sumber