Mũi tên in đơn giản


23

Đối với việc luyện tập chơi gôn, tôi đã thực hiện các bài tập trong lớp Giới thiệu của bạn gái tôi. Tôi thấy rằng đối với nhiệm vụ này, có nhiều chiến lược rất gần với số lượng nhân vật và tôi chắc chắn mọi người ở đây có thể tìm thấy những cách thậm chí tốt hơn. Mặc dù tôi quan tâm nhất đến các cách để làm điều này trong Python, tôi muốn biết môn golf nào nhất mà chương trình này có thể nhận được, do đó đây là môn đánh gôn và câu trả lời ngắn nhất sẽ thắng.

Những quy định:

Nhiệm vụ được nêu dưới đây. Người dùng nên được yêu cầu nhập hai lần, mặc dù các lời nhắc không phải nói bất cứ điều gì và có thể theo một thứ tự khác.

Tiêu chuẩn áp dụng.


Bài tập 3: Mũi tên

Viết chương trình nhắc người dùng về một số cột và chúng in mẫu như hình dưới đây. Bạn có thể giả định rằng người dùng sẽ cung cấp số dương. Chương trình của bạn nên xử lý cả mũi tên trái và phải. Dưới đây là một vài ví dụ mẫu:

How many columns? 3
Direction? (l)eft or (r)ight: r
*
 *
  *
 *
*
How many columns? 5
Direction? (l)eft or (r)ight: l
    *
   *
  *
 *
*
 *
  *
   *
    *

23
Điều này trông giống như homewo ... oh, không có gì.
TessellatingHeckler

Là dấu cách trên mỗi dòng được phép?
lirtosiast

@ThomasKwa vâng.
aks.

Chúng ta có thể sử dụng các ký tự điều khiển để di chuyển con trỏ, như trong câu hỏi này không?
lirtosiast

@ThomasKwa Chắc chắn ... mặc dù tôi thực sự không chắc điều đó có nghĩa là gì và tôi rất thích nhìn thấy nó hoạt động.
aks.

Câu trả lời:


8

Bình thường, 23 byte

Có thể hoặc không thể hợp lệ, dựa trên câu trả lời cho nhận xét này . Bất kể, tôi thấy điều này gọn gàng, và, nếu nó không hợp lệ, các câu trả lời Pyth khác cũng không hợp lệ. ;) Chà, nó hợp lệ , vì rõ ràng là tôi đã bỏ lỡ điều hiển nhiên. : /

EDIT: TÔI S !!!! !!!! CÓ Lần đầu tiên! : D

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

Bản thử trực tiếp.


1
m+*\ d\*Qthay vì liệt kê điều đó Tiết kiệm 2 byte.
Jakube

7

Bình thường, 27

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

Dùng thử trực tuyến

Ý tưởng cơ bản ở đây là xây dựng một chuỗi, ví dụ 5, trông như thế này:

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

Và sau đó lật ngược nó nếu chúng ta lấy llàm đầu vào. Sau đó, chúng tôi lấy tất cả trừ những input-1dòng cuối cùng của chuỗi này và in ra.


7

Python 2, 81 79 byte

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

Vẫn có thể chơi được, nhưng chúng ta sẽ thấy :)


2
Ý tưởng tốt đẹp với việc có các đầu vào là các biến lr. Tôi đã không nhận ra đầu vào là eval'ed trong cùng một môi trường với mã.
xnor 7/10/2015

4

Bình thường, 30 28 27 byte

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

Hãy thử trực tuyến.

Rõ ràng tôi hiện đang bị ràng buộc với FryAmTheEggman với một cách tiếp cận hoàn toàn khác. (Tôi nghĩ rằng người ta thật tài tình.)

Thí dụ

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

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

Giải trình

 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

@ Pietu1998 Tôi vẫn quan tâm đến một mô tả cơ bản về những gì bạn đang làm. Tôi thấy bạn chỉ có 1 vòng lặp và không có bản đồ hoặc lambda ...
aks.

