Panah Pencetakan Sederhana

23

Untuk latihan golf, saya telah melakukan tugas di kelas Intro to Python pacar saya. Saya menemukan bahwa untuk tugas ini, ada beberapa strategi yang mendekati jumlah karakter, dan saya yakin orang-orang di sini dapat menemukan cara yang lebih baik. Walaupun saya paling tertarik dengan cara-cara melakukan ini dengan Python, saya ingin tahu yang paling golf yang bisa didapat oleh program ini, oleh karena itu ini adalah kode golf dan jawaban terpendek yang menang.

Aturan:

Tugas diuraikan di bawah ini. Pengguna harus diminta untuk memasukkan dua kali, meskipun petunjuknya tidak harus mengatakan apa-apa, dan bisa dalam urutan yang berbeda.

Celah standar berlaku.


Tugas 3: Panah

Tulis program yang meminta pengguna untuk sejumlah kolom, dan mereka mencetak pola seperti yang terlihat di bawah ini. Anda dapat mengasumsikan bahwa pengguna akan memberikan angka positif. Program Anda harus menangani panah kiri dan kanan. Berikut adalah beberapa contoh runnings:

How many columns? 3
Direction? (l)eft or (r)ight: r
*
 *
  *
 *
*
How many columns? 5
Direction? (l)eft or (r)ight: l
    *
   *
  *
 *
*
 *
  *
   *
    *
aks.
sumber
23
Ini seperti rumah ... oh, tidak apa-apa.
TessellatingHeckler 615
Apakah spasi tambahan di setiap baris diizinkan?
lirtosiast
@ Thomas, ya.
aks.
Bisakah kita menggunakan karakter kontrol untuk memindahkan kursor, seperti dalam pertanyaan ini ?
lirtosiast
@ThomasKwa Tentu ... walaupun saya jujur ​​tidak yakin apa artinya itu dan saya tertarik melihatnya dalam aksi.
aks.

Jawaban:

8

Pyth, 23 byte

Mungkin atau mungkin tidak valid, berdasarkan jawaban atas komentar ini . Apapun, saya menemukan ini rapi, dan, jika tidak valid, jawaban Pyth lainnya juga tidak valid. ;) Yah, ini valid , karena saya rupanya merindukan yang jelas-jelas jelas. : /

EDIT: SAYA MENANG !!!! YESS !!!! Pertama kalinya! : D

j+_J_Wqz\r.e+*dkb*\*QtJ

Demo langsung.

kirbyfan64sos
sumber
1
m+*\ d\*Qbukannya enumerate thingy itu. Menghemat 2 byte.
Jakube
7

Pyth, 27

j<tQ_Wqz\l++Jm+*\ d\*Q_PJtJ

Cobalah online

Ide dasar di sini adalah untuk membangun satu string yang, misalnya 5, terlihat seperti ini:

*
 *
  *
   *
    *
   *
  *
 *
*
 *
  *
   *
    *

Dan kemudian balikkan jika kita mendapatkan linput kita. Lalu kami mengambil semua kecuali input-1baris terakhir dari string ini dan mencetaknya.

FryAmTheEggman
sumber
7

Python 2, 81 79 byte

c=input()
r=1
l=0
exec"print' '*(%sabs(c-r))+'*';r+=1;"%("c+~"*input())*(2*c-1)

Mungkin masih bisa golf, tapi kita akan lihat :)

Sp3000
sumber
2
Gagasan bagus dengan input menjadi variabel ldan r. Saya tidak menyadari inputnya sudah evaldi lingkungan yang sama dengan kode.
xnor
4

Pyth, 30 28 27 byte

VtyQ+*+*tQJqz\r_WJ.a-hNQd\*

Cobalah online.

Rupanya saya saat ini terikat dengan FryAmTheEggman dengan pendekatan yang sama sekali berbeda. (Saya pikir orang itu cerdik.)

Contoh

$ python pyth.py spa.p
r
3
*
 *
  *
 *
*

$ python pyth.py spa.p
l
5
    *
   *
  *
 *
*
 *
  *
   *
    *

Penjelasan

 tyQ                              (columns * 2) - 1
V                               loop N through range(the above)
        tQ                                columns - 1 (maximum number of spaces)
       *                                multiplied by
           qz\r                           1 if direction == "r" else 0
          J                               also save that 1 or 0 to J
      +                               plus
                  .a-hNQ                    abs(N - columns + 1)
               _WJ                      negate that if direction == "r"
     *                  d           that many spaces
    +                    \*       add the star and print
PurkkaKoodari
sumber
@ Pietu1998 Saya masih tertarik dengan deskripsi dasar tentang apa yang Anda lakukan. Saya melihat Anda hanya memiliki 1 loop dan tidak ada peta atau lambda ...
aks.
@ ak. Saya menambahkan penjelasan.
PurkkaKoodari
4

