สามเหลี่ยมจำนวน


11

เครดิต

ขอบคุณสำหรับคำถามที่ใช้จดหมายของ Rand Al'Thorสำหรับแรงบันดาลใจสำหรับการแข่งขันกอล์ฟรหัส

พื้นหลัง

ลักษณะของความท้าทายนี้ขึ้นอยู่กับอัลกอริธึมที่แรนด์กล่าวไว้ใน "A Triangle Formed of Three Letters":

  • เริ่มต้นด้วยลำดับ 10 ตัวอักษรแต่ละตัวคือ X, Y หรือ Z
  • ภายใต้แต่ละแถวสร้างแถวถัดไปดังต่อไปนี้ หากตัวอักษรสองตัวที่อยู่ติดกันเหมือนกันให้เขียนตัวอักษรเดียวกันข้างใต้ หากพวกเขาแตกต่างกันให้เขียนตัวอักษรที่สามที่อยู่ข้างใต้

จากนั้นคุณจะทำซ้ำขั้นตอนก่อนหน้าจนกว่าคุณจะมีตัวอักษรหนึ่งตัวในแถวที่สิบของคุณ

ท้าทาย

เราจะทำการคำนวณทางคณิตศาสตร์กับอัลกอริทึมด้านบน:

  • เริ่มจากลำดับ 10 หลักแต่ละอันคั่นด้วยเว้นวรรคและแต่ละอันมี 1, 2 หรือ 3
  • ภายใต้แต่ละแถวสร้างแถวถัดไปดังต่อไปนี้ หากตัวเลขสองหลักที่อยู่ติดกันเหมือนกันให้เขียนตัวเลขเดียวกันข้างใต้ หากพวกเขาแตกต่างกันให้เขียนตัวเลขตัวที่สามที่อยู่ด้านล่าง
  • ทำซ้ำขั้นตอนก่อนหน้าจนกว่าคุณจะมีหนึ่งหมายเลขสุดท้าย

ดังนั้นตามอัลกอริธึมนี้หากเริ่มต้นด้วยแถว1 2 3 3 1 3 1 3 1 2เช่นสามเหลี่ยมจะถูกสร้าง

Input: 1 2 3 3 1 3 1 3 1 2

Output:

1 2 3 3 1 3 1 3 1 2
 3 1 3 2 2 2 2 2 3 
  2 2 1 2 2 2 2 1  
   2 3 3 2 2 2 3   
    1 3 1 2 2 1    
     2 2 3 2 3     
      2 1 1 1      
       3 1 1       
        2 1        
         3         

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

Input: 1 2 3 3 1 3 1 3 1 2

Output:

1.2.3.3.1.3.1.3.1.2
.3.1.3.2.2.2.2.2.3.
..2.2.1.2.2.2.2.1..
...2.3.3.2.2.2.3...
....1.3.1.2.2.1....
.....2.2.3.2.3.....
......2.1.1.1......
.......3.1.1.......
........2.1........
.........3.........
................109

ความท้าทายของคุณคือการเขียนโค้ดที่สามารถเริ่มต้นด้วยสตริง / อาร์เรย์ / etc ที่ป้อนเข้าแล้ว จำนวนสิบหลักตามตัวอย่างของฉันแล้วใช้อัลกอริทึมในการสร้างสิบแถวที่จะสร้างรูปสามเหลี่ยมจำนวนแล้วตามด้วยแถวที่ 11 ที่จะแสดงผลรวมของตัวเลขทั้งหมดด้วยเหตุผลที่ถูกต้อง

การทดสอบ

การทดสอบสตริงนี้สามารถดำเนินการได้ด้วยสตริงที่สร้างแบบสุ่มที่คุณเลือกสิบหลักหรือที่สร้างจากตัวอย่างด้านล่าง ...

c1=()=>('1331123221'+(Math.random()*(1<<24)|0).toString(4)).replace(/0/g, "").slice(-10).split("").join(" ");