@aks. Tôi đã thêm một lời giải thích.
PurkkaKoodari

4

PowerShell, 91 85 102 byte

$c=(Read-Host)-1;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[(Read-Host)-eq'l']|%{" "*$_+"*"}
  • Lấy các cột, lưu trữ nó trong $c. Chúng tôi trừ đi một vì mỗi cột cũng có một *và chúng tôi chỉ quan tâm đến việc có bao nhiêu khoảng trống được yêu cầu.
  • Nếu giá trị được nhập là a 1, in *và thoát - phần còn lại của tập lệnh sẽ không tạo ra sự khác biệt. +
  • Phần tiếp theo đầu tiên được sự chỉ đạo và kiểm tra cho dù đó là -equal tới l, sau đó tạo ra một mảng dựa trên chỉ mục vào một mảng của mảng tự động tạo ra dựa trên giá trị của $c. Ma thuật. Về cơ bản, đây là số lượng khoảng trống trên mỗi dòng chúng ta cần.
  • Ví dụ, cho 5 rbộ sưu tập này sẽ tổ chức (0,1,2,3,4,3,2,1,0).
  • Đưa mảng và chuyển nó thành một %vòng lặp Foreach-Object , trong đó chúng ta xuất ra một chuỗi số X khoảng trắng, sau đó là*

Ví dụ sử dụng:

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

Chỉnh sửa - loại bỏ biến $ebằng cách đặt trực tiếp bộ sưu tập
Edit2 - tài khoản chính xác cho 1 cột, ngay bây giờ

+ Nếu vẫn bắt buộc phải lấy đầu vào cho hướng mũi tên 1 cột (tôi cho rằng không phải vậy), chúng ta có thể trao đổi vị trí của Read-Hostvà mất thêm một vài byte bằng cách giới thiệu lại $dbiến, cho 106 :

$c=(Read-Host)-1;$d=Read-Host;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[$d-eq'l']|%{" "*$_+"*"}

Hãy thử đặt 1 cột và bên trái - bạn nhận được một mũi tên phải 2 cột. Hãy thử đặt 1 cột và phải - bạn nhận được một lỗi 'Đối số được chỉ định trong phạm vi các giá trị hợp lệ'. Tôi nghĩ rằng 85 của bạn sẽ có thể đánh bại bằng cách tránh phạm vi nhân đôi. Nhưng tôi thậm chí không thể đến gần. Kế toán cho một mũi tên 1 cột, tôi hiện đang ở 112 ký tự. > _ <
TessellatingHeckler

1
@TessellatingHeckler Cảm ơn - đã sửa.
admBorkBork

1
Điều đó đã đẩy số điểm của bạn lên 102 và của tôi giảm xuống 102. Tôi không thể nhìn chằm chằm vào điều này lâu hơn nữa, nhưng phải có thêm một điều nữa tôi có thể xóa ...: D
TessellatingHeckler

4

TI-BASIC, 75 65 57 54 50 47 byte

Cảm ơn @ThomasKwa vì đã tính toán byte chính xác và chơi golf 10 byte .

Đã thử nghiệm trên phiên bản TI-84 + Silver của tôi.

Lần gửi TI-BASIC đầu tiên, đề xuất chơi gôn được chào đón (Tôi chưa biết nhiều thủ thuật). Nếu tên đóng một yếu tố trong bộ nhớ được hiển thị, thì cái này có 3 ký tự thay vì 1 (Tôi đã xem số byte trên máy tính của mình). Chương trình này bị giới hạn bởi các outputhạn chế của chức năng (tôi nghĩ là mũi tên có độ dài 4), nhưng tôi có thể có thể chuyển sang text, hiển thị bằng đồ họa nếu độ dài quá thấp.

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

Lưu ý rằng điều này cũng không xóa màn hình hoặc tạm dừng nó.

Tôi thực sự cảm thấy như phương trình tôi đang sử dụng có thể được đánh gôn nhiều hơn. Nó cũng cảm thấy rất sai khi loại trừ dấu ngoặc kép kết thúc.


