Pertimbangkan mengambil bilangan bulat non-negatif seperti 8675309 dan menghitung nilai absolut dari perbedaan antara semua pasangan angka tetangga.
Untuk 8675309
kita |8-6| = 2
, |6-7| = 1
, |7-5| = 2
, |5-3| = 2
, |3-0| = 3
, |0-9| = 9
. Merangkai hasil ini bersama-sama menghasilkan, integer lain yang lebih kecil non-negatif: 212239
. Mengulangi proses memberi 11016
, kemudian 0115
, yang oleh konvensi bahwa nol depan tidak ditulis menyederhanakan 115
, menjadi 04
atau 4
yang tidak dapat direduksi lebih jauh. Dengan merangkum semua nilai ini, kita dapatkan 8675309 + 212239 + 11016 + 115 + 4 = 8898683
.
Mari kita definisikan Digit Difference Sum (atau DDS) sebagai operasi berulang-ulang mengambil perbedaan digit angka untuk membentuk angka baru, lalu menambahkan semua angka yang dihasilkan ke aslinya.
Berikut adalah 20 nilai pertama dalam urutan DDS yang sesuai:
N DDS(N)
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 11
11 11
12 13
13 15
14 17
15 19
16 21
17 23
18 25
19 27
Berikut adalah nilai 10000 pertama , grafik yang cukup aneh:
Terutama karena tampilannya sama ketika Anda merencanakannya menjadi 1000 atau bahkan 100:
(Saya akan menyebutnya tangga dokter gigi ...)
Tantangan
Tulis program atau fungsi yang menggunakan bilangan bulat non-negatif dan mencetak atau mengembalikan nilai DDS-nya. Misalnya, jika inputnya adalah 8675309
, output seharusnya 8898683
.
Kode terpendek dalam byte menang.
sumber
Jawaban:
Pyth, 17
Cobalah di sini atau jalankan Test Suite
Penjelasan:
sumber
Python 2, 73
Untungnya, saya berhasil menghindari operasi string.
g
adalah fungsi yang menghitung jawabannya.sumber
(n-n/10)%10
beroperasi sama dengann%10-n/10%10
? Atau bahkan mungkin(9*n/10)%10
?%
adalah operator modulus sejati, bukan sisanya, sehingga tidak akan berfungsi.Matlab, 101
105byteTerima kasih banyak kepada @beaker atas sarannya untuk digunakan
polyval
sebagai gantinyabase2dec
. Itu memungkinkan saya untuk melakukannyaKode:
Contoh:
Bonus: basis sewenang-wenang
Generalisasi kecil memungkinkan seseorang untuk menggunakan basis angka arbitrer, tidak harus desimal:
Basis sewenang-wenang dari 2 hingga 10,
108104 byteAlasan mengapa ini bekerja hanya untuk dasar hingga
10
adalah bahwa Matlabdec2base
menggunakan fungsi digit0
,1
, ...,9
,A
,B
, ..., dan ada lonjakan karakter (ASCII) kode dari9
keA
.Basis sewenang-wenang dari 2 hingga 36, 124
146byteLompatan dari
9
ke yangA
disebutkan di atas membutuhkan perawatan khusus. Basis maksimum adalah36
sesuaidec2base
fungsi Matlab .Beginilah cara tangga dokter gigi mencari pangkalan yang berbeda:
sumber
CJam,
2221 bytePerhatikan bahwa program ini keluar dengan kesalahan, yang diizinkan secara default .
Dengan Java interpreter, kesalahan dapat ditekan dengan menutup STDERR. Jika Anda mencoba kode ini secara online di interpreter CJam , abaikan semua output sebelum baris terakhir.
Terima kasih kepada @ Sp3000 karena menunjukkan kesalahan dalam revisi asli.
Terima kasih kepada @ MartinBüttner untuk bermain golf 1 byte.
Contoh dijalankan
Bagaimana itu bekerja
A akan selalu benar saat diperiksa oleh
h
. Namun, begitu saya adalah bilangan bulat satu digit,2ew
akan gagal dengan kesalahan setelah mengkonsumsi array yang dipanggil. Ini hanya menyisakan hasil yang diinginkan pada tumpukan, yang dicetak sebelum keluar.sumber
Labyrinth ,
176134127119103978882797672 byteTerima kasih kepada Sp3000 untuk menghemat 1 byte dan membuka jalan untuk 2 lebih.
Ini mungkin masih bisa disingkat, tapi hei, itu mengalahkan
JavaMatlabPython ...Cobalah online.
Ini berakhir dengan kesalahan tetapi pesan kesalahan ditulis ke STDERR (itulah sebabnya Anda tidak melihatnya di TIO).
Implementasinya cukup mudah. Kami menambahkan nilai saat ini ke total berjalan. Jika nilai saat ini lebih besar dari
9
, kami menghitung basis-10 digitnya (melalui div-mod yang diulang), dan membentuk angka baru dari perbedaan absolut. Jika kita sampai9
atau kurang, kita mencetak total yang berjalan.Angka-angka dari angka saat ini dikumpulkan pada tumpukan tambahan dengan angka paling signifikan di atas.
Yah, implementasi mewah dari
abs(...)
saya di sini ternyata sangat rumit dibandingkan dengan solusi baru ... Saya akan menambahkan penjelasan yang diperbarui ketika saya selesai bermain golf ini lebih jauh.sumber
Java - 300 byte
Versi Golf
Tidak lengkap / Versi lengkap
sumber
static
s setelah menarik mereka dalam 3)(a+"")
umumnya sama dengana.toString()
, tetapi lebih pendek 4) Anda tidak perlu Scanner jika itu hanya sebuah fungsi, cukup lama selama input.long f(long t){long a=t;char[]c;while((c=(a+"").toCharArray()).length>1){String s="";for(int i=0;i<c.length-1;)s+=Math.abs(c[i]-c[++i]);t+=a=new Long(s);}return t;}
Julia,
8160 byteTidak Disatukan:
Cobalah online
Disimpan 21 byte berkat feersum dan Glen O!
sumber
ndigits(n)>1
yang berbedan>9
?int(join(abs(diff(["$n"...]))))
menghemat 9 byte. Alihkan ken>9
seperti yang disarankan oleh feersum untuk 9 byte lainnya yang disimpan. Simpan tiga byte lagi dengan melakukan kedua penugasan dalam loop sementara dalam satu langkah (dan menghapus titik koma, yang sekarang tidak perlu):n->(s=n;while n>9 s+=n=int(join(abs(diff(["$n"...]))))end;s)
OK ,
37322423 byteBeraksi:
K5 memiliki beberapa fitur yang cocok untuk ini- "encode" dan "decode" dapat melakukan konversi basis, masing-masing pasangan (
':
) memasangkan elemen berurutan dalam daftar dan pemindaian titik tetap (\
) dapat menghasilkan urutan iterated sampai berhenti berubah. Kurangnya primitifabs()
mengarah ke beberapa massal tak sedap dipandang dalam bentuk{(x;-x)x<0}'
, meskipun.Edit:
Alih-alih
{(x;-x)x<0}'
, saya dapat (agak boros) mengambil akar kuadrat dari urutan (({%x*x}
menghemat 5 byte).Edit 2:
Terinspirasi oleh solusi APL @maurinus, saya dapat mengganti "decode" (
((#$x)#10)\x
) dengan mengevaluasi setiap karakter representasi string dari angka-.:'$x
! Ini juga memungkinkan saya menggunakan bentuk diam-diam dari seluruh ekspresi, menyimpan karakter tambahan.sumber
Python 2, 87 byte
Secara rekursif menambahkan nomor saat ini dan mengambil perbedaan digit. Banyak konversi antara angka dan string. Mungkin bisa diperbaiki.
sumber
Julia,
5548 byteTidak Disatukan:
Pada dasarnya, ini berulang hingga ke level satu digit (di mana tidak ada perbedaan digit yang dapat dilakukan), kemudian menjumlahkan kembali saat keluar dari rekursi, level demi level.
sumber
Haskell, 140 byte
d
melakukan pekerjaan.Adakah yang tahu cara menghindari impor fungsi konversi yang lama?
sumber
intToDigit
adalahtoEnum.(+48)
dandigitToInt
sekarang(\i->fromEnum i-48)
. Anda juga dapat mengubahs
ke versi pointfree dengan=<<
dalam konteks daftar:s=snd.span(==0).m abs.(zipWith(-)=<<tail)
. Akhirnya,(==0)
adalah(<1)
, karena kami bekerja dengan bilangan bulat non-negatif.s
pointfree, tidak perlu memberi nama. Sebut saja secara langsung:iterate(snd.span ... tail))
=<<
digunakan dalam konteks fungsi, bukan konteks daftar, maaf.NoMonomorphismRestriction
akan membiarkan saya memilikid
pointfree juga.chr
danord
keduanya masukData.Char
, sehingga Anda tidak dapat menghilangkanimport
. Bendera kompiler juga dihitung sebagai byte, jadiNoMonomorphismRestriction
tambah skor Anda hingga 25.K5, 50 byte
sumber
APL (22)
Penjelasan:
⍵≤9:⍵
: jika ⍵ ≤ 9, kembali ⍵ tidak berubah.⍎¨⍕⍵
: konversikan ⍵ menjadi string, lalu evaluasi setiap karakter2-/
: kurangi setiap dua angka yang berdekatan|
: ambil nilai absolut10⊥
: ubah array menjadi angka dasar-10⍵+∇
: panggil fungsi secara rekursif dengan nilai baru ini, dan tambahkan hasilnya ke inputsumber
Mathematica,
726965 byteSaya terbuka untuk saran di sini.
sumber
Tr@FixedPointList[FromDigits@*Abs@*Differences@*IntegerDigits,#]&
JavaScript ES6, 73 byte
Ini tidak semakin pendek: / Saya akan mencoba lebih banyak pendekatan tapi ini yang terpendek sejauh ini
sumber
t
masih valid dan menghemat 2 byte.JavaScript (ES6), 69
Tes menjalankan cuplikan di bawah ini di peramban yang mendukung EcmaScript 6 (tapi bukan Chrome karena masih tidak mendukung operator penyebaran
...
) MS Edge mungkin?Alternatif, menggunakan pemahaman array yang sekarang ditargetkan EcmaScript 2016 (ES7), 67 byte:
sumber
Python 3, 125 byte
Aku dulu seperti sesak regex sampai saya mencoba untuk menggunakannya untuk tantangan ini ...
re.findall('\d\d',s,overlapped=True)
adalah tidak pada;)Ceria @Todd :)
sumber
J, 70 byte
sumber
C 162 byte
golf:
ungolfed:
sumber
R, 134 Bytes
Kode
Uji secara online .
Tidak disatukan
Berikut adalah plot perbedaan dari seri "Digit Difference Sum of a Number" dari f (1) hingga f (1m). Hanya karena saya suka beda.
Kode plot
sumber
MATLAB
(141)(137)Program ini merangkum digit dari baris yang sama sebelum digit yang digarisbawahi, itu berarti ia menggunakan pembagian integer "n / 10" log_10 (n) kali saja, kompleksitasnya adalah O (N).
Jika
n= a b c d
Program saya menghitung:
Pemakaian:
a =
1
sumber
,end
darifunction
deklarasi.Prolog, 143 byte
Kode:
Dijelaskan:
q melakukan perhitungan yang mengubah angka menjadi Perbedaan Digitnya.
r secara rekursif memanggil q dan merangkum hasilnya untuk menemukan Jumlah Perbedaan Digit.
p adalah titik masuk. Mengambil nomor, memanggil r dan mencetak jawabannya.
Contoh:
Cobalah online di sini .
sumber
PHP - 198 byte
Tidak disatukan
sumber
Perl 6 , 56 byte
pemakaian:
sumber