PowerShell, 91 85 102 Bytes

$c=(Read-Host)-1;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[(Read-Host)-eq'l']|%{" "*$_+"*"}
  • Mendapat kolom, menyimpannya dalam $c. Kami mengurangi satu karena setiap kolom juga memiliki *dan kami hanya tertarik pada berapa banyak ruang yang diperlukan.
  • Jika nilai yang dimasukkan adalah 1, cetak *dan keluar - sisa skrip tidak membuat perbedaan. +
  • Bagian berikutnya pertama mendapatkan arah dan menguji apakah itu memang -equntuk l, kemudian membuat array berdasarkan pengindeksan ke dalam array yang dihasilkan secara dinamis berdasarkan pada nilai $c. Sihir. Pada dasarnya, ini adalah berapa banyak ruang per baris yang kita butuhkan.
  • Misalnya, untuk 5 rkoleksi ini akan tahan (0,1,2,3,4,3,2,1,0).
  • Membawa array dan pipa itu ke %loop Foreach-Object , di mana kita menghasilkan string sejumlah X ruang, lalu*

Contoh penggunaan:

PS C:\Tools\Scripts\golfing> .\simple-printing-arrows.ps1
6
r
*
 *
  *
   *
    *
     *
    *
   *
  *
 *
*

Edit - hapus variabel $edengan mem- pipkan koleksi langsung
Edit2 - dengan benar menyumbang 1 kolom, sekarang

+ Jika masih wajib untuk mengambil input untuk arah panah 1-kolom (saya berpendapat tidak), kita dapat menukar posisi Read-Hostdan kehilangan beberapa byte lagi dengan memperkenalkan kembali $dvariabel, untuk 106 :

$c=(Read-Host)-1;$d=Read-Host;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[$d-eq'l']|%{" "*$_+"*"}
AdmBorkBork
sumber
Coba letakkan 1 kolom, dan ke kiri - Anda mendapatkan panah kanan 2-kolom. Coba letakkan 1 kolom dan kanan - Anda mendapatkan kesalahan 'Spesifik argumen di luar rentang nilai yang valid'. Saya pikir 85 Anda mungkin untuk dikalahkan dengan menghindari rentang dua kali lipat. Tetapi saya bahkan tidak bisa mendekati. Akuntansi untuk panah 1 kolom, saya saat ini di 112 karakter. > _ <
TessellatingHeckler
1
@TessellatingHeckler Terima kasih - dikoreksi.
AdmBorkBork
1
Itu mendorong Anda hingga 102 dan milik saya turun ke 102. Saya tidak bisa telanjang untuk menatap ini lebih lama, tetapi harus ada satu lagi yang bisa saya hapus ...: D
TessellatingHeckler
4

TI-BASIC, 75 65 57 54 50 47 Bytes

Terima kasih kepada @ThomasKwa untuk perhitungan byte yang benar dan bermain golf 10 byte .

Diuji pada TI-84 + Edisi Perak saya.

Penyerahan TI-BASIC pertama, saran bermain golf disambut (saya belum tahu banyak trik). Jika nama memainkan faktor dalam memori yang ditunjukkan, yang ini adalah 3 karakter, bukan 1 (saya melihat hitungan byte pada kalkulator saya sendiri). Program ini dibatasi oleh outputpembatasan fungsi (saya pikir untuk panah dengan panjang 4), tapi saya mungkin bisa beralih ke text, yang menampilkan grafis jika itu terlalu rendah dari panjang.

