Bilangan Segitiga

11

Kredit

Terima kasih saya untuk pertanyaan berbasis surat Rand Al'Thor untuk inspirasi untuk tantangan golf kode ini.

Latar Belakang

Sifat tantangan ini didasarkan pada algoritma yang disebutkan oleh Rand dalam bukunya "A Triangle Formed of Three Letters":

  • Mulailah dengan urutan 10 huruf yang masing-masing X, Y, atau Z.
  • Di bawah setiap baris, buat baris berikutnya sebagai berikut. Jika dua huruf yang berdekatan adalah sama, tulis huruf yang sama di bawahnya; jika berbeda, tulis huruf ketiga di bawahnya.

Anda kemudian akan mengulangi langkah sebelumnya sampai Anda memiliki satu huruf di baris kesepuluh Anda.

Tantangan

Kita akan meletakkan putaran matematika pada algoritma di atas:

  • Mari kita mulai dengan urutan 10 digit, masing-masing dipisahkan oleh spasi, dan masing-masing adalah 1, 2 atau 3.
  • Di bawah setiap baris, buat baris berikutnya sebagai berikut. Jika dua digit yang berdekatan adalah sama, tulis angka yang sama di bawahnya; jika mereka berbeda, tulis angka ketiga di bawahnya.
  • Ulangi langkah sebelumnya hingga Anda memiliki satu angka terakhir.

Jadi, mengikuti algoritma ini, jika dimulai dengan baris 1 2 3 3 1 3 1 3 1 2, misalnya, segitiga berikut dihasilkan:

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         

Saya juga ingin tahu mengetahui jumlah semua digit dalam segitiga angka, jadi tambahkan semua digit ini, dan letakkan total ini dalam baris kesebelas, dibenarkan dengan benar ke digit terakhir di baris pertama. Jadi, segitiga angka kita akan terlihat seperti berikut ini (spasi dalam contoh saya diwakili di bawah ini oleh .karakter untuk menampilkan pemformatan.)

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

Tantangan Anda adalah menulis kode yang dapat dimulai dengan string / array / yang diinput. sepuluh digit, sesuai contoh saya, dan kemudian menerapkan algoritma untuk menghasilkan sepuluh baris yang akan membuat segitiga angka, diikuti oleh baris ke-11 yang akan menampilkan total semua digit dengan justifikasi-kanan.

Pengujian

Pengujian string ini dapat dilakukan dengan string sepuluh digit yang Anda pilih secara acak, atau yang dihasilkan dari snipet di bawah ...

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.

Aturan

  1. Aturan kode-golf berlaku, sehingga jumlah byte terendah memenangkan tantangan. Jika ada dua entri dengan skor rendah yang sama, pemenang akan diberikan berdasarkan jumlah suara terbanyak.
  2. Pada dasarnya yang kita kejar adalah 11 baris, panjang 19 karakter ... Bagaimana Anda membuat output akhir sepenuhnya terserah Anda: array, konsol, output file, STDOUT, dll., Jadi silakan gunakan metode output apa pun yang Anda suka yang akan bekerja untuk keuntungan Anda. Satu-satunya aturan dalam output adalah bahwa kita memiliki 11 baris dengan 19 karakter di setiap baris dalam format yang mirip dengan di atas ...
  3. Jika ini membantu kode Anda, gunakan pemisah apa pun untuk digit ... Ingatlah bahwa keterbacaan dapat menjadi faktor penyumbang.
  4. Tidak ada celah konyol .
  5. Pengkodean input tidak dibolehkan. Tujuan dari kode ini adalah sedemikian rupa sehingga dapat digunakan untuk menghasilkan hasil yang berbeda setiap kali dengan input yang bervariasi. Hard-coding 1 1 1 1 1 1 1 1 1 1misalnya, sepenuhnya meniadakan seluruh titik algoritma.

Nantikan melihat apa yang Anda semua dapat lakukan!

