Số tam giác


11

tín dụng

Tôi cảm ơn câu hỏi dựa trên thư của Rand Al'Thor cho cảm hứng cho thử thách chơi gôn mã này.

Lý lịch

Bản chất của thử thách này dựa trên thuật toán được Rand đề cập trong cuốn "Một tam giác hình thành ba chữ cái":

  • Bắt đầu với một chuỗi gồm 10 chữ cái, mỗi chữ cái là X, Y hoặc Z.
  • Dưới mỗi hàng, xây dựng hàng tiếp theo như sau. Nếu hai chữ cái liền kề giống nhau, hãy viết cùng một chữ cái bên dưới chúng; nếu chúng khác nhau, hãy viết chữ cái thứ ba bên dưới chúng.

Sau đó, bạn sẽ lặp lại bước trước cho đến khi bạn có một chữ cái trong hàng thứ mười của bạn.

Thử thách

Chúng ta sẽ đặt một vòng xoáy toán học vào thuật toán trên:

  • Hãy bắt đầu với một chuỗi gồm 10 chữ số, mỗi chữ số cách nhau một khoảng trắng và mỗi chữ số là 1, 2 hoặc 3.
  • Dưới mỗi hàng, xây dựng hàng tiếp theo như sau. Nếu hai chữ số liền kề giống nhau, hãy viết cùng một chữ số bên dưới chúng; nếu chúng khác nhau, hãy viết chữ số thứ ba bên dưới chúng.
  • Lặp lại bước trước cho đến khi bạn có một số cuối cùng.

Vì vậy, theo thuật toán này, nếu bắt đầu bằng hàng 1 2 3 3 1 3 1 3 1 2, ví dụ, tam giác sau được tạo:

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         

Tôi cũng tò mò muốn biết tổng của tất cả các chữ số trong tam giác số, vì vậy hãy thêm tất cả các chữ số này và đặt tổng này vào hàng thứ mười một, được chứng minh đúng cho chữ số cuối cùng trong hàng đầu tiên. Vì vậy, tam giác số của chúng ta sẽ trông giống như sau (khoảng trắng trong ví dụ của tôi được biểu thị bên dưới bởi .ký tự để hiển thị định dạng.)

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

Thách thức của bạn là viết mã có thể bắt đầu bằng một chuỗi / mảng / mảng được nhập. gồm mười chữ số, theo ví dụ của tôi, và sau đó áp dụng thuật toán để tạo mười hàng sẽ tạo ra tam giác số, theo sau là hàng thứ 11 sẽ hiển thị tổng số tất cả các chữ số với chứng minh đúng.

Kiểm tra

Việc kiểm tra chuỗi này có thể được thực hiện với một chuỗi được tạo ngẫu nhiên gồm mười chữ số bạn chọn hoặc một chuỗi được tạo từ đoạn trích bên dưới ...

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.

Quy tắc

  1. Áp dụng quy tắc chơi gôn, vì vậy số byte thấp nhất sẽ chiến thắng thử thách. Trong trường hợp có hai mục có cùng số điểm thấp, người chiến thắng sẽ được trao dựa trên số phiếu bầu tăng.
  2. Về cơ bản, chúng tôi có 11 hàng, dài 19 ký tự ... Cách bạn kết xuất đầu ra cuối cùng hoàn toàn phụ thuộc vào bạn: mảng, bàn điều khiển, đầu ra tệp, STDOUT, v.v., vì vậy hãy sử dụng bất kỳ phương thức đầu ra nào bạn muốn làm việc để lợi thế của bạn. Quy tắc duy nhất trong đầu ra là chúng ta có 11 hàng với 19 ký tự ở mỗi hàng có định dạng tương tự như trên ...
  3. Nếu nó giúp mã của bạn, hãy sử dụng bất kỳ dấu phân cách nào cho các chữ số ... Chỉ cần nhớ rằng mức độ dễ đọc có thể là một yếu tố góp phần.
  4. Không có sơ hở ngớ ngẩn .
  5. Mã hóa cứng của đầu vào không được phép. Mục đích của mã này là nó có thể được sử dụng để tạo ra các kết quả khác nhau mỗi lần với đầu vào khác nhau. Mã hóa cứng 1 1 1 1 1 1 1 1 1 1chẳng hạn, phủ nhận hoàn toàn toàn bộ điểm của thuật toán.

Nhìn về phía trước để xem những gì tất cả các bạn có thể đến với!



