รูปสามเหลี่ยมหลัก


26

ท้าทาย:

อินพุต:จำนวนเต็มบวกn

เอาท์พุท:

สร้างรายการในช่วง[1,n]และรวมเข้าด้วยกันกับสตริง (เช่นn=13จะเป็นสตริง12345678910111213)

ตอนนี้เราแสดงสามเหลี่ยมโดยใช้ส่วนนำหน้าหรือส่วนต่อท้ายของสตริงนี้ในหนึ่งในสี่ทิศทางต่อไปนี้โดยยึดตามจำนวนเต็มอินพุท:

  • ถ้าให้ส่งมันออกเป็นรูปสามเหลี่ยม◣n0(mod4)
  • ถ้าส่งออกมันในรูปสามเหลี่ยม◤n1(mod4)
  • ถ้าให้ส่งออกเป็นรูปสามเหลี่ยม◥n2(mod4)
  • ถ้าออกมันเป็นรูปสามเหลี่ยม◢n3(mod4)

ตัวอย่าง:

อินพุต:n=13

เนื่องจากรูปร่างจะเป็น◤ ผลลัพธ์ที่ถูกต้องที่เป็นไปได้สามข้อต่อไปนี้:131(mod4)

12345678910111213    11111111111111111    12345678910111213
1234567891011121     2222222222222222     2345678910111213
123456789101112      333333333333333      345678910111213
12345678910111       44444444444444       45678910111213
1234567891011        5555555555555        5678910111213
123456789101         666666666666         678910111213
12345678910          77777777777          78910111213
1234567891           8888888888           8910111213
123456789            999999999            910111213
12345678             11111111             10111213
1234567              0000000              0111213
123456               111111               111213
12345                11111                11213
1234                 1111                 1213
123                  222                  213
12                   11                   13
1                    3                    3

กฏท้าทาย:

  • ดังที่คุณสามารถดูได้ที่สามผลลัพธ์ที่ถูกต้องด้านบนเฉพาะรูปร่างที่ถูกต้องและการใช้ตัวเลขทั้งหมดในลำดับที่ถูกต้องเป็นสิ่งสำคัญ นอกเหนือจากที่คุณมีอิสระที่จะใช้คำนำหน้าหรือคำต่อท้าย; หลี / สะท้อนให้เห็นถึง; การพิมพ์ในแนวทแยง; เป็นต้น ฯลฯ อนุญาตให้ส่งออกใด ๆ ที่เป็นไปได้หกรูปแบบสำหรับแต่ละรูปร่าง (ดูกรณีทดสอบด้านล่างเพื่อดูผลลัพธ์ที่ถูกต้องทั้งหมดตามรูปร่าง) สิ่งนี้อนุญาตให้ภาษาที่มี builtin หมุนใช้ แต่ภาษาที่ไม่สามารถใช้ทางเลือกอื่นในการใช้ส่วนนำหน้าในขนาดที่ถูกต้องจากบนลงล่างหรือใช้ส่วนนำหน้าสำหรับสองรูปร่าง แต่ต่อท้ายสำหรับอีกสองรูปร่าง . การเลือกตัวเลือกผลลัพธ์ที่เหมาะสมที่สุดสำหรับภาษาของคุณเป็นส่วนหนึ่งของกระบวนการตีกอล์ฟ :)
  • อินพุตรับประกันว่าจะเป็นจำนวนเต็มบวก สำหรับเราก็เอาท์พุทn=11
  • จำนวนบรรทัดใหม่ / ช่องว่างที่นำหน้า / ต่อท้ายใด ๆ ที่ได้รับอนุญาตตราบใดที่มันพิมพ์รูปสามเหลี่ยมที่ถูกต้อง (โดยไม่มีตัวคั่นแนวตั้งหรือแนวนอน!) ที่ใดที่หนึ่งบนหน้าจอ

กฎทั่วไป:

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

กรณีทดสอบ:

อินพุต: เอาต์พุตที่ใช้ได้ทั้งหมดที่เป็นไปได้:n=5

12345    54321    12345    54321    11111    55555
1234     5432     2345     4321     2222     4444
123      543      345      321      333      333
12       54       45       21       44       22
1        5        5        1        5        1

อินพุต: เอาต์พุตที่เป็นไปได้ทั้งหมด:n=6

123456    654321    123456    654321    111111    666666
 12345     65432     23456     54321     22222     55555
  1234      6543      3456      4321      3333      4444
   123       654       456       321       444       333
    12        65        56        21        55        22
     1         6         6         1         6         1

อินพุต: เอาต์พุตที่เป็นไปได้ทั้งหมด:n=7

      1          1          7          7          7          1
     12         21         67         76         66         22
    123        321        567        765        555        333
   1234       4321       4567       7654       4444       4444
  12345      54321      34567      76543      33333      55555
 123456     654321     234567     765432     222222     666666
