Game Bilangan Tambah
Tulis fungsi / program yang mengambil 2 parameter integer, parameter integer atau variabel integer , angka awal, dan jumlah iterasi maks. Kode tersebut harus melakukan contoh permainan berikut untuk membuat nomor baru, dan ulangi sampai nomor tersebut satu digit tersisa. misalnya.
3 7 2 = (3 + 7) & (7 + 2) = 10 9
1 0 9 = (1 + 0) & (0 + 9) = 1 9
1 9 = (1 + 9) = 10
1 0 = (1 + 0) = 1
Pada dasarnya, ambil setiap digit individu dan tambahkan ke tetangganya, lalu tambahkan hasil penambahan berikutnya juga.
Hitungan iterasi max adalah untuk menjaga loop tak terbatas, dan ketika max mengenai, kode harus membuang 5 langkah nomor terakhir. Output yang sama harus terjadi ketika menyelesaikan dengan mencapai satu digit. Jika kurang dari 5 langkah terjadi, hanya output angka yang valid.
Output akan muncul seperti ( Step: Number
) termasuk 5 langkah terakhir dari langkah-langkah yang selesai atau diakhiri:
func(3541, 50)
akan menghasilkan format output yang tepat ini:
6: 1411
7: 552
8: 107
9: 17
10: 8
func(3541, 5)
akan menghasilkan:
1: 895
2: 1714
3: 885
4: 1613
5: 774
Seluruh perhitungan menjadi:
1: 895
2: 1714
3: 885
4: 1613
5: 774
6: 1411
7: 552
8: 107
9: 17
10: 8
Jika ada kurang dari 5 langkah, cukup cetak langkah-langkah yang diambil.
Hanya gunakan lib bawaan, parameter bisa dari mana saja (apa pun yang paling mudah untuk bahasa pilihan Anda). Tidak ada batasan ukuran integer maksimum, dan jika ada luapan, biarkan crash.
Mengingat ini tidak terlalu sulit dari sudut pandang teka-teki, saya akan memberikan sampai hari Minggu tanggal 25, 20:00 (UTC + 8) untuk pengiriman yang dipertimbangkan untuk jawaban yang diterima, di mana titik terpendek dari bahasa apa pun akan menjadi pemenang.
EDIT:
Selamat kepada Howard, menang dengan jawaban 48 GolfScript .
Disebutkan secara khusus untuk marinus tempat kedua dengan jawaban 66 APL .
Favorit pribadi saya (menjadi bias terhadap JavaScript) adalah jawaban core1024 .
func(3541, 5)
seharusnya mencetak 5 langkah atau 10?Jawaban:
GolfScript,
4846 karakterTerima kasih kepada Peter Taylor untuk peningkatan dua karakter.
Mengharapkan kedua angka di tumpukan. Coba online .
Contoh:
sumber
.,,
dan mengubah peta akhir menjadi adil{': '*}%
.APL (66)
Argumen kiri adalah jumlah iterasi maksimum dan argumen kanan adalah angka awal.
Penjelasan:
∆←⍺{
...}⍕⍵
: meneruskan argumen kiri sebagai angka dan argumen kanan sebagai string ke fungsi yang menghitung daftar angka, dan menyimpannya di∆
:(1<⍴⍵)∧⍺>0:
: jika jumlah digit lebih dari 1 dan jumlah iterasi yang tersisa lebih dari0
:⍎¨⍵
: mengevaluasi setiap digit2+/
: jumlah setiap pasangan⍕¨
: memformat setiap angka sebagai string∆←,/
: menyatukan string dan menyimpan di∆
∆,(⍺-1)∇⊃∆
: return∆
, diikuti oleh hasil penerapan fungsi ini∆
dengan satu iterasi yang lebih sedikit diizinkan⋄⍬
: jika tidak, kembalikan daftar kosong∆,⍪⍳⍴∆
: pasangkan setiap elemen∆
dengan indeksnya di∆
{
...}/
: untuk setiap pasangan:(⍕⍵),': ',⍺
: mengembalikan string dengan indeks, diikuti oleh:
, diikuti oleh angka↑¯5↑
: ubah daftar string menjadi matriks sehingga ditampilkan pada baris terpisah, dan ambil 5 item terakhirUji:
sumber
3 {...} 3541
.:
pertama)Mathematica, 172 karakter
Ini terlalu lama, berkat nama fungsi Mathematica dan penanganan string yang jelek ("game" yang sebenarnya hanya 76 dari karakter-karakter itu), tapi ini dia:
Ini mengharapkan nomor input dalam variabel
n
dan jumlah iterasi maksimum dalamm
.Dengan lebih sedikit golf:
sumber
Ruby, 106 karakter
Saya tidak 100% jelas tentang aturan input, tetapi jika saya bisa melakukannya
n
sebagai string saya dapat menyimpan 5 karakter, dan jika saya bisa menggunakan variabel yang telah ditentukan dan menulis program alih-alih fungsi, saya bisa menyimpan 9 lagi.Menciptakan fungsi
f
yang bisa disebut sebagai berikut:f[3541, 6]
f[372, 50]
f[9999, 10]
sumber
J -
9692 charSaya pertama kali memecahkan ini dengan asumsi bahwa semua game dihentikan, dan ini kembali menggigit saya selama pengujian. Argumen kiri adalah jumlah langkah, argumen kanan adalah posisi awal, yang dapat diberikan sebagai angka atau string.
Ini agak terlalu golf dan berbelit-belit untuk degolf memuaskan, jadi saya akan mengatakan ini:
(<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)
Bagian ini menjalankan permainan untuk sejumlah langkah yang ditentukan.2+/\
bertanggung jawab untuk menambahkan setiap pasangan angka, dan<@>:@[
bersama-sama dengan^:
kontrol menangkap langkah-langkah menengah permainan.(#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".
Bagian ini memformat semua hasil sebagaistep: result
.({.~,i.0:)
memastikan kita tidak mengambil terlalu banyak langkah,#\
adalah nomor langkah, dan(,': '&,)&":"0
bit menambahkan titik dua dan spasi.(-@(<.5<.#){.])
Bagian ini memotong lima langkah yang relevan atau kurang dari daftar lengkap.<.
berarti 'minimum'.Ini bekerja, tetapi jika Anda mulai dengan jumlah yang cukup besar, hasil gim dengan cepat mulai bertambah besar, yang membuat J beralih dari bilangan bulat ke ganda yang tidak tepat. Berikut ini beberapa contohnya:
sumber
Javascript 139
144 150Tidak disatukan
sumber
Perl,
8684Dengan baris baru untuk keterbacaan:
+ Edit: Tidak ada alasan untuk tidak menggunakan
-n
saklar baris perintah, dan kemudian skor adalah 82 = 81 + 1 :Dan, kemungkinan integer overflow menjadi OK, itu 81 = 80 + 1
sumber
Javascript, 247
278288307KarakterDiformat
Sunting 1 : Terner dihapus
Edit 2 : Logika terbalik untuk "melompati" indeks 0
Sunting 3 : Panggilan rekursif ulang.
Biola
sumber
Bash + coreutils, 115 byte
Keluaran:
sumber
JavaScript (ECMAScript 6 Draft) - 134 Karakter
Contoh:
sumber
Javascript, 182 byte
sumber
Perl,
166147138129 byteTidak Terkumpul:
Saya harap tidak apa-apa mencetak beberapa baris kosong tambahan jika semuanya kurang dari 5 langkah.
sumber
(('')x5, @o, "$i: $s")
dengan(@o, "$i: $s")
danjoin"\n", @o[-5..0]
denganjoin"\n", @o[-5..-1]
. Maka Anda akan menjadi 3 byte di depan;)Java
524405365 karakter [414 byte]Versi golf:
class A{static int n=0;List<String> s=new ArrayList<>();void c(int b,int r){String d=b+"";if(r==0||b <= 9){int m=s.size();for(int i= m>=5?m-5:0;i<m;i++)System.out.println(s.get(i));return;}String l="";for(int i=0;i<d.length()-1;i++)l+=d.charAt(i)+d.charAt(i+1)-96;s.add(++n+":"+l);c(Integer.valueOf(l),--r);}public static void main(String[] a){new A().c(3541,50);}}
Versi yang dapat dibaca:
sumber
chatAt
metodeInteger.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");
Anda bisa melakukannya(digits[i] + digits[i+1] - 96)
JavaScript 133 byte
Tidak Terkumpul:
sumber
Jawa, 341 karakter
371 karakterDiformat:
Terima kasih kepada user902383 saya bisa mengurangi kode sebanyak 30 karakter, dengan tidak memisahkan String menjadi sebuah Array menggunakan -96 bukannya "Integer.valueOf ()
sumber
class a{public static void main(String[] a) {p(3541, 50);}static void p(int n,int k){Queue<String> q=new LinkedList();int c=0;while(n>9&&c<k){c++;String r="";String p=""+n;for(int i=0;i<p.length()-1;i++)r+=((p.charAt(i)+p.charAt(i+1)-96));n=Integer.parseInt(r);q.add(c+": "+n);if(q.size()>5)q.remove();}for(String s:q){System.out.println(s);}}}
Dart,
602588 byteDart mungkin adalah salah satu bahasa terburuk untuk melakukan ini di ... Saya harus menemukan cara yang lebih baik untuk melakukan ini.
Bagaimanapun, ini entri saya:
Input melalui konsol
Dan versi yang ungolf, sedikit tidak ditambang:
sumber
PERL
135 129/125125/121 byteIni memiliki bug yang sama dengan jawaban Tal
Edit 129 byte sebagai fungsi:125 byte sebagai fungsi:125 byte sebagai skrip konsol (tanpa hashbang):121 byte sebagai skrip konsol (tanpa hashbang):
Diperluas:
Uji dengan
c(372,4);
:Uji dengan
c(3541,50);
:sumber
C # - 269
Dapat dibaca:
Pemakaian:
Keluaran:
sumber
Cobra - 363
Hasil yang agak menyedihkan ... tapi hei, saya masih mengalahkan Jawa.
Ini harus kebal terhadap overflows integer untuk praktis uji kasus.
sumber
Python 2.7,
174173158 karakterMenggunakan banyak string untuk melakukan tugas.
Python 2.7, 155 karakter
Versi mendefinisikan fungsi
Versi sedikit tidak berbulu:
sumber
Haskell, 154
contoh penggunaan:
Agar lebih mudah dibaca, gunakan
putStr
:sumber
putStr $ 3541#50
dan bandingkan dengan contoh OP. Kalau tidak, aku senang ada pria Haskell di sini.Groovy -
191182 karakterBerdasarkan solusi Thomas Rüping , porting ke Groovy 2.2.1:
Eksekusi dan keluaran:
Tidak Terkumpul:
sumber
** C
186179174 **Sedikit kurang golf (mini-golf?)
Alokasikan saja memori yang cukup untuk menyimpan lima hasil secara siklis. Lingkaran luar terus berjalan sampai kita mencapai batas atau mencapai satu digit. Loop dalam menambahkan angka terakhir dari angka ke angka terakhir 1/10 dari angka dan menambahkan ini, dikalikan dengan kekuatan 10 yang relevan dengan hasilnya. Bagilah nomor Anda terlebih dahulu dengan 10 dan ulangi untuk mendapatkan total. Kemudian cetak hingga lima hasil terakhir.
Tantangan berikutnya adalah melihat apakah saya bisa mencukur cukup banyak untuk mengalahkan beberapa bahasa skrip di golf.
Sunting: Sekarang dikompilasi dengan peringatan tetapi lima karakter dicukur dengan menghapus deklarasi "void"
sumber
C # -
309330320306 BytesVersi Golf:
Penggunaan: F (3541,50);
Versi tidak dikoleksi untuk dibaca:
Saran untuk perbaikan selalu kami terima! ;)
Sunting: Removed String.Empty dan ganti dengan "" untuk menghemat 10 Bytes.
Edit 2: Berkat malik untuk tipp dengan string!
sumber
.ToCharArray()
. String = array char.ToString()
, lakukan+""