สร้างสามเหลี่ยมมุมฉาก


10

ในการท้าทายนี้คุณจะต้องใช้ตัวเลขสองตัว (คั่นด้วยช่องว่าง) เป็นอินพุตและเอาต์พุตสามเหลี่ยมมุมฉาก ASCII ที่สร้างขึ้นจากxs

จำนวนแรกจะเป็นความกว้างและความสูงของรูปสามเหลี่ยมที่คุณควรออก ตัวเลขที่สองจะเป็นมุมที่มุมขวาจะเป็นมุมที่มีหมายเลข 1 ถึง 4 เริ่มต้นที่มุมบนซ้ายและเรียงตามลำดับการอ่านภาษาอังกฤษ:

1    2



3    4

ตัวอย่างเช่น (อินพุตและเอาต์พุตสามเหลี่ยมที่เกี่ยวข้อง):

INPUT | 3 1 | 3 2 | 3 3 | 3 4
------+-----+-----+-----+----
 OUT- | xxx | xxx | x   |   x
 PUT  | xx  |  xx | xx  |  xx
      | x   |   x | xxx | xxx

ผลลัพธ์ของโปรแกรมของคุณจะต้องตรงกับตัวอย่างเหล่านี้ทุกประการสำหรับอินพุตที่เกี่ยวข้อง

อินพุตจะถูกต้องเสมอ: หมายเลขแรกจะเป็นจำนวนเต็ม≥1และหมายเลขที่สองจะเป็น 1, 2, 3 หรือ 4

นี่คือ ; รหัสที่สั้นที่สุด (ในจำนวนตัวอักษร) ชนะ

คำตอบ:


9

APL (30)

{' x'[1+(⍎⍵⌷'⌽+⍉⊖')≤/¨⍳2⍴⍺]}/⎕

คำอธิบาย:

  • {... }/⎕: ลดฟังก์ชั่นที่กำหนดเหนืออินพุต (ดังนั้นหากอินพุทมี 2 ตัวเลขเพียงแค่เรียกฟังก์ชั่นที่มีสองตัวเลขเหล่านี้เป็นหมายเลขซ้ายและหมายเลขที่ถูกต้อง)
  • ≤/¨⍳2⍴⍺: Make -by- ประสานเมทริกซ์และกำหนดตำแหน่งนั้นที่พิกัด X ไม่ได้มากกว่าพิกัด Y ให้ bitfield
  • (⍎⍵⌷'⌽+⍉⊖'): เลือกฟังก์ชั่นการแปลงที่กำหนดโดยการใส่สามเหลี่ยมด้านขวาขึ้น
  • ' x'[1+... ]: เพิ่มหนึ่งบิตใน bitfield และใช้ผลลัพธ์เป็นดัชนีในสตริง' x'ดังนั้นควรเว้นช่องว่างสำหรับ 0 และx1

1
ยิ่งฉันอ่าน APL มากขึ้นเท่าไหร่ฉันก็ยิ่งรู้ว่า APL เป็นฝันร้ายที่แยกวิเคราะห์ มันจะไม่ต้องประเมิน(⍎⍵⌷'functions')ส่วนจริงก่อนที่จะตัดสินใจว่าจะตีความคำสั่งทั้งหมดหรือไม่ 1+(⍵⌷'12+')|40พิจารณาตัวอย่างเช่น มันจะไม่รู้ด้วยซ้ำว่า|เป็น monadic หรือ dyadic ก่อนที่จะใส่ส่วนที่วงเล็บ แผนผังไวยากรณ์ทั้งหมดมีการเปลี่ยนแปลงโดยขึ้นอยู่กับการประเมินผล
protist

ฉันหมายถึง1+(⍎⍵⌷'12+')|40... จะไม่ให้ฉันแก้ไข
protist