1234567    7654321    1234567    7654321    1111111    7777777

อินพุต: เอาต์พุตที่เป็นไปได้ทั้งหมด:n=8

1           1           8           8           8           1
12          21          78          87          77          22
123         321         678         876         666         333
1234        4321        5678        8765        5555        4444
12345       54321       45678       87654       44444       55555
123456      654321      345678      876543      333333      666666
1234567     7654321     2345678     8765432     2222222     7777777
12345678    87654321    12345678    87654321    11111111    88888888

อินพุต: เอาต์พุตที่เป็นไปได้เท่านั้น:n=1

1

อินพุต: เอาต์พุตที่เป็นไปได้ทั้งหมด:n=2

12    21    12    21    11    22
 1     2     2     1     2     1

เราสามารถใช้ค่าอื่นสำหรับสามเหลี่ยมหลายรูปแบบเช่น 1 สำหรับ◤และอื่น ๆ ได้ไหม?
ศูนย์รวมแห่งอวิชชา

@EmbodimentofIgnorance ตัวอย่างโชคไม่ดีเนื่องจากเป็นสิ่งที่สเป็คพูด ฉันคิดว่าคุณต้องการถามว่าเราสามารถเปลี่ยนคำสั่งของข้อตกลงทั้งสี่ได้หรือไม่
Erik the Outgolfer

1
ถ้าn==13แถวบนสุดสามารถเป็น'33333333333333333'(หรือเท่ากัน'31211101987654321')?
Chas Brown

@EmbodimentofIgnorance ขออภัย แต่ฉันไม่ได้บอกว่าในกรณีนี้ รูปร่างและสิ่งที่เกี่ยวข้องmod 4เป็นคู่ที่เข้มงวดสำหรับความท้าทายนี้ ดังนั้นคุณไม่สามารถสลับสี่รูปร่างสำหรับสี่mod 4กรณี แต่คำถามที่ดีอย่างไรก็ตาม
Kevin Cruijssen

@ChasBrown ใช่แล้วทั้งคู่ก็โอเค ฉันให้สามตัวอย่างที่เป็นไปได้สำหรับแต่ตัวเลือกทั้งหก (เช่นกรณีทดสอบn = 5 ) เป็นผลลัพธ์ที่ถูกต้อง n=13n=5
Kevin Cruijssen

คำตอบ:


9

JavaScript (ES6),  93  89 ไบต์

ส่งคืนเมทริกซ์ของอักขระ

n=>[...(g=n=>n?g(n-1)+n:'')(n)].map((d,y,a)=>a.map(_=>y-(n&2)*y--<0?' ':d)).sort(_=>-n%2)

ลองออนไลน์!

รูปแบบอื่น (ขนาดเดียวกัน):

n=>[...(g=n=>n?g(n-1)+n:'')(n)].map((_,y,a)=>a.map(d=>y-(n&2)*y--<0?' ':d)).sort(_=>-n%2)

ลองออนไลน์!

แสดงความคิดเห็น

n =>                 // n = input
  [...               // split the result of ...
    ( g = n =>       //   ... a call to the recursive function g, taking n
      n ?            //     if n is not equal to 0:
        g(n - 1)     //       append the result of a recursive call with n - 1
        + n          //       append n
      :              //     else:
        ''           //       stop recursion and return an empty string
    )(n)             //   initial call to g
  ].map((d, y, a) => // for each digit d at position y in this array a[]:
    a.map(_ =>       //   for each character in a[]:
      y -            //     we test either y < 0 if (n AND 2) is not set
      (n & 2)        //     or -y < 0 (i.e. y > 0) if (n AND 2) is set
      * y-- < 0      //     and we decrement y afterwards
      ?              //     if the above condition is met:
        ' '          //       append a space
      :              //     else:
        d            //       append d
    )                //   end of inner map()
  )                  // end of outer map()
  .sort(_ => -n % 2) // reverse the rows if n is odd

สรุปรูปร่าง

ด้านล่างนี้เป็นบทสรุปของรูปร่างพื้นฐาน (สร้างโดยmapลูปซ้อนกัน) และรูปร่างสุดท้าย (หลังจากsort) สำหรับแต่ละnพอควร4 :

 n mod 4  | 0     | 1     | 2     | 3
----------+-------+-------+-------+-------
 n & 2    | 0     | 0     | 2     | 2
----------+-------+-------+-------+-------
 test     | y < 0 | y < 0 | y > 0 | y > 0
----------+-------+-------+-------+-------
 base     | #.... | #.... | ##### | #####
 shape    | ##... | ##... | .#### | .####
          | ###.. | ###.. | ..### | ..###
          | ####. | ####. | ...## | ...##
          | ##### | ##### | ....# | ....#
