ลูกศรพิมพ์ง่าย


23

สำหรับการฝึกตีกอล์ฟฉันได้ทำภารกิจในอินโทร Intro ของชั้นแฟนของฉัน ฉันพบว่าสำหรับการมอบหมายนี้มีหลายกลยุทธ์ที่เข้ามาใกล้มากในการนับตัวละครและฉันแน่ใจว่าผู้คนที่นี่สามารถหาวิธีที่ดียิ่งขึ้น แม้ว่าฉันจะสนใจวิธีการทำสิ่งนี้มากที่สุดใน Python ฉันต้องการทราบว่าโปรแกรมนี้สามารถรับ golfed ได้มากที่สุดดังนั้นนี่คือ code golf และคำตอบที่สั้นที่สุดชนะ

กฎระเบียบ:

งานที่ได้รับมอบหมายระบุไว้ด้านล่าง ผู้ใช้ควรได้รับการขอให้ป้อนข้อมูลสองครั้งแม้ว่าข้อความแจ้งไม่จำเป็นต้องพูดอะไรและสามารถเรียงลำดับอื่นได้

ช่องโหว่มาตรฐานใช้


การบ้าน 3: ลูกศร

เขียนโปรแกรมที่พร้อมท์ให้ผู้ใช้ใส่จำนวนคอลัมน์และพิมพ์ลวดลายตามที่เห็นด้านล่าง คุณสามารถสันนิษฐานได้ว่าผู้ใช้จะใส่ตัวเลขบวก โปรแกรมของคุณควรจัดการกับลูกศรซ้ายและขวา นี่คือตัวอย่างการทดสอบสองสามตัวอย่าง:

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

23
ดูเหมือนว่าจะเป็นแบบนี้ ... โอ้ไม่เป็นไร
TessellatingHeckler

อนุญาตให้เว้นวรรคต่อท้ายในแต่ละบรรทัดหรือไม่
lirtosiast

@ThomasKwa ใช่
aks

เราสามารถใช้ตัวควบคุมเพื่อย้ายเคอร์เซอร์ได้เหมือนในคำถามนี้หรือไม่?
lirtosiast

@ThomasKwa แน่นอนว่า ... ถึงแม้ว่าฉันจะไม่แน่ใจว่านั่นหมายความว่าอย่างไรและฉันก็สนใจที่จะเห็นมันในทางปฏิบัติ
aks

คำตอบ:


8

Pyth, 23 ไบต์

อาจหรืออาจไม่ถูกต้องขึ้นอยู่กับคำตอบของความคิดเห็นนี้ โดยไม่คำนึงถึงฉันพบว่าระเบียบนี้และหากไม่ถูกต้องคำตอบ Pyth อื่นก็ไม่ถูกต้องเช่นกัน ;)ดีก็ถูกต้องเพราะผมเห็นได้ชัดว่าพลาดที่เห็นได้ชัดอย่างโจ๋งครึ่ม : /

แก้ไข:ฉันชนะ !!!! YESSS !!!! ครั้งแรก! : D

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

การสาธิตสด


1
m+*\ d\*Qแทนที่จะเป็นสิ่งที่แจกแจง บันทึก 2 ไบต์
Jakube

7

Pyth, 27

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

ลองออนไลน์

แนวคิดพื้นฐานที่นี่คือการสร้างหนึ่งสตริงที่ว่า 5 กล่าวว่ามีลักษณะเช่นนี้:

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

แล้วพลิกมันกลับหัวถ้าเราเอามาlใส่ จากนั้นเราก็นำทั้งหมดยกเว้นinput-1บรรทัดสุดท้ายของสตริงนี้และพิมพ์ออกมา


7

Python 2, 81 79 ไบต์

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

อาจยังเล่นกอล์ฟได้ แต่เราจะเห็น :)


2
ความคิดที่ดีกับการมีปัจจัยการผลิตเป็นตัวแปรและl rฉันไม่ได้ตระหนักว่าอินพุตนั้นeval'ed ในสภาพแวดล้อมเดียวกันกับรหัส
xnor