@ThomasKwa Cảm ơn! Tôi sẽ làm điều đó bây giờ.
cole

2
Thứ hai: Anslà miễn phí, vì bạn không sử dụng nó cho đầu vào và Output(không sửa đổi Ans. Sử dụng nó, và thoát khỏi các biến A. Bạn có thể chỉ định sử dụng -2(Str1="R; không cần một điều kiện.
lirtosiast

1
@ThomasKwa cảm ơn vì những lời khuyên, có vẻ như tôi đã có cách để đi vào TI-BASIC.
cole

3
Thứ ba: Thực sự không cần nhân giá trị với -2. Chỉ cần làm Str1="Rcho dòng thứ hai. Điều đó làm cho dòng thứ tư Output(I,(1-2Ans)abs(I-L)+AL+1,"*, tạo cho bạn thêm 4 byte. Nhưng chờ đã, có một thành ngữ dành cho (1-2Ans)cácititit cos(πAns), giúp tiết kiệm một byte, cộng thêm một byte vì chúng tôi nhận được dấu ngoặc đơn mở miễn phí!
lirtosiast

1
Trở nên thành thạo chơi golf trong bất kỳ ngôn ngữ nào chỉ cần luyện tập; bạn sẽ đến đó.
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))+'*'

Hoạt động gần như giống hệt với câu trả lời Pyth của tôi, chỉ cần tính toán số lượng không gian chính xác khi đang bay.


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)+'*'}

Lưu ý nếu bạn muốn chạy lại, hãy mở PowerShell mới hoặc rv ođể đặt lại trạng thái biến.

So với cách những người khác ngắn gọn, điều này đau. [Đau ít hơn 97 so với lúc 122]. Hai phần của nó, không ai trong số họ rất ngạc nhiên; đọc một số cột, sử dụng bộ thay thế toán tử-chỉ số-toán tử mảng để lấy phần bù và chạy qua hàm sóng bắt đầu từ phần bù (và một điều chỉnh để nó không bị đổ khi thực hiện mod 0).

(Và ouch tôi đã dành nhiều năm cho chức năng sóng đó, không thể phát hiện ra sự hiểu lầm của mình và gõ tất cả các parens không phải là LISP-, trung thực).


2
Đó là máu rực rỡ.
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])

Dài hơn một chút.


Sử dụng

$ python2 test.py
3
"l"
  *
 *
*
 *
  *

Cũng rõ ràng bị hỏng. NameError: name 'l' is not defined, NameError: name 'd' is not defined.
TessellatingHeckler

Kiểm tra việc sử dụng. @TessellatingHeckler
Zach Gates

Ahh, thông minh. Nhưng mũi tên 1 cột của bạn có hai đầu mũi tên. (Tôi nghĩ rằng bạn có thể chơi golf nó hơn nữa bằng cách không lưu trữ idở tất cả, chỉ cần sử dụng range(P())if P()=='l'...)
TessellatingHeckler

Cảm ơn những lời đề nghị! Tôi cũng cố định các đầu mũi tên kép. @TessellatingHeckler
Zach Gates

Không thể kiểm tra máy atm, nhưng bạn có thể có thể làm một cái gì đó giống như f=[...][::2*('r'>input())-1]thực tế
Sp3000

2

Perl, 85 byte

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

Sử dụng:

perl 59874.pl <<< '6
r'

4
Tôi thích cách bạn đặt tên cho kịch bản của mình một cái gì đó bạn sẽ nhận ra chúng sau này ...
mbomb007

@ mbomb007 haha! Bạn biết đấy, tôi thực sự không đặt tên cho kịch bản của mình, nhưng tôi nghĩ tốt nhất nên đặt tên đơn giản cho hướng dẫn sử dụng ... simplearrows2.plcó vẻ không tốt! : P
Dom Hastings

2

PHP, 156 byte

<?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);

Tạo hai mảng, như thế này:

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