WallyWest
sumber
Terkait agak
James
1
Apakah saya perlu pemisah jika segitiga saya berada di tengah-tengah (yang dapat dibaca)
JungHwan Min
1
Sepertinya ini tanpa spasi (jawaban saya memiliki ruang, yang membutuhkan 10 byte).
JungHwan Min
2
Izin diberikan
WallyWest
1
Perhatikan bahwa untuk string 10 (atau angka 1 lebih besar dari kekuatan 3) digit, digit terakhir dihitung secara sepele dari digit pertama dan terakhir dalam string; digit lainnya tidak ada bedanya.
Neil

Jawaban:

1

05AB1E , 32 26 byte

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

Penjelasan

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

Cobalah online!

Emigna
sumber
7

Mathematica, 104 97 90 94 byte

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

Penjelasan

Partition[#,2,1]

Mempartisi input menjadi panjang 2, mengimbangi 1 partisi.

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

Mengambil setiap partisi, dan menghitung output yang sesuai.

Trik yang terlibat di sini. Saya menambahkan dua angka, mengambil mod 3, dan mengurangi hasil itu dari 3. Itu memberikan angka yang diinginkan. (mis. 3 - ((2 + 1) mod 3) = 3)

NestList[ ... ,9]

Mengulangi proses di atas sembilan kali, memberikan semua iterasi sebagai output.

Grid[List@*Row/@#]

Format setiap iterasi menjadi baris, dan letakkan semuanya dalam satu kolom (rata tengah), buat segitiga.

#~Total~2

Ambil total semua angka.

{...}~Column~Right

Gabungkan segitiga dan total, dan luruskan ke kanan seluruh benda (segitiga sudah sejajar, sehingga perataannya tidak terpengaruh).

JungHwan Min
sumber
1
Pendekatan yang terinspirasi dengan satu fungsi yang menangani kedua jenis induk yang identik dan berbeda ... Saya suka itu!
WallyWest
3

JavaScript (ES6), 143 142 byte

Disimpan 1 byte berkat @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)

Saya mencoba menggabungkan berbagai bagian, tetapi berakhir 5 byte lebih lama:

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`
`
Produksi ETH
sumber
Kerja bagus! Bisakah trik JHM 3-((x+y)%3)membantu mengurangi kode ini?
WallyWest
2
Nggak. p^c||psudah agak lebih pendek :-)
ETHproduk
Sekarang, bagaimana saya bisa melewatkan itu? Tentu saja! Fungsi XOR bekerja dengan baik di sini!
WallyWest
1
XOR ?! Saya tidak bisa memikirkan itu. Yang sedang berkata, sayangnya, menggunakan XOR membuat kode saya lebih lama: P
JungHwan Min
Untuk i?p^(p=c)||p:cdapat Anda gunakan i&&p^(p=c)||c?
Neil
2

Ruby, 134 101 byte

Menggunakan trik modulo 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(:+)}

Lihat di eval.in: https://eval.in/649993

Yordania
sumber
2

CJam ,  44  40 byte

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

Cobalah online!

Penjelasan

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.
Martin Ender
sumber
Seperti biasa, sangat mengesankan! Anda memimpin sejauh ini!
WallyWest
1
@WallyWest Terima kasih. :) Tunggu saja Pyth, Jelly dan MATL. ;)
Martin Ender
Sebenarnya, saya penasaran ingin tahu seperti apa solusi GolfScript ...;)
WallyWest
Oh, ada yang mau memposting solusi SQL? ;)
WallyWest
1

Python 2, 164 byte

Solusi iteratif yang relatif sederhana.

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

Cobalah online

mbomb007
sumber
1

PHP, 143 Bytes

<?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);
Jörg Hülsermann
sumber
0

JavaScript (ES6), 112 100 96 byte

Mengambil array sebagai input dan secara rekursif membangun segitiga yang dipisahkan koma.

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)

Arnauld
sumber