4

Pyth, 30 28 27 ไบต์

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

ลองออนไลน์

เห็นได้ชัดว่าในปัจจุบันฉันเชื่อมโยงกับFryAmTheEggmanด้วยวิธีที่แตกต่างอย่างสิ้นเชิง (ฉันคิดว่าอันนั้นฉลาด)

ตัวอย่าง

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

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

คำอธิบาย

 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 ฉันยังสนใจในคำอธิบายพื้นฐานของสิ่งที่คุณทำ ฉันเห็นคุณมีเพียง 1 วงและไม่มีแผนที่หรือแลมบ์ดา ...
aks

@aks ฉันเพิ่มคำอธิบาย
PurkkaKoodari

4

PowerShell, 91 85 102 ไบต์

$c=(Read-Host)-1;if(!$c){"*";exit}(@(0..$c+($c-1)..0),@($c..0+1..$c))[(Read-Host)-eq'l']|%{" "*$_+"*"}
  • Gets $cคอลัมน์เก็บไว้ใน เราลบหนึ่งคอลัมน์เพราะแต่ละคอลัมน์มี*และเราสนใจเฉพาะจำนวนช่องว่างที่ต้องการ
  • หากค่าที่ป้อนคือ a 1ให้พิมพ์*และออก - ส่วนที่เหลือของสคริปต์จะไม่สร้างความแตกต่าง +
  • ส่วนถัดไปก่อนจะได้รับทิศทางและทดสอบว่าเป็น-equal lหรือไม่จากนั้นสร้างอาร์เรย์ตามดัชนีในอาร์เรย์ของอาร์เรย์ที่สร้างขึ้นแบบไดนามิกโดยยึดตามค่าของ$cแล้วสร้างอาร์เรย์ขึ้นอยู่กับการจัดทำดัชนีลงในอาร์เรย์ของอาร์เรย์แบบไดนามิกที่สร้างขึ้นอยู่กับมูลค่าของที่มายากล. นี่คือจำนวนช่องว่างต่อบรรทัดที่เราต้องการ
  • ตัวอย่างเช่นสำหรับคอลเลกชันนี้จะถือ5 r(0,1,2,3,4,3,2,1,0)
  • นำอาเรย์และไพพ์ไปไว้ใน%ลูปForeach-Object โดยที่เราส่งออกสตริงของจำนวนช่องว่าง X แล้วตามด้วย*

ตัวอย่างการใช้งาน:

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

แก้ไข - ลบตัวแปร$eโดยการวางท่อคอลเลกชันโดยตรง
Edit2 - ถูกต้องสำหรับบัญชี 1 คอลัมน์ตอนนี้

+หากยังจำเป็นต้องป้อนทิศทางสำหรับลูกศร 1 คอลัมน์ (ฉันบอกว่าไม่ได้) เราสามารถสลับตำแหน่งRead-Hostและเสียสองสามไบต์ได้มากขึ้นด้วยการแนะนำ$dตัวแปรอีกครั้งสำหรับ106 :

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

ลองวาง 1 คอลัมน์แล้วซ้าย - คุณจะได้ลูกศรขวา 2 คอลัมน์ ลองวาง 1 คอลัมน์และถูกต้องคุณจะได้รับข้อผิดพลาด 'อาร์กิวเมนต์ที่ระบุนอกช่วงค่าที่ถูกต้อง' ฉันคิดว่า 85 ของคุณจะเป็นไปได้ที่จะเอาชนะโดยหลีกเลี่ยงการเพิ่มขึ้นเป็นสองเท่า แต่ฉันไม่สามารถเข้าใกล้ได้ บัญชีสำหรับลูกศร 1 คอลัมน์ตอนนี้ฉันอยู่ที่ 112 ตัวอักษร > _ <
TessellatingHeckler