sau đó sử dụng liên kết mảng $s+$thoặc $t+$sđể kết hợp chúng và array_spliceloại bỏ phần tử ở giữa. Cuối cùng đầu ra bằng cách sử dụng<?=join()


với các đối số CLI thay vì STDIN, mã của tôi sẽ ngắn hơn 8 byte;)
Fabian Schmengler

2

Con trăn 2, 111 109 104 byte

Giải pháp khá đơn giản. Tôi chắc chắn rằng nó có thể được chơi gôn nhiều hơn. Đối với những người không biết, ~x+ncũng giống như 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," ")

Dùng thử trực tuyến

Chỉnh sửa : Điều này đã được đánh gôn vào dòng cuối cùng:

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

2

Matlab, 109 105 96 byte

Cảm ơn @beaker đã tiết kiệm cho tôi 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,:)]))

Bạn có thể lưu 9 byte nếu bạn thay thế hai dòng chèn mã ascii bằngx=x*10+32;
beaker

@beaker Rất thông minh, cảm ơn!
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{ - hai lần, tất nhiên ...

l,d=gets.split; - nhận đầu vào

l=l.to_i; - thay đổi độ dài thành số nguyên

a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a; - tạo một mảng từ phạm vi 0 đến chiều dài

(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"} - Lặp lại, biến thành chuỗi để làm mũi tên

Không chính xác là golf vĩ đại nhất từng có, nhưng, hey.


1

PowerShell, 98 94 byte

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

Nếu tôi có thể tìm cách đặt Read-Host cho hướng bên trong vòng lặp đối tượng foreach nhưng chỉ nhắc cho nó một lần tôi có thể lưu một vài byte.

Chỉnh sửa: 94 byte. Thay vì kiểm tra bên trái, kiểm tra bên phải (đơn giản hóa vòng lặp).

98 byte gốc:

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

Đặt lại $_biến - Hobbit khó khăn. Rất thông minh, và tôi đã học được điều gì đó ngày hôm nay.
admBorkBork

@TimmyD Rất gian xảo. Và sau đó chuyển câu lệnh if để tiết kiệm hơn nữa.
Jonathan Leech-Pepin

0

> <> , 60 byte

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

2 byte lãng phí ở dòng dưới cùng, thật khó chịu!

Do cách thức hoạt động của đầu vào trong> <>, không thể 'chờ' cho đầu vào - i lệnh sẽ kiểm tra xem một ký tự đầu vào có sẵn trên STDIN không. Nếu có, nó sẽ đẩy giá trị ASCII của ký tự đó và đẩy -1 nếu không.

Điều này có nghĩa là, để sử dụng chương trình này, số lượng và hướng phải sẵn sàng trên STDIN, ví dụ: 3r đối với mũi tên cỡ 3 chỉ về bên phải. Tôi không chắc nếu điều đó không đủ điều kiện cho mục này, hãy cho tôi biết suy nghĩ của bạn: o)

Tôi cũng sẽ viết một mô tả nếu bất cứ ai muốn một.


Theo một nghĩa nào đó, nó sẽ đợi đầu vào nếu bạn cố chạy nó trong shell, vì vậy tôi nghĩ điều đó tốt. Tôi quan tâm nhiều hơn đến thực tế rằng điều này hy vọng đầu vào chỉ là một chữ số (trừ khi tôi có ý định nhập vào :10?)
Sp3000

Một điểm tuyệt vời, tôi đã không nghĩ về đầu vào hơn 9. Quay lại bảng vẽ!
Sok

1
Tôi đã để lại một bình luận về câu hỏi chính để làm rõ, chỉ trong trường hợp
Sp3000

0

PHP, 154 byte

Nó trông thực sự lặp đi lặp lại, nhưng nó thực hiện mong muốn:

$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);

Chạy từ dòng lệnh như:

php arrow.php 5 l
php arrow.php 5 r

-1

Python, 88 byte

Đã chỉnh sửa

n=input()-1
x=raw_input()>'l'
for i in range(2*n+1):print" "*(n*x+(-1)**x*abs(n-i))+"*"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.