$("#btn").click(function(){
  $("#str").val(c1());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="str"><button id="btn">Get numbers</button>
<br>
Please use this snippet to generate a starting row for testing your code. Alternatively, you can also use a string of your choice, so long as it's ten digits (ranging from 1 to 3), separated by single spaces.

กฎระเบียบ

  1. มีการใช้กฎของ Code-golf ดังนั้นจำนวนไบต์ต่ำสุดจึงเป็นสิ่งที่ท้าทาย ในกรณีที่มีสองรายการที่มีคะแนนต่ำเท่ากันผู้ชนะจะได้รับรางวัลตามจำนวนโหวต
  2. สิ่งที่เราเป็นพื้นหลังจากนั้นคือ 11 แถวยาว 19 ตัวอักษร ... วิธีที่คุณแสดงผลสุดท้ายของคุณขึ้นอยู่กับคุณ: อาร์เรย์, คอนโซล, เอาต์พุตไฟล์, STDOUT ฯลฯ ดังนั้นโปรดใช้วิธีการแสดงผลที่คุณต้องการ ทำงานเพื่อประโยชน์ของคุณ กฎข้อเดียวในผลลัพธ์คือเรามี 11 แถวที่มี 19 ตัวอักษรในแต่ละแถวในรูปแบบที่คล้ายกับด้านบน ...
  3. หากมันช่วยให้โค้ดของคุณใช้ตัวคั่นใดก็ได้สำหรับตัวเลข ... โปรดจำไว้ว่าการอ่านที่ชัดเจนอาจเป็นปัจจัยสนับสนุน
  4. ไม่มีช่องโหว่โง่
  5. ไม่อนุญาตให้เข้ารหัสอย่างหนักของอินพุต วัตถุประสงค์ของรหัสนี้คือมันสามารถใช้ในการสร้างผลลัพธ์ที่แตกต่างกันในแต่ละครั้งที่มีการป้อนข้อมูลที่แตกต่างกัน 1 1 1 1 1 1 1 1 1 1ยกตัวอย่างเช่นHard-coding ตัดจุดทั้งหมดของอัลกอริทึมอย่างสมบูรณ์

หวังว่าจะได้เห็นสิ่งที่คุณทุกคนสามารถเกิดขึ้นได้!



1
ฉันต้องมีตัวคั่นหรือไม่ถ้าสามเหลี่ยมของฉันอยู่กึ่งกลาง (ซึ่งอ่านได้ง่าย)
JungHwan Min Min

1
ดูเหมือนว่าจะไม่มีช่องว่าง (คำตอบของฉันมีที่ว่างซึ่งใช้เวลา 10 ไบต์)
JungHwan ขั้นต่ำ

2
ได้รับอนุญาต
WallyWest

1
โปรดทราบว่าสำหรับสตริง 10 (หรือตัวเลขใด ๆ 1 ที่มากกว่าพลัง 3) หลักสุดท้ายจะถูกคำนวณแบบไม่สำคัญจากตัวเลขตัวแรกและตัวสุดท้ายในสตริง ตัวเลขอื่น ๆ ไม่สร้างความแตกต่าง
Neil

คำตอบ:


1

05AB1E , 32 26 ไบต์

DvÐOˆðýðN×.ø,ü+3%3^}\¯O19j

คำอธิบาย

D                 # duplicate input
v                 # for y,N in input,len(input): (10 times do)
 Ð                # triplicate current list
 Oˆ               # sum one copy and add it to global array
 ðý               # merge one copy on spaces
   ðN×.ø          # surround it with N spaces
        ,         # and print it
 ü+               # reduce one copy by addition
   3%             # modulus 3
     3^           # XOR 3
                  # this is the list sent to the next iteration
}                 # end loop
\                 # drop empty list left over from last iteration of loop
 ¯O               # sum the global array giving the triangles total sum
   19j            # join with spaces up to 19 chars

ลองออนไลน์!


7

Mathematica, 104 97 90 94 ไบต์