1
@TessellatingHeckler ขอบคุณ - แก้ไขแล้ว
AdmBorkBork

1
นั่นทำให้คุณเพิ่มขึ้นถึง 102 และของฉันลดลงเป็น 102 ฉันไม่สามารถที่จะจ้องมองสิ่งนี้ได้อีกต่อไป แต่ต้องมีอีกหนึ่งที่ฉันสามารถลบได้ ... : D
TessellatingHeckler

4

TI-BASIC, 75 65 57 54 50 47 ไบต์

ขอขอบคุณที่ @ThomasKwa สำหรับการคำนวณไบต์ที่ถูกต้องและการเล่นกอล์ฟ10 ไบต์

ทดสอบกับรุ่นTI-84 + Silver ของฉัน

การยื่น TI-BASIC ครั้งแรกยินดีให้คำแนะนำการเล่นกอล์ฟ (ฉันยังไม่ทราบเทคนิคมากมาย) ถ้าชื่อเล่นเป็นปัจจัยในหน่วยความจำที่แสดงคนนี้เป็น 3 ตัวอักษรแทน 1 (ฉันดูที่จำนวนไบต์ในเครื่องคิดเลขของฉันเอง) โปรแกรมนี้ถูก จำกัด โดยoutputข้อ จำกัด ของฟังก์ชั่น (ฉันคิดว่าเป็นลูกศรยาว 4) แต่ฉันอาจเปลี่ยนไปใช้textซึ่งจะแสดงภาพกราฟิกหากความยาวต่ำเกินไป

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

โปรดทราบว่านี่ยังไม่ได้ล้างหน้าจอหรือหยุดชั่วคราว

ฉันรู้สึกเหมือนสมการที่ฉันใช้สามารถเล่นกอล์ฟได้มากกว่านี้ นอกจากนี้ยังรู้สึกผิดมากที่จะไม่รวมเครื่องหมายคำพูดสิ้นสุด


@ThomasKwa ขอบคุณ! ฉันจะทำตอนนี้
โคล