1
Tôi có cần một dấu phân cách nếu tam giác của tôi được căn giữa (do đó dễ đọc) không?
JungHwan Min

1
Nó trông như thế này mà không có không gian (câu trả lời của tôi có không gian, mất 10 byte).
JungHwan Min

2
Giấy phép được cấp
WallyWest

1
Lưu ý rằng đối với một chuỗi gồm 10 (hoặc bất kỳ số 1 nào lớn hơn lũy thừa 3) chữ số, chữ số cuối cùng được tính toán nhỏ từ chữ số đầu tiên và chữ số cuối cùng trong chuỗi; các chữ số khác không có sự khác biệt.
Neil

Câu trả lời:


1

05AB1E , 32 26 byte

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

Giải trình

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

Hãy thử trực tuyến!


7

Toán học, 104 97 90 94 byte

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

Giải trình

Partition[#,2,1]

Phân vùng đầu vào thành chiều dài 2, bù 1 phân vùng.

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

Lấy từng phân vùng và tính toán đầu ra tương ứng.

Một mẹo liên quan ở đây. Tôi đã cộng hai số, lấy mod 3 và trừ kết quả đó từ 3. Điều đó cho số mong muốn. (ví dụ 3 - ((2 + 1) mod 3) = 3)

NestList[ ... ,9]

Lặp lại quá trình trên chín lần, đưa ra tất cả các lần lặp làm đầu ra.

Grid[List@*Row/@#]

Định dạng mỗi lần lặp thành các hàng và đặt toàn bộ vào một cột (căn giữa), tạo ra một hình tam giác.

#~Total~2

Lấy tổng số của tất cả các số.

{...}~Column~Right

Kết hợp tam giác và tổng, và căn phải toàn bộ sự vật (tam giác đã được căn chỉnh, do đó sự liên kết của nó không bị ảnh hưởng).


1
Cách tiếp cận đầy cảm hứng với một chức năng duy nhất chăm sóc cả hai loại cha mẹ giống hệt nhau và khác nhau ... Tôi thích nó!
WallyWest

3

JavaScript (ES6), 143 142 byte

Đã lưu 1 byte nhờ @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)

Tôi đã thử kết hợp các phần khác nhau, nhưng nó đã kết thúc lâu hơn 5 byte:

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`
`

Công việc tuyệt vời Thủ thuật của JHM có thể 3-((x+y)%3)giúp được gì trong việc giảm mã này không?
WallyWest

2
Không. p^c||pđã ngắn hơn một chút :-)
Sản phẩm ETH

Bây giờ, làm thế quái nào tôi bỏ lỡ điều đó? Tất nhiên! Các chức năng XOR hoạt động tốt ở đây!
WallyWest

1
XOR?! Tôi không thể nghĩ về điều đó. Điều đó đang được nói, thật đáng buồn, sử dụng XOR làm cho mã của tôi dài hơn: P
JungHwan Min

Cho i?p^(p=c)||p:cbạn có thể sử dụng i&&p^(p=c)||c?
Neil

2

Ruby, 134 101 byte

Sử dụng thủ thuật modulo của JHM.

->a{b=*a
(0..8).map{|i|[" "*i,a=a.each_cons(2).map{|x,y|b<<n=3-(x+y)%3
n}]*" "}<<"%19d"%b.reduce(:+)}

Xem nó trên eval.in: https://eval.in/649993


2

CJam ,  44  40 byte

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

Hãy thử trực tuyến!

Giải trình

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.

Như mọi khi, rất ấn tượng! Bạn đang dẫn đầu cho đến nay!
WallyWest

1
@WallyWest Cảm ơn. :) Chỉ cần chờ Pyth, Jelly và MATL. ;)
Martin Ender

Trên thực tế, tôi tò mò muốn biết giải pháp GolfScript sẽ trông như thế nào ...;)
WallyWest

Oh, có ai đăng một giải pháp SQL không? ;)
WallyWest

1

Python 2, 164 byte

Một giải pháp lặp tương đối đơn giản.

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

Dùng thử trực tuyến


1

PHP, 143 byte

<?for($t=$_GET[t];$i<181;$s+=$v,$i+=2)$t[$i+20]=($v=$t[$i])*($z=$t[$i+2])>0&$i!=18?($v+$z)%3^3:" ";echo chunk_split($t.str_pad($s,8," ",0),19);

0

JavaScript (ES6), 112 100 96 byte

Lấy một mảng làm đầu vào và đệ quy xây dựng một tam giác được phân tách bằng dấu phẩy.

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)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.