ตัวเลขสามเหลี่ยม


16

(ไม่ไม่ใช่คนเหล่านั้น )

ความท้าทาย

คุณจะได้รับสองอินพุต ครั้งแรกที่เป็นจำนวนเต็มบวกn > 0ซึ่งจะใช้ในการออกสามเหลี่ยมขวาของตัวเลขn x n 1, 2, 3, ... nสามเหลี่ยมนี้เริ่มต้นที่มุมหนึ่งและเพิ่มขึ้นในแนวนอนและแนวตั้งโดยหนึ่งและทแยงมุมสอง ดูตัวอย่างด้านล่างสำหรับการชี้แจง เก็บหนึ่งช่องว่างระหว่างคอลัมน์และเก็บหมายเลขทั้งหมดไว้ในคอลัมน์ที่ต้องการ (นี่คือหลังจากทั้งหมด)

อินพุตที่สองxเป็นหนึ่งในสี่อักขระ ASCII เดี่ยวที่แตกต่างกันที่คุณเลือกซึ่งจะกำหนดมุมเริ่มต้นของรูปสามเหลี่ยม ตัวอย่างเช่นคุณสามารถใช้1,2,3,4หรือa,b,c,dหรือ#,*,!,)เป็นต้นโปรดระบุในคำตอบของคุณเกี่ยวกับการวางแนว

สำหรับการชี้แจงในความท้าทายนี้ฉันจะใช้1,2,3,4ซึ่งจะสอดคล้องกับ1สำหรับบนซ้าย2สำหรับบนขวาและตามเข็มนาฬิกา

ตัวอย่าง

ตัวอย่างเช่นสำหรับn = 5, x = 1การส่งออกต่อไปนี้:

1 2 3 4 5
2 3 4 5
3 4 5
4 5
5

สำหรับการป้อนข้อมูลn = 11, x = 1การส่งออกต่อไปนี้ (หมายเหตุพื้นที่พิเศษเพื่อหลักเดียวจะจัดชิดขวา):

 1  2  3  4  5  6  7  8  9 10 11
 2  3  4  5  6  7  8  9 10 11
 3  4  5  6  7  8  9 10 11
 4  5  6  7  8  9 10 11
 5  6  7  8  9 10 11
 6  7  8  9 10 11
 7  8  9 10 11
 8  9 10 11
 9 10 11
10 11
11

ด้วยอินพุทn=6และx=2เอาท์พุท:

6 5 4 3 2 1
  6 5 4 3 2
    6 5 4 3
      6 5 4
        6 5
          6

ด้วยอินพุตn = 3และx = 4เอาต์พุต:

3
2 3
1 2 3

ด้วยอินพุตn = 1และxเอาต์พุตใด ๆ:

1

กฎระเบียบ

  • ขึ้นบรรทัดใหม่ / ต่อท้ายหรือช่องว่างอื่น ๆ เป็นตัวเลือกโดยมีเงื่อนไขว่าตัวเลขเข้าแถวอย่างเหมาะสม (ตัวอย่างเช่นช่องว่างต่อท้ายเพื่อสร้างเอาต์พุตสี่เหลี่ยมเป็นที่ยอมรับ)
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • เอาท์พุทจะสามารถคอนโซลบันทึกเป็นภาพกลับเป็นรายการของสตริง ฯลฯใด ๆ รูปแบบที่สะดวกและได้รับอนุญาต
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

คำถามนี้เป็นคำถามเพียงแค่นี้ + นี้ ฉันยังไม่รู้ แต่ฉันรู้สึกว่านี่เป็นสิ่งที่ล่อลวงหนึ่งในนั้น
โพสต์ Rock Garf Hunter

4
@WeatWizard ฉันไม่คิดว่าคำตอบจากความท้าทายเหล่านั้นสามารถแก้ไขได้เล็กน้อยเพื่อแข่งขันที่นี่
AdmBorkBork

พูดตามตรงฉันรู้ว่าผู้คนมากมายพูดว่านั่นคือสิ่งที่ทำให้เกิดความซ้ำซ้อน แต่เท่าที่ฉันสามารถบอกได้ว่าไม่ใช่กฎ สำหรับฉันสำเนาที่ซ้ำกันเป็นคำถามที่ไม่ได้เสนออะไรในแง่ของความท้าทายที่ไม่ได้มีให้โดยคำถามที่มีอยู่
โพสต์ร็อค Garf Hunter

2
@WheatWizard ฉันทามติ Meta
AdmBorkBork