2
ประการที่สอง: Ansเป็นฟรีเพราะคุณไม่ได้ใช้มันสำหรับการป้อนข้อมูลและไม่ได้ปรับเปลี่ยนOutput( ใช้มันและได้รับการกำจัดของตัวแปรAns Aคุณสามารถกำหนดโดยใช้-2(Str1="R; ไม่จำเป็นต้องมีเงื่อนไข
lirtosiast

1
@ThomasKwa ขอบคุณสำหรับเคล็ดลับดูเหมือนว่าฉันมีวิธีที่จะไปใน TI-BASIC
โคล

3
ประการที่สาม: ไม่จำเป็นต้องคูณมูลค่าด้วย-2จริงๆ ทำแค่Str1="Rบรรทัดที่สอง นั่นทำให้บรรทัดที่สี่Output(I,(1-2Ans)abs(I-L)+AL+1,"*ซึ่งทำให้คุณเพิ่ม 4 ไบต์ แต่เดี๋ยวก่อนมันมีสำนวนสำหรับ(1-2Ans)- มันcos(πAns)ซึ่งช่วยประหยัดหนึ่งไบต์และอีกหนึ่งเพราะเราได้รับวงเล็บเปิดฟรี!
lirtosiast

1
การมีความเชี่ยวชาญในการเล่นกอล์ฟในภาษาใด ๆ จำเป็นต้องมีการฝึกฝนเท่านั้น คุณจะไปถึงที่นั่น
lirtosiast

2

Python 2, 89 ไบต์

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

ทำงานเกือบเหมือนกันกับคำตอบ Pyth ของฉันเพียงแค่คำนวณจำนวนช่องว่างที่ถูกต้องได้ทันที


2

PowerShell, 104 102 97 ไบต์

# 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 หากคุณต้องการเรียกใช้อีกครั้งเปิด PowerShell ใหม่หรือrv oเพื่อรีเซ็ตสถานะตัวแปร

เมื่อเปรียบเทียบกับคนอื่น ๆ [เจ็บน้อยกว่า 97 มากกว่าที่ 122] สองส่วนกับมันไม่น่าแปลกใจนัก อ่านคอลัมน์จำนวนหนึ่งใช้ array-index-ternary-operator-ทดแทนเพื่อรับ offset และวิ่งผ่านฟังก์ชั่นคลื่นเริ่มต้นที่ offset (และปรับแต่งเพื่อไม่ให้ล้มลงmod 0)

(และอุ๊ยฉันใช้เวลานานในฟังก์ชั่นคลื่นไม่สามารถมองเห็นความเข้าใจผิดของฉันและพิมพ์ทั้งหมดมันไม่ใช่ -LISP-, parens ซื่อสัตย์)


2
นั่นเป็นเลือดที่ยอดเยี่ยม
AdmBorkBork

2

Python 2, 98 89 ไบต์

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

ความยาวเพิ่มขึ้นเล็กน้อย


การใช้

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

ก็เห็นได้ชัดว่าหัก NameError: name 'l' is not defined, NameError: name 'd' is not defined.
TessellatingHeckler

ตรวจสอบการใช้งาน @TessellatingHeckler
Zach Gates

อ่าฉลาด แต่ลูกศร 1 คอลัมน์ของคุณมีหัวลูกศรสองหัว (ฉันคิดว่าคุณสามารถเล่นกอล์ฟต่อไปได้โดยไม่ต้องเก็บiและdใช้เพียงแค่range(P())และif P()=='l'... )
TessellatingHeckler

ขอบคุณสำหรับคำแนะนำ! ฉันยังแก้ไขหัวลูกศรคู่ @TessellatingHeckler
Zach Gates

ไม่สามารถทดสอบ atm ได้ แต่คุณอาจทำสิ่งที่f=[...][::2*('r'>input())-1]เป็นจริงได้
Sp3000

2

Perl, 85 ไบต์

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

การใช้งาน:

perl 59874.pl <<< '6
r'

4
ฉันชอบวิธีที่คุณตั้งชื่อสคริปต์ของคุณบางสิ่งบางอย่างที่คุณจะจำได้ในภายหลัง ...
mbomb007

@ mbomb007 ฮ่าฮ่า! คุณรู้ไหมว่าฉันไม่ได้ตั้งชื่อสคริปต์ของฉัน แต่ฉันคิดว่ามันเป็นการดีที่สุดที่จะตั้งชื่อสิ่งที่ง่ายสำหรับคำแนะนำการใช้งาน ... simplearrows2.plดูเหมือนจะไม่ดี! : P
Dom Hastings

2

PHP, 156 ไบต์

<?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 = [
    0 => "  *"
    1 => " *"
    2 => "*"
]
$s = [
    -1 => "*"
    -2 => " *"
    -3 => "  *"
]

จากนั้นใช้อาร์เรย์สหภาพ$s+$tหรือ$t+$sรวมเข้าด้วยกันและarray_spliceเพื่อลบองค์ประกอบที่อยู่ตรงกลาง ในที่สุดก็ใช้เอาท์พุท<?=join()


มีข้อโต้แย้ง CLI แทน stdin รหัสของฉันจะเป็น 8 ไบต์สั้น;)
เฟเบียน Schmengler

2

Python 2, 111 109 104 ไบต์

ทางออกที่ง่ายสวย ฉันแน่ใจว่ามันสามารถตีกอล์ฟได้มากกว่านี้ สำหรับผู้ที่ไม่ทราบว่าเป็นเช่นเดียวกับ~x+nn-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," ")

ลองออนไลน์

แก้ไข : นี่คือ golfed ในบรรทัดสุดท้าย:

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

2

Matlab, 109 105 96 ไบต์

ขอขอบคุณที่ @beaker สำหรับการบันทึกฉัน 9 ไบต์