----------+-------+-------+-------+-------
 n % 2    | 0     | 1     | 0     | 1
----------+-------+-------+-------+-------
 reverse? | no    | yes   | no    | yes
----------+-------+-------+-------+-------
 final    | #.... | ##### | ##### | ....#
 shape    | ##... | ####. | .#### | ...##
          | ###.. | ###.. | ..### | ..###
          | ####. | ##... | ...## | .####
          | ##### | #.... | ....# | #####

1
ขอบคุณสำหรับรายละเอียดที่อธิบาย
chau giang


7

Japtet , 8 ไบต์

ส่งคืนอาร์เรย์ของบรรทัด

õ ¬å+ zU

ลองมัน

ที่บันทึกไว้ 2 ไบต์ต้องขอบคุณเควิน

õ ¬å+ zU     :Implicit input of integer U
õ            :Range [1,U]
  ¬          :Join to a string
   å+        :Cumulatively reduce by concatenation
      zU     :Rotate clockwise by 90 degrees U times

1
คือúจำเป็น? ดูเหมือนว่าการหมุนจะกระทำโดยปริยายหรือไม่
Kevin Cruijssen

@KevinCruijssen อืม ... มันก็เป็นเช่นนั้น ฉันมักจะลืมสิ่งนั้น zไม่ค่อยได้ใช้
Shaggy

1
ฉันไม่รู้ Japt เลย เพียงแค่อยากรู้ว่าผลลัพธ์ที่ออกมาเป็นอย่างไรโดยไม่ต้องมีช่องว่างเพื่อความสนุกและเห็นว่ามันใช้งานได้เหมือนกัน .. ;)
Kevin Cruijssen



3

ถ่าน 17 ไบต์

Nθ≔⭆θ⊕ιηGLLηη⟲⊗θ‖

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Nθ

nอินพุต

≔⭆θ⊕ιη

สร้างสตริงโดยเชื่อมโยงตัวเลขไป1n

GLLηη

เติมสามเหลี่ยมที่มีความยาวนั้นด้วยสตริง

⟲⊗θ

หมุนสามเหลี่ยมทวนเข็มนาฬิกาเป็นn*90องศา

สะท้อนทุกอย่างดังนั้นลงท้ายด้วยสามเหลี่ยมที่หมุนตามเข็มนาฬิกาเป็นn*90องศา




3

R , 152 139 137 134 ไบต์

function(n,N=nchar(s<-Reduce(paste0,1:n,'')),A=!n%%4%%3)for(i in 1:N)cat(rep('',(M=c(N-i+1,i))[1+!A]*(n%%4>1)),substr(s,1,M[1+A]),'
')

รหัสที่ไม่ได้ควบคุม:

function(n){
  s = Reduce(paste0,1:n,'')      # concat the digits from 1 to n into a string s

  N = nchar(s)                   # store the length of s

  A = !n%%4%%3                   # A = TRUE if n MOD 4 == 1 or 2 

  for(i in 1:N){                 # for 1 to N (length of s)

    M = c(N-i+1,i)               # store N-i+1 and i into a vector

    nSpaces = M[1+!A]*(n%%4>1)   # if n MOD 4 == 1 or 2 then nSpaces = i else nSpaces = N-i+1, 
                                 # but if n MOD 4 == 0 or 1, then force nSpaces = 0

    nDigits = M[1+A]             # if n MOD 4 == 1 or 2 then nDigits = N-i+1 else nDigits = i

    prfx = rep('',)              # create a character vector repeating '' nSpaces times

    sufx = substr(s,1,M[1+A])    # substring s by taking the first nDigits characters

    cat(pr,su,'\n')              # print prfx and sufx using space as separator for the values 
                                 # contatenation (cat function default) and append a newline
  }

ลองออนไลน์!


... มันไม่ใช่วันของฉันสำหรับการเล่นกอล์ฟอย่างชัดเจน
จูเซปเป้

@Giuseppe: อ่าาาาาา ... แล้วคุณมักจะแซงฉัน: P
digEmAll


2

PowerShell , 108 ไบต์

param($n)0..($y=($x=-join(1..$n)).length-1)|%{' '*(0,0,$_,($z=$y-$_))[$n%4]+-join$x[0..($_,$z,$z,$_)[$n%4]]}

ลองออนไลน์!

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



2

05AB1E (ดั้งเดิม) , 14 12 10 ไบต์

การใช้ verion รุ่นก่อนเนื่องจากการเขียนซ้ำช้ามากในบางกรณี

บันทึก 2 ไบต์ขอบคุณKevin Cruijssen

LSηsFRζ}J»

ลองออนไลน์!

คำอธิบาย

L           # push range [1 ... input]
 S          # split to list of individual digits
  η         # calculate prefixes
   sF  }    # input times do:
     R      # reverse list
      ζ     # and transpose it
        J   # join to list of strings
         »  # and join on newlines