2
@protist: ความจริงสนุก: f ← { [ }ไม่ให้ข้อผิดพลาด! f 1÷0ให้ ... ข้อผิดพลาดโดเมน ! (เพราะหารด้วยศูนย์) เฉพาะเมื่อคุณเรียกใช้ฟังก์ชันเช่นf 123คุณได้รับข้อผิดพลาดทางไวยากรณ์ ดู: imgur.com/jtmdi4B
marinus

โดยเหล่าทวยเทพ !!!! นั่นทำให้ใจฉันแตกเล็กน้อย ฉันได้เล่นกับการเขียนล่าม APL บางอย่างและนั่นแสดงให้เห็นถึงความชั่วร้ายที่ยิ่งใหญ่ในการใช้งานในปัจจุบัน ฮ่าฮ่าฮ่า
ประท้วง

ดูเหมือนว่าจะมีฟังก์ชั่นใช้งานอยู่เป็นประจำโดยกระบวนการคล้ายการขยายตัวแบบมหภาคที่น่าเกลียด มันค่อนข้างจะบ่งบอกถึงการขยายตัวของข้อความในสถานที่
protist

6

ทับทิม, 116 115 109 96

ฉันจะเริ่มต้นด้วยวิธีแก้ปัญหาของตัวเอง

i=gets.split
s=i[0].to_i
(i[1]<?3?s.downto(1):1..s).map{|x|t=?x*x
puts /2|4/=~i[1]?t.rjust(s):t}

ฉันเพิ่งรู้ว่าฉันจะถูกตีด้วยโซลูชั่น GolfScript 30 ตัวอักษรเกือบจะในทันที: P

ขอบคุณ minitech สำหรับการกำจัดตัวละคร 19 ตัว (ว้าว)!


แทนที่จะคุณสามารถใช้==0 บันทึกอักขระอื่น นอกจากนี้จะทำเคล็ดลับใช่มั้ย <1?x*xputs i[1]%2<1?t.rjust(s):t}
Ry-

อืม…คุณมีช่องว่างรอบ ๆ?? จำเป็นไหม? r=นอกจากนี้ผมคิดว่าคุณสามารถทำสิ่งเดียวกันกับ
Ry-

@minitech มีความจำเป็น - พื้นที่นำเพราะมิฉะนั้นแยกวิเคราะห์1?เป็นโทเค็นเดียวและพื้นที่ต่อท้ายเพราะมิฉะนั้นแยกวิเคราะห์เป็น?t(ซึ่งเทียบเท่ากับ't') คุณเสนอการปรับโครงสร้างชิ้นrส่วนอย่างไร
Doorknob

คุณลองหรือยัง ทับทิมรุ่นไหน? ทำงานได้ดีสำหรับฉันใน 2.0
Ry-

@minitech Odd มันไม่ทำงานมาก่อนและตอนนี้ก็ทำได้: P ขอบคุณ
Doorknob

4

GolfScript ( 34 33 ตัวอักษร)

~\:^,{)' x'^*$>^<0(2$?%}%\(2&(%n*

มันเป็นความอัปยศที่มุมนั้นไม่ได้ถูกนับในการหมุนเพราะมันจะช่วยให้การสร้างอาร์เรย์หนึ่งแถวนั้นดูหรูหรากว่าเดิมn:

~\:^,{)' x'^*$>^<}%{-1%zip}@)*n*

3

C # - 195

using System;class P{static void Main(string[]a){int G=int.Parse(
a[0]),O=int.Parse(a[1]),L=O<3?0:G+1,F=O<3?-G:1;G=O%2>0?-G:G;for(;
F<L;F++)Console.Write("{0,"+G+"}\n","".PadRight(F<0?-F:F,'x'));}}

จัดรูปแบบ:

using System;
class P
{
    static void Main(string[] a)
    {
        int G = int.Parse(a[0]),
            O = int.Parse(a[1]),
            L = O < 3 ? 0 : G + 1,
            F = O < 3 ? -G : 1;

        G = O % 2 > 0 ? -G : G;

        for(; F < L; F++)
            Console.Write("{0," + G + "}\n", "".PadRight(F < 0 ? -F : F, 'x'));
    }
}

ป้อนคำอธิบายรูปภาพที่นี่


อินพุตต้องคั่นด้วยช่องว่างไม่ใช่คั่นด้วยเครื่องหมายจุลภาค
Doorknob

@ Doorknob: ภาพหน้าจอมาจากโปรแกรมทดสอบที่ฉันเลือกที่จะแสดงการป้อนข้อมูลด้วยเครื่องหมายจุลภาค อินพุตเป็นตัวคั่นช่องว่างเมื่อคุณเรียกใช้งานโปรแกรมแม้ว่าจุดนั้นจะถูกคำนวณเนื่องจากแอปพลิเคชันคอนโซล C # ทั้งหมดได้รับอินพุตเป็นอาร์เรย์ของสตริง
Igby Largeman

2

Golfscript, 39 36 35 ตัวอักษร

~\:y,{' '*'x'y*+y<0~2$?%}%-1@2>?%n*

การสาธิตสด: http://golfscript.apphb.com/?c=OyczIDInCn5cOnkseycgJyoneCd5Kit5PC0xIDIkPyV9JS0xQDI%2BPyVuKgo%3D

แย่มากมันไม่ใช่ 30 ตัวอักษรตามที่ร้องขอ


การแทนที่1${-1%}*ด้วย-1 2$?%และ\2>{-1%}*ด้วย\2>-1\?%จะทำให้คุณมีอักขระ 2 ตัว
ความผันผวน

@ ความผันผวนขอบคุณขอบคุณที่รวมอยู่
John Dvorak

@ ความผันผวน-1 2สามารถเขียนได้0~2
Howard