Prompt L,Str1
Str1="R
For(I,1,2L-1
Output(I,(1-2Ans)abs(I-L)+AnsL+1,"*
End

Perhatikan bahwa ini juga tidak menghapus layar atau menghentikannya.

Saya benar-benar merasa bahwa persamaan yang saya gunakan dapat lebih banyak bermain golf. Rasanya juga salah untuk mengecualikan tanda kutip akhir.

cole
sumber
@ThomasKwa Terima kasih! Saya akan melakukannya sekarang.
cole
2
Kedua: Ansgratis, karena Anda tidak menggunakannya untuk input dan Output(tidak memodifikasi Ans. Gunakan itu, dan singkirkan variabel A. Anda dapat menetapkan menggunakan -2(Str1="R; tidak perlu untuk bersyarat.
lirtosiast
1
@ThomasKwa terima kasih untuk tipsnya, sepertinya saya punya cara untuk masuk dalam TI-BASIC.
cole
3
Ketiga: Benar-benar tidak perlu mengalikan nilainya dengan -2. Lakukan saja Str1="Runtuk baris kedua. Itu membuat baris keempat Output(I,(1-2Ans)abs(I-L)+AL+1,"*, yang memberi Anda 4 byte lebih. Tapi tunggu, ada ungkapan untuk (1-2Ans)- itu cos(πAns), yang menghemat satu byte, ditambah satu lagi karena kita mendapatkan kurung buka secara gratis!
lirtosiast
1
Menjadi mahir dalam bermain golf dalam bahasa apa pun hanya membutuhkan latihan; kamu akan sampai di sana.
lirtosiast
2

Python 2, 89 byte

c=input()-1
d=raw_input()>'l'
for j in range(2*c+1):print' '*(d*c-(2*d-1)*abs(c-j))+'*'

Bekerja hampir identik dengan jawaban Pyth saya, hanya menghitung jumlah spasi yang benar dengan cepat.

PurkkaKoodari
sumber
2

PowerShell, 104 102 97 byte

# 97 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];($j=2*$c)..0|%{' '*[Math]::Abs($o++%($j+!$j)-$c)+'*'}

3
r
*
 *
  *
 *
*

# Previous 102 version:
$o=@(($c=(read-host)-1))[(read-host)-eq'l'];(2*$c)..0|%{
' '*[Math]::Abs($o++%(2*($c+(!$c+0)))-$c)+'*'}

NB. jika Anda ingin menjalankannya lagi, buka PowerShell baru, atau rv ountuk mengatur ulang keadaan variabel.

Dibandingkan dengan betapa singkatnya yang lain, ini menyakitkan. [Sakitnya kurang di 97 daripada di 122]. Dua bagian untuk itu, tak satu pun dari mereka yang sangat mengejutkan; membaca sejumlah kolom, menggunakan array-index-ternary-operator-subtitusi untuk mendapatkan offset, dan berjalan melalui fungsi gelombang mulai dari offset (dan tweak agar tidak jatuh saat melakukan mod 0).

(Dan aduh saya menghabiskan waktu lama pada fungsi gelombang itu, tidak dapat menemukan kesalahpahaman saya, dan mengetik semua itu-bukan-LISP-, orangtua yang jujur).

TessellatingHeckler
sumber
2
Itu sangat brilian.
AdmBorkBork
2

Python 2, 98 89 byte

f=[' '*n+'*'for n in range(input())]
if'l'==input():f=f[::-1]
print'\n'.join(f+f[-2::-1])

Sedikit lebih panjang.


Pemakaian

$ python2 test.py
3
"l"
  *
 *
*
 *
  *
Zach Gates
sumber
Rupanya juga rusak. NameError: name 'l' is not defined, NameError: name 'd' is not defined.
TessellatingHeckler
Periksa penggunaannya. @TessellatingHeckler
Zach Gates
Ahh, pintar. Tetapi panah 1 kolom Anda memiliki dua kepala panah. (Saya pikir Anda bisa bermain golf lebih jauh dengan tidak menyimpan idan dsama sekali, hanya menggunakan range(P())dan if P()=='l'...)
TessellatingHeckler
Terima kasih atas sarannya! Saya juga memperbaiki kepala panah ganda. @TessellatingHeckler
Zach Gates
Tidak dapat menguji atm, tetapi Anda mungkin dapat melakukan sesuatu seperti f=[...][::2*('r'>input())-1]sebenarnya
Sp3000
2

Perl, 85 byte

($-,$_)=<>;$,=$/;@}=map$"x$_.'*',0..--$-;@}=reverse@}if/l/;print@},map$}[$--$_],1..$-

Pemakaian:

perl 59874.pl <<< '6
r'
Dom Hastings
sumber
4
Saya suka bagaimana Anda memberi nama skrip Anda sesuatu yang akan Anda kenali nanti ...
mbomb007
@ mbomb007 haha! Anda tahu, saya sebenarnya tidak menyebutkan nama skrip saya, tapi saya pikir yang terbaik adalah memberi nama sesuatu yang sederhana untuk instruksi penggunaan ... simplearrows2.plsepertinya tidak bagus! : P
Dom Hastings
2

PHP, 156 Bytes

<?for($c=1+fgets(STDIN);--$c;$s[-$c]=$t[]=sprintf("%{$c}s","*"));arsort($s);$a=fgetc(STDIN)==r?$s+$t:$t+$s;array_splice($a,count($a)/2,1)?><?=join("
",$a);

Membuat dua array, seperti ini:

$t = [
    0 => "  *"
    1 => " *"
    2 => "*"
]
$s = [
    -1 => "*"
    -2 => " *"
    -3 => "  *"
]

kemudian menggunakan gabungan array $s+$tatau $t+$suntuk menggabungkannya dan array_spliceuntuk menghapus elemen di tengah. Akhirnya keluaran menggunakan<?=join()

Fabian Schmengler
sumber
dengan argumen CLI bukannya STDIN kode saya akan lebih pendek 8 byte;)
Fabian Schmengler
2

Python 2, 111 109 104 byte

Solusi yang cukup sederhana. Saya yakin bisa bermain golf lebih banyak. Bagi mereka yang tidak tahu, ~x+nsama dengan n-1-x.

n=input()
r=range(n)
r+=r[-2::-1]
for i in[r,[~x+n for x in r]]['r'>raw_input()]:print"*".rjust(i+1," ")

Cobalah online

Sunting : Ini golf ke baris terakhir:

if'r'>d:r=[~x+n for x in r]
for i in r:print"*".rjust(i+1," ")
mbomb007
sumber
2

Matlab, 109 105 96 byte

Terima kasih kepada @beaker karena telah menyelamatkan saya 9 byte .

x=eye(input(''));if(input('','s')<114),x=fliplr(x);end
x=x*10+32;disp(char([x;x(end-1:-1:1,:)]))
Luis Mendo
sumber
Anda dapat menyimpan 9 byte jika Anda mengganti dua baris dengan memasukkan kode ascii denganx=x*10+32;
gelas
@ speaker Sangat pintar, terima kasih!
Luis Mendo
1

Ruby, 118 byte

2.times{l,d=gets.split;l=l.to_i;a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a;(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"}}

2.times{ - dua kali, tentu saja ...

l,d=gets.split; - dapatkan input

l=l.to_i; - ubah panjang menjadi bilangan bulat

a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a; - buat array dari rentang 0 hingga panjang

(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"} - iterate, berubah menjadi string untuk membuat panah

Bukan golf terbaik yang pernah ada, tapi, hei.

PotatoOmeletteSandwich
sumber
1

PowerShell, 98 94 Bytes

$c=(Read-Host)-1;$d=Read-Host;if($c){$c..0+1..$c|%{if($d-eq'r'){$_=$c-$_}' '*$_+'*'}}else{'*'}

Jika saya bisa menemukan cara untuk meletakkan Read-Host untuk arah di dalam foreach-object loop tetapi hanya meminta untuk itu sekali saya mungkin dapat menyimpan beberapa byte.

Edit: 94 byte. Alih-alih menguji untuk kiri, tes untuk kanan (menyederhanakan loop).

98 byte asli:

$c=(Read-Host)-1;$d=Read-Host;if($c){0..$c+($c-1)..0|%{if($d-eq'l'){$_=$c-$_}' '*$_+'*'}}else{'*'}
Jonathan Leech-Pepin
sumber
Mengatur ulang $_variabel - Hobbit rumit. Sangat pintar, dan saya belajar sesuatu hari ini.
AdmBorkBork
@TimmyD Sangat rumit. Dan kemudian beralih pernyataan if untuk menyimpan lebih banyak lagi.
Jonathan Leech-Pepin
0

> <> , 60 byte

i"1l"i=&-:&*&:?!\:1-:}c0.
~/?:<-$?&::&;!?l<oao"*"
1/  \o" "-

2 byte terbuang pada intinya, sungguh menjengkelkan!

Karena cara kerja input di> <>, tidak mungkin untuk 'menunggu' untuk input - iperintah memeriksa apakah karakter input tersedia di STDIN. Jika ada, itu mendorong nilai ASCII dari karakter itu, dan mendorong -1 jika tidak.

Ini berarti bahwa, untuk menggunakan program ini, jumlah dan arah harus sudah siap di STDIN, misalnya 3runtuk panah ukuran 3 yang menunjuk ke kanan. Saya tidak yakin apakah itu mendiskualifikasi entri ini, beri tahu saya pendapat Anda: o)

Saya juga akan menulis deskripsi jika ada yang mau.

Sok
sumber
Dalam arti ia menunggu input jika Anda mencoba menjalankannya di shell, jadi saya pikir itu baik-baik saja. Saya lebih peduli dengan fakta bahwa ini mengharapkan input menjadi satu digit sekalipun (kecuali saya dimaksudkan untuk memasukkan :10?)
Sp3000
Poin yang sangat bagus, saya tidak memikirkan input lebih dari 9. Kembali ke papan gambar!
Sok
1
Saya telah meninggalkan komentar pada pertanyaan utama untuk klarifikasi, untuk berjaga
Sp3000
0

PHP, 154 byte

Ini terlihat sangat berulang, tetapi melakukan yang diinginkan:

$c=$argv[1];$b=l==$argv[2]?1:0;$a=$b?$c:-1;function a($a){echo strrev(str_pad('*',$a))."\n";}while($b?--$a:++$a<$c)a($a+1);while($b?++$a<=$c:1<$a--)a($a);

Berjalan dari baris perintah seperti:

php arrow.php 5 l
php arrow.php 5 r
masukkan nama pengguna di sini
sumber
-1

Python, 88 Bytes

Diedit

n=input()-1
x=raw_input()>'l'
for i in range(2*n+1):print" "*(n*x+(-1)**x*abs(n-i))+"*"
orgesleka
sumber