คุณสามารถบันทึก 2 ไบต์เปลี่ยนLJη€SไปLSηตั้งแต่Sflattens โดยปริยาย
Kevin Cruijssen

@KevinCruijssen: โอ้ใช่แล้วขอบคุณ! ฉันลืมไปแล้ว ฉันพยายาม€Sที่ไม่ได้ผลดีมาก;)
Emigna


2

PowerShell , 105 101 95 ไบต์

-4 ไบต์ขอบคุณ Arnauld สำหรับเคล็ดลับกับการจัดเรียง

param($n)($x=1..$n-join'')|% t*y|%{($s+="$_")}|sort -d:($n%4-in1,2)|% *ft($x.Length*($n%4-ge2))

ลองออนไลน์!

หักกอล์ฟ:

param($n)
$x=1..$n-join''
$x|% toCharArray |% {
    ($s+="$_")
} | sort -Descending:($n%4-in1,2) |% PadLeft ($x.Length*($n%4-ge2))

2

R , 175 172 154 ไบต์

function(n)write(c(" ",0:9)[1+(x=utf8ToInt(Reduce(paste0,1:n,""))-47)*!upper.tri(diag(y<-sum(x|1)))["if"(n%%4>1,1:y,y:1),"if"(!n%%4%%3,y:1,1:y)]],1,y,,"")

ลองออนไลน์!

ระเบียบในบรรทัดที่น่ากลัว!

-3 ไบต์โดยการเปลี่ยนเงื่อนไขการหมุน

-17 ไบต์ขอบคุณคำแนะนำของdigEmและอีกหนึ่งไบต์หลังจากเล่นกอล์ฟต่อไป


ฉันชอบวิธีการระดับสูงนี้และสามารถย่อให้เหลือ155 ไบต์ ... อาจจะมากขึ้นฉันแน่ใจว่าฉันขาดอะไรบางอย่างที่ชัดเจน ...
digEmAll

@digEmAll ดีขึ้นมาก แต่ก็ยังยาว :-(
Giuseppe






1

Java (JDK) , 247 209 188 186 160 148 ไบต์

i->{String s="";int l=0,w;for(;l<i;s+=++l);for(w=s.length(),l=0;l<w;)System.out.printf("%"+(1>i%4/2?1:w)+"s\n",s.substring(0,1>~-i%4/2?w-l++:++l));}

ลองออนไลน์!

-38 bytesขอบคุณ @KevinCruijssen
-21 bytesโดยให้printfจัดการกับช่องว่างภายใน
-2 bytesโดยทำซับสตริงก่อนแทนที่ทำให้เราสามารถเพิ่มได้lในที่เดียวแทนที่จะเป็นสองแห่ง
-26 bytes- ด้วยprintfการทำแพ็ดดิ้งสตริงที่เต็มไปด้วยช่องว่างไม่จำเป็นอีกต่อไปและสตริงหลักสามารถสร้างในวิธีที่สั้นลงอย่างเห็นได้ชัด
-12 bytesโดยไม่ต้องยุ่งกับตัวเลขหลักเดียวแทนที่จะพิมพ์สตริงย่อยของสายอักขระที่ให้บริการได้อย่างสมบูรณ์แบบที่เรามีอยู่แล้ว

Ungolfed

input->{
    // Lambda expression with target type of IntConsumer
    String allDigits = "";
    int lineLength, line = 0;

    // Collect a list of all digits in order.
    for (;line < input; allDigits += ++line) {}

    // Save the max length of a line, and create a string of that many spaces.
    for (lineLength=allDigits.length(), line=0; line < lineLength;) {
        System.out.printf(   "%" // construct a format string to handle the padding
                           + (   1 > input%4/2
                               ? 1 // No padding
                               : w // Yes padding
                             )
                           + "s\n"
                         , allDigits.substring( 0
                                              ,   1 > (i-1)%4/2
                                                ? w - l++
                                                : ++l
                                              ) // A string containing only the digit we want.
                         );
    }
}

1
คำตอบที่ดี มีหลายสิ่งหลายอย่างให้เล่นกอล์ฟแม้ว่า: ช่องว่างหลังจากfor(สามารถถอดออกได้ new String(new char[w=s.length()]).replace('\0',' ')สามารถ" ".repeat(w=s.length())ใช้ Java 11+ คุณสามารถลบวงเล็บรอบการตรวจสอบที่สาม สามารถ1>(i-1)%4/2 สามารถ และคุณไม่ต้องนับเครื่องหมายอัฒภาคต่อท้ายด้วยจำนวนนับ ซึ่งทั้งหมดรวมกันจะกลายเป็น209 ไบต์ 1>~-i%4/2w-1-l++w+~l++
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.