ฉันอ่านคำตอบนั้นแล้ว คำแนะนำในบริบทที่เฉพาะเจาะจงมากขึ้นไม่ใช่การพิจารณาคดีสากล
โพสต์ร็อค Garf Hunter

คำตอบ:



1

MATL , 18 ไบต์

:&YhiX!VZ{' 0'2:YX

nการป้อนข้อมูลแรกคือ อินพุตที่สองคือxซึ่งสามารถเป็น:

  • 0: บนซ้าย
  • 1: ล่างซ้าย
  • 2: ล่างขวา
  • 3: ด้านบนขวา

(หรืออาจเป็นจำนวนเต็มอื่น ๆ ซึ่งตีความโมดูโล 4)

ลองที่MATL Online!


1

APL (Dyalog) 29 ไบต์

{' '@(=∘0)⌽∘⍉⍣⍺⊢↑⌽(⍳+⍵-⊢)¨⍳⍵}

ลองออนไลน์!

อย่างไร?

¨⍳⍵- สำหรับแต่ละiช่วงn

(⍳+⍵-⊢)- ผลิตช่วงของiด้วยการเพิ่ม vectorized ของn - i

↑⌽ - ย้อนกลับและแบน

⌽∘⍉ - หมุนไปทางขวา

⍣⍺⊢- xครั้ง

' '@(=∘0) - ลบเลขศูนย์


1

JavaScript 130 128 154 142 138 135 133 ไบต์

* แก้ไขปัญหาการขยายเต็ม

A=(n,x)=>(j=>{for(;n--;s=x<3?S+`
`+s:s+S+`
`)
for(S=O,i=j;i;S=i-->n^~-x%3?X+S:S+X)
X=(i>n?i+O:O).padStart(j.length+1)})(n+=s=O="")||s

console.log(A(6,1))
console.log(A(6,2))
console.log(A(6,3))
console.log(A(6,4))

console.log(A(12,1))
console.log(A(12,2))
console.log(A(12,3))
console.log(A(12,4))

/* 154 solution
A=(n,x)=>{s=""
for(j=n;n--;s=x<3?S+`
`+s:s+S+`
`)
for(S="",i=j;i;S=i-->n?~-x%3?S+X:X+S:~-x%3?X+S:S+X)
X=(i>n?i+"":"").padStart((j+"").length+1)
return s
}

142 solution
A=(n,x)=>{s=""
for(j=n;n--;s=x<3?S+`
`+s:s+S+`
`)
for(S="",i=j;i;S=i-->n ^ ~-x%3?X+S:S+X)
X=(i>n?i+"":"").padStart((j+"").length+1)
return s
}

138 solution
A=(n,x)=>{s=""
for(j=n+" ";n--;s=x<3?S+`
`+s:s+S+`
`)
for(S="",i=+j;i;S=i-->n^~-x%3?X+S:S+X)
X=(i>n?i+"":"").padStart(j.length)
return s
}

135 solution
A=(n,x)=>{for(j=n+=s=O="";n--;s=x<3?S+`
`+s:s+S+`
`)
for(S=O,i=j;i;S=i-->n^~-x%3?X+S:S+X)
X=(i>n?i+O:O).padStart(j.length+1)
return s
}
*/


@AdmBorkBork ฉันคิดว่าฉันซ่อมได้แล้วตอนนี้
DanielIndie

0

Python 2 , 124 120 bytes

n,x=input()
r=range(n)
for l in zip(*[(r+[n]+['']*i)[-n:]for i in r][::1-x%4/2*2])[::1-x/3*2]:print' %%%ds'%len(`n`)*n%l

ลองออนไลน์! หรือลองใช้กรณีทดสอบทั้งหมด

(r+[n]+['']*i)[-n:]จะเพิ่มสตริงว่างลงในรายการตัวเลขและสับให้มีขนาดที่เหมาะสมzipด้วย[::1-x%4/2*2]และ[::1-x/3*2]จะทำการหมุนและ%%%ds'%len(`n`)*nจะสร้างสตริงสำหรับ fomating (เช่น' %3s %3s %3s'...) ที่จะใช้ในแต่ละหมายเลข + รายการสตริงว่าง


0

Mathematica, 89 ไบต์

(R=Reverse;Grid[{#&,R/@#&,R[R/@#]&,R@#&}[[#2]]@PadRight@Array[Range[#,s]&,s=#]/. 0->""])&   

นี่เป็นอีกวิธีการหนึ่งที่ใช้งานได้ใน TIO

Mathematica, 122 ไบต์

(R=Reverse;StringRiffle[""<>ToString/@#&/@({#&,R/@#&,R[R/@#]&,R@#&}[[#2]]@PadRight@Array[#~Range~s&,s=#]/. 0->" "),"\n"])&


ลองออนไลน์!


0

ถ่านขนาด 39 ไบต์

Nτ≔EτEτ◧׋⁺ιλτI⊕⁺ιλLθσFN≔⮌EσEσ§μλσEσ⪫ι 

ลองออนไลน์! หมายเหตุ: พื้นที่ต่อท้าย การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ค่าที่สองคือจำนวนการหมุนทวนเข็มนาฬิกาดังนั้น 0 คือซ้ายบน, ซ้ายล่าง 1, 2 ล่างขวา, 3 ขวาบน คำอธิบาย:

Nτ                                      Assign the first input as an integer
   EτEτ                                 Map in two dimensions
               ⊕⁺ιλ                     Sum of zero-indexed coordinates plus 1
              I                         Cast to string
         ‹⁺ιλτ                          Is this the upper left triangle?
        ×                               Repeat the string once if so
       ◧           Lθ                   Pad to length of first input
  ≔                  σ                  Assign to variable
                          EσEσ§μλ       Transpose the array
                         ⮌              Reflect the array, giving a rotation
                        ≔        σ      Reassign to variable
                       N                Second input as an integer
                      F                 Repeat that many times
                                  Eσ    Map over array
                                    ⪫ι  Join with spaces and implicitly print

0

Javascript (ES6), 241 222 214 ไบต์

let f = 

    (n,x)=>(L=x=>(''+x).length,M=b=>x&b?(c,i,a)=>a[n-1-i]:c=>c,Array(n).fill(b=' ').map((c,i)=>b.repeat(L(n)-L(++i))+i).map((c,i,a)=>a.map((v,j)=>j>i?b.repeat(L(n)):v)).map(M(1)).map(c=>c.map(M(2))).map(c=>c.join(b)))


function printTriangle() {  // display array of strings returned by f
    o.innerText = f(
       +Length.value, // number
       Rotate.value[0] // ASCII char
    ).join('\n');
}
Length: <input type="text" value="11" id="Length"><br>
Rotate: <input type="text" value="0" id="Rotate"> 0,1,2,3<br>
<button type="button" onclick="printTriangle()">
  OK
</button>
<br>
<pre id="o"></pre>

หัก Golfed

(n,x)=>(
    L= x=> (''+x).length,                // strlen(x)
    M= b=> x&b ? (c,i,a)=>a[n-1-i] : c=>c, // reverse or identity map
    Array(n).fill(b=' ')
   .map((c,i)=>b.repeat(L(n)-L(++i))+i)  // a complete line of numbers
   .map((c,i,a)=>a.map((v,j)=>j>i?b.repeat(L(n)):v)) // to 2-d array
                                         // with spaces for blank numbers
   .map(M(1))                            // flip vertically?
   .map(c=>c.map(M(2)))                  // flip horizontally?
   .map(c=>c.join(b))                    // convert lines to strings
)

หมายเหตุเกี่ยวกับการวางแนว

พารามิเตอร์ที่สองคืออักขระจาก {'0', '1', '2', '3'} และพิมพ์โดยอัตโนมัติเป็นตัวเลขโดย &อัตโนมัติ หากตั้งค่าบิต 0 (lsb) ของจำนวนบรรทัดจะพลิกในแนวตั้ง หากตั้งค่าบิต 1 (nlsb) คอลัมน์จะถูกพลิกในแนวนอน สามารถใช้อักขระตัวเลขทศนิยมอื่น ๆ กับผลลัพธ์ที่สามารถคาดเดาได้

ช่องว่างต่อท้าย

รายการว่างในสตริงเอาต์พุตถูกแทนที่ด้วยช่องว่างซึ่งหมายความว่าบรรทัดมีช่องว่างต่อท้ายในการวางแนว '0' และ '1'


0

Lua, 250 ไบต์

function f(w,m)d=""for y=1,w do for x=1,w do d=string.format("%s%"..tostring(w):len().."s ",d,m<2 and(y+x-1<=w and x+y-1 or"")or(m<3 and(x>=y and w-x+y or"")or(m<4 and(y+x-1>=w and w+w-x-y+1 or"")or(y>=x and w-y+x or""))))end;d=d.."\n"end;print(d)end

รับพารามิเตอร์ [w] idth และ [m] ode โดยใช้ 1,2,3,4 สำหรับโหมดตามที่อธิบายไว้ในตัวอย่าง


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