และสำหรับถ่านอีกตัวเราต้องปรับโครงสร้างอีกเล็กน้อย:~(\:y,{{>'x '=}+y,%0~2$?%}%\2&(%n*
โฮเวิร์ด

2

Mathematica 122 (104?)

g@s_ := ({w, p} = ToExpression@StringSplit@s; 
   Array[If[Switch[p, 1, # <= (w + 1 - #2), 2, # <= #2, 3, # >= #2, 4, # > (w - #2)],
   "X", ""] &, {w, w}]) // Grid

GraphicsGrid[{{g["12 1"], g["12 3"]}}]

วิธีการอื่น


ภายใต้การตีความเสรีของ "เอาท์พุท" ดังต่อไปนี้ (104 ตัวอักษร) จะทำงาน

f@s_ := ({w, p} = ToExpression@StringSplit@s; 
  Graphics[Polygon@Delete[{{w, 0}, {0, 0}, {w, w}, {0, w}}, p], Axes -> True])


f["50 4"]

สามเหลี่ยม


หากอนุญาตให้ป้อนข้อมูลในรูปแบบของรายการต่อไปนี้ (75 ตัวอักษร) จะพอเพียง:

f[{w_, p_}] := 
 Graphics[Polygon@Delete[{{w, 0}, {0, 0}, {w, w}, {0, w}}, p], Axes -> True]


เทคนิคนี้ขัดกับกฎ: P
Doorknob

มันละเมิดกฎอะไร
DavidC

กราฟอินพุต / เอาท์พุตที่ฉันใส่ แม้ว่าถ่าน 122 ตัวนั้นดีแม้ว่า ฉันแก้ไขคำถามเพื่อชี้แจง
Doorknob

อุ่ย ฉันคิดว่าแผนภูมิเป็นเพียงตัวอย่าง
DavidC

ฉันเพิ่งวาง ASCII art ในครั้งแรก
DavidC

2

J, 59 55 42 38 37 36 ตัวอักษร

หากได้รับอนุญาตให้มีการป้อนข้อมูลในตอนท้ายของโปรแกรม:

(|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/

ถ้าไม่ใช่ (สำหรับ 3 ตัวอักษรพิเศษ):

t=.(|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/

การใช้งาน:

   (|:@|.@]^:([:|[+_7*2<[)[:[\'x'$~])~/3 4
  x
 xx
xxx

หรือ

   t 3 4
  x
 xx
xxx

ฉันคิดว่านี่อาจสั้นกว่านี้เล็กน้อยเนื่องจากตัวละครส่วนใหญ่เป็นตัวยึดและฝาครอบเพื่อให้อยู่ในรูปแบบที่แน่นอน

แก้ไข
การใช้ gerund และกริยาของวาระตัดตัวละครออกไปสองสามตัว แต่ยังมีตัวพิมพ์ใหญ่มากเกินไปสำหรับความชอบของฉัน

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

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

แก้ไข 4 ใช้คำนำหน้าแทนคำต่อท้ายเพื่อตัดอักขระ เปิดใช้วิธีการสร้างรายการที่ไม่บันทึกอักขระใด ๆ คนเสพเวจมรรค

แก้ไข 5
ใช้สูตรเพื่อตัดอักขระอื่น ยังคงรู้สึกว่าบิตนี้อาจสั้นกว่านี้ได้



1

Python 3, 91

ตามคำตอบของอภิสิทธิ์

ดัดแปลงสร้างสตริงการส่งออกเพื่อหลีกเลี่ยงผลรวมของสตริงและน่าเกลียด1s rangeใน Python 3 กำจัดสิ่งที่raw_อยู่ข้างในraw_inputออกไป แต่จำเป็นต้องใช้//สำหรับการหารจำนวนเต็มและเพิ่ม parantheses printเพื่อที่จะประหยัดอักขระเพียงตัวเดียว

w,d=map(int,input().split())
for e in range(w)[::d//3*2-1]:print('%*s'%(w-d%2*2*w,'x'*-~e))

0

ลูกแมว , 140

def s{><replicate}
getLine{' 'neChar}span{readInt fromSome}toBoth->{w n}
w 0 if(n 2>){><}..
{<>w>< -{'X's}{' 's}both if(n 2%0=){><}cat say}each

Ungolfed:

getLine
{' ' neChar} span
{readInt fromSome} toBoth
->{ width corner }

width 0
if (corner 2 >):
  swap
..

{ ->index
  'X' index replicate
  ' ' (width index -) replicate
  if (corner 2 % 0 =):
    swap
  cat say
} each

หลักฐานที่แสดงว่าฉันต้องใช้งานการบรรทุกเกินพิกัดและกำหนดค่าไลบรารีมาตรฐาน

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