Yah, jumlahkan itu benar-benar.
Tulis sebuah program atau fungsi yang mengambil dalam daftar kosong dari bilangan bulat desimal (0-9) dan menghasilkan "segitiga" menunjuk ke bawah digit dengan daftar input di bagian atas di mana setiap digit setelah baris pertama adalah jumlah dari dua digit di atasnya modulo 10.
Misalnya, input [7, 5, 0, 9]
memiliki output
7 5 0 9
2 5 9
7 4
1
karena 2
adalah (7 + 5) mod 10
, 5
adalah (5 + 0) mod 10
, 9
adalah (0 + 9) mod 10
, dll. semua jalan menuju 1
keberadaan (7 + 4) mod 10
.
Jika daftar hanya memiliki satu item, maka output cocok dengan input; misalnya input [4]
kehendak menghasilkan
4
Berikut ini beberapa contoh tambahan:
[0]
0
[1, 2]
1 2
3
[8, 7]
8 7
5
[0, 0]
0 0
0
[1, 4, 2]
1 4 2
5 6
1
[0, 1, 0]
0 1 0
1 1
2
[1, 0, 0, 0]
1 0 0 0
1 0 0
1 0
1
[1, 2, 3, 4]
1 2 3 4
3 5 7
8 2
0
[1, 2, 3, 5, 8]
1 2 3 5 8
3 5 8 3
8 3 1
1 4
5
[9, 2, 4, 5, 3, 2, 2]
9 2 4 5 3 2 2
1 6 9 8 5 4
7 5 7 3 9
2 2 0 2
4 2 2
6 4
0
Perhatikan bahwa dalam output:
- Baris pertama tidak memiliki spasi di depan.
- Setiap baris berikutnya memiliki satu ruang terdepan lebih banyak dari garis sebelumnya.
- Digit dipisahkan oleh satu ruang.
- Setiap baris diizinkan memiliki hingga satu ruang tambahan.
- Mungkin ada satu trailing newline opsional.
- Anda harus menggunakan karakter untuk angka desimal normal (0 hingga 9).
Kode terpendek dalam byte menang. Tiebreaker adalah jawaban sebelumnya.
Jawaban:
BrainF ** k,
396391 byteSaya tidak bisa menahan diri dari godaan untuk melakukan hal ini. Paling tidak segitiga itu sisi-runcing ke bawah.
Input masuk sebagai string karakter numerik diikuti oleh satu baris baru.
Output akan berisi ruang trailing tunggal di setiap baris.
Contoh:
Penjelasan
Karena agak sulit untuk menjelaskan kode dari perspektif fungsional, kita dapat melihatnya dari perspektif keadaan rekaman pada berbagai waktu. Gagasan inti di sini adalah bahwa segitiga yang kita hasilkan diinisialisasi sebagai array (untuk BF, bagaimanapun) yang padat yang menyusut dalam ukuran sebesar 1 setiap iterasi dari sebuah loop. Pikiran penting lainnya adalah bahwa kita menggunakan
255
untuk menunjukkan "pengganti" yang dapat kita cari di rekaman itu.Inisialisasi
Ini adalah langkah termudah. Pada awal program, kami menjalankan yang berikut:
Ini memaksa kaset ke dalam kondisi berikut (di mana
>N<
menunjukkan lokasi pointer pada tape)Angka pertama di sini adalah lokasi "buffer". Kami tidak akan menggunakannya dalam jangka panjang, tetapi berguna untuk membuat operasi lebih sederhana dan untuk menyalin data.
Angka kedua adalah jumlah spasi yang akan kami hasilkan di awal setiap baris, dimulai setelah baris pertama. Baris pertama tidak akan memiliki ruang utama.
Angka ketiga adalah karakter spasi yang kita hasilkan.
Angka keempat adalah placeholder 255, sehingga kita bisa kembali ke posisi ini dengan relatif mudah.
Memasukkan
Dari posisi ini, kita akan membaca semua karakter. Pada akhir langkah ini, kami berharap berada dalam situasi berikut:
Di mana
a b c d e f ...
menunjukkan string karakter numerik yang dimasukkan (bukan baris baru).Kami mencapai ini dengan yang berikut:
Ada beberapa nuansa untuk ini. Pertama-tama, kita akan menampilkan setiap karakter saat kita mendapatkannya, dan kemudian mengeluarkan spasi setelahnya. Kedua, kami tidak ingin menyalin nilai ASCII ke rekaman, kami ingin menyalin angka numerik yang sebenarnya. Ketiga, kami ingin berhenti ketika kami mencapai baris baru dan meninggalkan diri kami di tempat yang baik pada saat itu.
Katakan input kita
6723
. Kemudian, setelah membaca yang pertama6
, rekaman kami terlihat seperti ini:Kami memeriksa bahwa nilai ini tidak sama dengan
10
(baris ASCII) dengan,----------[++++++++++
. Kami kemudian mencetak nilai dan melanjutkan dengan mengurangi secara bersamaan 48 dari nilai input dan menambahkan 32 ke nilai di sebelahnya (>>++++++++[-<++++<------>>]<
), meninggalkan kami di sini:Perhatikan bahwa selama proses ini kita dapat mengasumsikan bahwa semua digit di sebelah kanan input kami adalah 0 - ini berarti bahwa kami tidak dalam bahaya merusak keadaan sebelumnya jika kami menggunakan nilai di sebelah kanan untuk menghitung
6 * 8
dan4 * 8
.Sekarang kita menampilkan karakter spasi yang baru saja kita buat, dan menerima input baru, menghapus ruang yang kita hitung di sana. Akhirnya, input akan dihentikan oleh baris baru dan loop akan keluar, meninggalkan tempat di
255
mana baris baru seharusnya (,----------]-
). Ini adalah karakter placeholder kedua yang akan kita gunakan untuk menavigasi rekaman itu. Pada titik ini dalam skenario kami, rekaman kami persis seperti ini:Perhitungan
Cara kerjanya adalah daftar digit antara
255
placeholder kami akan menyusut satu per iterasi dari loop. Ketika hanya memiliki 1 digit yang tersisa di dalamnya, kita sudah selesai dan harus segera berhenti (Perhatikan bahwa, pada titik ini, setiap digit dalam daftar itu sudah menjadi keluaran, jadi kita tidak perlu khawatir tentang mengeluarkannya lagi).Kami sekarang menggunakan trik ini untuk menavigasi dengan yang pertama
255
placeholder:<+[-<+]-
. Ini secara efektif mencari rekaman di sebelah kiri untuk255
, tidak mengubah apa pun di antaranya. Sekarang kita telah memindahkan pointer, kita dapat memeriksa kondisi keluar kita: jika hanya ada satu digit dalam daftar, maka sel dua spasi di sebelah kanan akan tahan255
. Dengan demikian, kami memeriksa hal itu dan memulai perulangan:>>+[-<<
Langkah pertama di loop kami adalah untuk menghasilkan baris baru. Jadi kami pindah ke sel pertama (sel buffer kami), tambahkan 10 ke sana dan hasilkan. Langkah selanjutnya adalah menampilkan semua karakter ruang terkemuka. Setelah mengeluarkannya, kami menambah jumlah kami untuk sejumlah ruang utama. Langkah-langkah ini dilakukan dengan yang berikut:
Yang membuat kita dalam keadaan ini:
Langkah kami selanjutnya adalah menyalin nilai pertama dalam daftar, melewati placeholder kedua
255
:Kami pada dasarnya melakukan ini dengan melompat-lompat di antara placeholder kami
255
, meninggalkan kami di sini:Kami sekarang memulai perulangan, mengulangi seluruh daftar, berhenti ketika kami menekan
255
:>+[-<
Pada titik ini, angka di sebelah kiri langsung kita selalu 0. Jadi, karena kita mencintai mereka, kita memasukkan tempat penampung
255
di sana sehingga kita dapat kembali ke tempat kita dalam daftar. Langkah selanjutnya adalah memindahkan tempat kedua dalam daftar ke lokasi di sekitar tempat kami memindahkan tempat pertama, melewati tempat penampung kedua255
. Langkah-langkah ini dilakukan dengan yang berikut:Meninggalkan kami di sini:
[ 0 2 32 255 255 >0< 2 3 255 7 6 7 0 ]
Sekarang, baik6
dan7
telah dipindahkan ke lokasi di mana perhitungan dapat terjadi. Kami memerlukan dua salinan7
karena nomor berikutnya dalam daftar akan memerlukannya juga. The7
segera setelah255
melayani tujuan ini, sedangkan yang lain7
akan dikonsumsi oleh perhitungan.Pertama, kami menambahkan dua digit:
Meninggalkan kami di sini:
Kombinasi langkah-langkah selanjutnya adalah yang paling rumit. Kita perlu melihat apakah angka yang kita tunjuk lebih besar dari 10, dan jika ya, kita kurangi
10
. Pada kenyataannya, apa yang kita lakukan adalah kita mengurangi 10 dari itu dan melihat apakah itu mencapai0
titik apa pun dalam pengurangan itu. Jika ya, kami tambahkan10
lagi nanti. Pada akhir ini, kita harus memiliki jumlah modulo 10.Pada titik ini, kami telah mencapai tujuan. Kami memiliki jumlah modulo 10! Juga, apakah jumlahnya lebih besar dari 10, kita akan berakhir di sini:
Tujuan kami berikutnya adalah untuk mengeluarkan jumlah baru ini, mengikutinya dengan spasi, dan menyuntikkannya kembali ke daftar kami. Kami melakukan ini semua dengan teknik sebelumnya kami -
255
melompat dan menambah48
jumlah kami, jadi saya tidak akan membahasnya secara rinci.Dan kami di sini:
[ 0 2 32 255 3 255 2 3 255 7 0 0 51 >32< ]
Perhatikan bagaimana kami menempatkan255
placeholder tambahan setelah kami yang baru disuntikkan3
sehingga kami tidak kehilangan tempat dalam daftar. Pada titik ini, kami memiliki output jumlah dan ruangnya, jadi kami perlu membersihkan dan kembali ke keadaan di mana iterasi berikutnya dari loop ini akan berfungsi. Kita perlu membersihkan sel51
dan kita32
, memindahkan yang7
satu ke kanan, dan menavigasi ke placeholder daftar kita sehingga kita bisa memulai dari awal.Sekarang, kita di sini:
[ 0 2 32 255 3 >0< 2 3 255 0 7 0 ... ]
Di mana tepatnya kita ingin berada untuk iterasi berikutnya. Jadi periksa 255 dan lanjutkan! (
>+]
)Ketika kita diturunkan dari loop, kita akan memiliki daftar baru - terdiri dari jumlah dari daftar sebelumnya. Pertama kali, akan terlihat seperti ini:
Sekarang kami ingin mengulangi seluruh proses itu di daftar baru kami, jadi kami
255
turunkan ke kiri dan mulai dari awal lagi! Kita perlu melakukan sedikit pembersihan dengan>>[-]<<
, dan kemudian menjatuhkan placeholder kita<-
. Setelah itu, kami berada di tempat yang persis sama dengan yang kami cari, sehingga kami bisa lolos dengan melakukan pemeriksaan yang sama:,<+[-<+]->>+
dan boom! Kami punya loop penuh kami! Semua yang kita butuhkan adalah penutupan braket, dan ketika itu berakhir kita sudah sudah keluaran segalanya, jadi kita sudah selesai:]
.sumber
Jelly ,
201918 byteCobalah online!
Latar Belakang
Menghasilkan angka langsung di Jelly. Outputnya sedikit lebih rumit.
Jelly memiliki atom kotak bawaan (
G
) yang menampilkan daftar 2D dengan baris baru di antara baris dan spasi di antara kolom. Kami mengambil array angka 2D (dihasilkan dengan setiap baris dibalik), dan memindahkannya dengan nilai isian@
. Setelah memuja array yang dihasilkan dan transposing lagi, menerapkanG
hasil berikut.Untuk mendapatkan bentuk segitiga yang diinginkan, yang harus kita lakukan adalah menghapus nilai isian.
Bagaimana itu bekerja
sumber
Pyth - 18 byte
Test Suite .
sumber
Python 3.5,
747271 byteInput adalah daftar bilangan bulat (mis.
f([1,2,3,5,8])
), Output ke STDOUT. The%10
dan fakta bahwamap
pengembalian suatumap
objek di Python 3 adalah sedikit mengganggu, berarti kita tidak bisa melakukanmap(lambda*x:sum(x)%10,L,L[1:])
atau serupa.Fungsi kesalahan keluar, tetapi pada saat itu output akan selesai. Terima kasih kepada @xsot untuk -1 byte dengan menemukan tempat yang bagus untuk menempel
print
.sumber
f=lambda L,*S:f([sum(x)%10for x in zip(L,L[1:print(*S,*L)]or 1)],'',*S)
None
!print
mengembalikan sesuatu? Saya tidak tahuprint
fungsi kembali.print
fungsi Python kembali - ya itu kembaliNone
pada penyelesaianNone
mengiris?05AB1E ,
201917 byteKode:
Penjelasan:
Menggunakan pengkodean CP-1252 . Cobalah online! .
sumber
MATL,
3230292827262524 byte1 Byte disimpan berkat @Luis
Cobalah secara Online!
Versi modifikasi untuk semua kasus uji
Penjelasan
sumber
V
membolehkan spesifikasi format. Anda dapat menyimpan 1 byte menggunakanZ"
daripadaO
: lihat tautan ini (Saya mengalami masalah dengan format dalam komentar)D
yang menggunakan nomor tunggal-ruang-antara secara default.Sebenarnya, 43 byte
Cobalah online!
Program ini mencetak satu baris baru setelah output.
Penjelasan:
sumber
Mathematica, 67 Bytes
Contoh:
sumber
CJam, 25 byte
Cobalah online!
Penjelasan
Ini menggunakan trik yang cukup rapi untuk menghasilkan tata letak segitiga.
sumber
JavaScript (ES6) 147 byte
sumber
Julia,
6059 byteBerdasarkan jawaban @ Sp3000 . Fungsi
\
menerima array sebagai input dan mengembalikan string.Cobalah online!
sumber
Pyke, 21 byte
Coba di sini!
Saya ingin berpikir metode ini sedikit berbeda.
sumber
Perl 6 ,
65 63 6261 bytePenjelasan:
Contoh:
sumber
TSQL,
198194191 byteDengan menggunakan GOTO alih-alih salah satu WHILE, saya bisa bermain golf 3 karakter
Golf
Cobalah secara online (menggunakan skrip lama dengan 2 * WHILE)
sumber
Java 7,
230215213 byteIni akhirnya menjadi sedikit lebih lama dari yang saya kira .. Mungkin bisa bermain golf sedikit lebih, karena saya agak kacau saya pikir ..
Beberapa byte disimpan berkat @GiacomoGarabello .
Tidak digabungkan & kode uji:
Coba di sini.
Keluaran:
sumber
void p(String s){System.out.print(s);}
dan ganti cetakan standar. Untukprintln
digunakanp("\n")
. Pindahkanint i
danint j
dekatint c=0;
(int c=0,i,j;
) dan pindahkan bagianprint(a[i]+" ")
dalamfor
kondisi sehingga Anda dapat menghapus tanda kurung total -11<T>void p(T s){System.out.print(s);}
alih-alihvoid p(String s){System.out.print(s);}
.C # 6,
125 + 31125 + 18 = 143 byte+18 untuk
using System.Linq;
Terima kasih kepada @TheLethalCoder untuk menghemat 13 byte, dengan menunjukkan pernyataan penggunaan yang tidak perlu
sumber
JavaScript (ES6), 77 byte
sumber
C, 138 byte
Golf
Tidak disatukan
sumber
C #, 167 byte
Sebenarnya saya cukup bangga dengan solusi ini, ekspresi lambda sangat menyenangkan setelah Anda memahami mereka
di sini ungolfed untuk perbaikan lebih lanjut:
coba di sini
sumber
List<int> a
->int[] a
,int x=a.Count
->int x=a.Length
,.ToList()
->ToArray()
Haskell, 139 byte
Mengambil input sebagai argumen, menghasilkan ke STDOUT.
Versi tidak disatukan:
sumber
Python 3, 97 byte
Mencetak satu trailing newline.
Bagaimana itu bekerja
Cobalah di Ideone
sumber
J, 44 byte
Berdasarkan solusi ini .
sumber
Javascript (menggunakan perpustakaan eksternal) (198 byte)
Tautan ke lib: https://github.com/mvegh1/Enumerable/
Penjelasan kode: Ini mudah menggunakan perpustakaan! Tidak menang dalam byte, tetapi kode ini tidak terlalu bertele-tele dan mudah dibaca. Jadi, input "n 'adalah array bilangan bulat. Muatkannya ke dalam perpustakaan, disimpan dalam variabel" a "." B "adalah string kembali, simpan string yang digabungkan dengan" "sebagai pembatas menjadi b. C adalah iterasi saat ini, gunakan ini untuk menentukan jumlah spasi untuk disisipkan CATATAN: Ini hanya berfungsi dengan baik ketika input dari 0-9.Kemudian, ketika benar, ulangi satu set kode tertentu .Kode itu adalah untuk membuat batch yang berdekatan set enumerable "a" saat ini, yaitu jika kita memiliki [1,2,3,4,5,6] kita mendapatkan [1,2], [2,3], [3,4], ... [ 6] ... lalu saring sehingga kita hanya memiliki kumpulan ukuran 2. Kemudian kita memetakannya ke kumpulan jumlah kumpulan% 10. Jika a kosong, kita selesai, kalau tidak kita tambahkan baris baru untuk pengembalian kita. Akhirnya kembali ...
Gambar datang dalam beberapa menit.
sumber