{Grid[List@*Row/@#],#~Total~2}~Column~Right&[NestList[3-Mod[+##,3]&@@@Partition[#,2,1]&,#,9]]&

คำอธิบาย

Partition[#,2,1]

พาร์ติชันอินพุตเป็นความยาว 2 ออฟเซ็ต 1 พาร์ติชัน

3-Mod[+##,3]&@@@

ใช้เวลาแต่ละพาร์ติชันและคำนวณผลลัพธ์ที่สอดคล้องกัน

เคล็ดลับที่เกี่ยวข้องที่นี่ ฉันบวกตัวเลขสองตัวเอา mod 3 แล้วลบผลลัพธ์ที่ได้จาก 3 นั่นคือจำนวนที่ต้องการ (เช่น 3 - ((2 + 1) mod 3) = 3)

NestList[ ... ,9]

ทำซ้ำกระบวนการข้างต้นเก้าครั้งเพื่อทำซ้ำทั้งหมดเป็นเอาต์พุต

Grid[List@*Row/@#]

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

#~Total~2

นำจำนวนทั้งหมดมารวมกัน

{...}~Column~Right

รวมสามเหลี่ยมและผลรวมแล้วจัดแนวขวาทั้งหมด (จัดแนวสามเหลี่ยมไว้แล้วดังนั้นการจัดตำแหน่งจะไม่ได้รับผลกระทบ)


1
วิธีการที่ได้รับแรงบันดาลใจจากฟังก์ชั่นเดียวที่ดูแลทั้งประเภทพ่อแม่ที่เหมือนกันและต่างกัน ... ฉันชอบ!
WallyWest

3

JavaScript (ES6), 143 142 ไบต์

บันทึก 1 ไบต์ขอบคุณ @Neil

a=>a.map((_,i)=>(q=" ".repeat(i))+(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+q,x=0).join`
`+`
`+(" ".repeat(18)+x).slice(-19)

ฉันพยายามรวมส่วนต่าง ๆ แต่มันจบลงที่ 5 ไบต์นานกว่า:

a=>[...a.map((_,i)=>(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+" ".repeat(i),x=0),x].map(q=>(" ".repeat(18)+q).slice(-19)).join`
`

การทำงานที่ดี! เคล็ดลับของ JHM สามารถ3-((x+y)%3)ช่วยลดรหัสนี้ได้หรือไม่?
WallyWest

2
Nope p^c||pสั้นลงเล็กน้อยแล้ว :-)
ETHproductions

ทีนี้ฉันคิดถึงเรื่องนี้ได้อย่างไร แน่นอน! ฟังก์ชัน XOR ทำงานได้ดีที่นี่!
WallyWest

1
แฮคเกอร์ ?! ฉันไม่ได้คิดอย่างนั้น ที่ถูกกล่าวว่าน่าเศร้าที่ใช้แฮคเกอร์ทำให้รหัสของฉันยาวขึ้น: P
JungHwan Min

สำหรับi?p^(p=c)||p:cคุณสามารถใช้i&&p^(p=c)||c?
Neil


2

CJam ,  44  40 ไบต์

l~{S*\_S*\2ew{:+3%3^}%2$N@}A%_s:~:+sJSe[

ลองออนไลน์!

คำอธิบาย

l~       e# Read and evaluate input.
{        e# Map this block over i in the range [0 1 ... 9].
  S*     e#   Get a string of i spaces (the indentation).
  \_     e#   Swap with the current line of trits and duplicate it.
  S*     e#   Join the trits with spaces.
  \2ew   e#   Swap with the other copy of the trits and get all consecutive pairs.
  {      e#   Map this block over the pairs...
    :+   e#     Sum the pair.
    3%   e#     Modulo 3.
    3^   e#     XOR 3.
         e#     This expression (x+y)%3 ^ 3 computes the required mapping.
  }%     e#   Now this is the next line.
  2$     e#   Copy the indentation (to pad the lines to equal length).
  N      e#   Push a linefeed.
  @      e#   Pull up the next line.
}A%      e# The result of this is a nested array whose string representation is
         e# the required triangle.
_s       e# Duplicate and flatten into a string.
:~       e# Eval each character which gives a list of all the trits.
:+       e# Sum that.
s        e# Turn the sum into a string.
JSe[     e# Left-pad it with spaces to width 19.

น่าประทับใจมาก! คุณเป็นผู้นำจน!
WallyWest

1
@WallyWest ขอบคุณ :) เพียงแค่รอ Pyth, Jelly และ MATL ;)
Martin Ender

อันที่จริงฉันอยากรู้ว่า GolfScript solution จะมีลักษณะอย่างไร ... ;)
WallyWest

โอ้ทุกคนขึ้นไปโพสต์โซลูชั่น SQL? ;)
WallyWest

1

Python 2, 164 ไบต์

วิธีแก้ปัญหาที่ค่อนข้างง่าย

L=input()
s=0
for i in range(len(L)):
    print" "*-~i+" ".join(`L`[1::3]);s+=sum(L);N=L;L=[]
    for a,b in zip(N,N[1:]):L+=[list({1,2,3}-{a,b}),[a]][a==b]
print"%19s"%s

ลองออนไลน์



0

JavaScript (ES6), 112 100 96 ไบต์

รับอาร์เรย์เป็นอินพุตและสร้างสามเหลี่ยมที่คั่นด้วยเครื่องหมายจุลภาคซ้ำ

f=(s,p=`
`,S=0)=>p+(s[0]?s+f(s.map((v,i)=>(S+=v,v^s[i-1]||v)).slice(1),p+' ',S):(p+S).slice(-9))

console.log(f([1,2,3,3,1,3,1,3,1,2])); // reference example
console.log(f([3,3,2,1,3,1,2,1,2,1])); // random example
console.log(f([1,1,1,1,1,1,1,1,1,1])); // all ones (test case for sum < 100)

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