x=eye(input(''));if(input('','s')<114),x=fliplr(x);end
x=x*10+32;disp(char([x;x(end-1:-1:1,:)]))

คุณสามารถบันทึก 9 ไบต์ได้หากคุณแทนที่ทั้งสองบรรทัดโดยใส่รหัส ASCII ด้วยx=x*10+32;
บีกเกอร์

@beaker ฉลาดมากขอบคุณ!
Luis Mendo

1

ทับทิม 118 ไบต์

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{ - สองครั้งแน่นอน ...

l,d=gets.split; - รับอินพุต

l=l.to_i; - เปลี่ยนความยาวเป็นจำนวนเต็ม

a=(d=="r"?(0..l-1):(l-1).downto(0)).to_a; - สร้างอาร์เรย์จากช่วง 0 ถึงความยาว

(a+a[0..-2].reverse).each{|x| puts "#{' '*x}*"} - วนซ้ำให้กลายเป็นสตริงเพื่อสร้างลูกศร

ไม่ใช่สนามกอล์ฟที่ยิ่งใหญ่ที่สุดเท่าที่เคยมีมา แต่เฮ้


1

PowerShell, 98 94 ไบต์

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

หากฉันสามารถหาวิธีที่จะนำ Read-Host สำหรับทิศทางภายในลูป foreach-object แต่จะถามเฉพาะเมื่อมันสามารถบันทึกสองสามไบต์ได้

แก้ไข: 94 ไบต์ แทนที่จะทำการทดสอบทางซ้ายให้ทดสอบทางขวา (ลดความซับซ้อนของลูป)

ต้นฉบับ 98 ไบต์:

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

การรีเซ็ต$_ตัวแปร - ฮอบบิทที่ซับซ้อน ฉลาดมากและฉันเรียนรู้บางอย่างในวันนี้
AdmBorkBork

@ TimmyD มีเล่ห์เหลี่ยมมาก จากนั้นสลับคำสั่ง if เพื่อบันทึกมากขึ้น
Jonathan Leech-Pepin

0

> <> , 60 ไบต์

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

2 ไบต์ที่สูญเสียไปที่บรรทัดล่างทำให้เกิดการระคายเคือง!

เนื่องจากอินพุตทำงานใน> <> จึงไม่สามารถ 'รอ' อินพุตได้ - iคำสั่งจะตรวจสอบว่าอักขระอินพุตมีอยู่ใน STDIN หรือไม่ ถ้ามีมันจะส่งค่า ASCII ของตัวละครนั้นและกด -1 ถ้าไม่

ซึ่งหมายความว่าในการใช้โปรแกรมนี้หมายเลขและทิศทางต้องพร้อมบน STDIN เช่น 3rลูกศรขนาด 3 ที่ชี้ไปทางขวา ฉันไม่แน่ใจว่าสิ่งนั้นตัดสิทธิ์รายการนี้หรือไม่โปรดแจ้งให้เราทราบความคิดเห็นของคุณ: o)

ฉันจะเขียนคำอธิบายหากใครต้องการ


ในความรู้สึกมันจะรออินพุตถ้าคุณพยายามเรียกใช้มันในเชลล์ดังนั้นฉันคิดว่าไม่เป็นไร ฉันกังวลมากขึ้นกับความจริงที่ว่าสิ่งนี้คาดว่าอินพุตจะเป็นตัวเลขหลักเดียว (ยกเว้นว่าฉันต้องการป้อนข้อมูลเป็น:เวลา 10?)
Sp3000

เป็นจุดที่ยอดเยี่ยมฉันไม่ได้คิดถึงอินพุตมากกว่า 9 กลับไปที่กระดานวาดภาพ!
Sok

1
ฉันได้แสดงความคิดเห็นต่อคำถามหลักเพื่อการชี้แจงในกรณี
Sp3000

0

PHP, 154 ไบต์

มันดูซ้ำ ๆ จริงๆ แต่มันต้องการ:

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

ทำงานจากบรรทัดคำสั่งเช่น:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.