Untuk menghormati berapa banyak perwakilan yang saya miliki beberapa jam yang lalu, ketika saya pertama kali memikirkan tantangan ini:
Angka-angka seperti ini yang terdiri dari pengulangan satu digit disebut repdigits . Repdigits itu menyenangkan! Setiap orang akan lebih senang jika jumlah rep yang mereka miliki adalah repdigit ¹ , tetapi saya tidak sabar, jadi Anda perlu membantu saya menemukan cara tercepat untuk sampai ke repdigit.
Inilah tantangan Anda:
Dengan bilangan bulat positif yang mewakili reputasi, berikan jumlah minimum rep yang harus mereka peroleh untuk mencapai repdigit. Misalnya, pada saat menulis tantangan ini, pengguna Martin Ender memiliki 102.856 rep. Rep-digit terdekat adalah 111,111, jadi dia harus mendapatkan: 8255 rep untuk berada di repdigit.
Karena orang tidak suka kehilangan perwakilan, kami hanya akan mempertimbangkan perubahan non-negatif. Ini berarti bahwa, misalnya, jika seseorang pada 12 rep, daripada kehilangan 1 rep, solusinya adalah mendapatkan 10 rep. Ini memungkinkan '0' menjadi output yang valid, karena siapa pun yang memiliki 111 rep sudah berada di repdigit.
Input dan output dapat dalam format yang masuk akal , dan karena tidak mungkin memiliki kurang dari 1 rep di situs Stack Exchange, Anda dapat mengasumsikan tidak ada input yang kurang dari 1.
Satu cornercase yang perlu diperhatikan:
Jika pengguna memiliki kurang dari 10 rep, mereka sudah di repdigit, dan mereka juga membutuhkan '0'.
Tes IO:
#Input #Ouput
8 0
100 11
113 109
87654321 1234567
42 2
20000 2222
11132 11090
Celah standar berlaku, dan solusi terpendek dalam byte menang!
110
harus memberi1
, meskipun tidak ada cara untuk mendapatkan satu perwakilan.Jawaban:
Jelly , 6 byte
Output adalah array tunggal.
Cobalah online! atau verifikasi sebagian besar kasus uji . Test case 87654321 terlalu lambat untuk TIO.
Bagaimana itu bekerja
sumber
Haskell, 39 byte
Cobalah online
sumber
Brachylog , 9 byte
Cobalah online!
Ini cukup efisien karena menggunakan batasan aritmatika.
Penjelasan
sumber
This is the answer you're looking for. Figure it out for me
:)call_reside_vars/2
, ambil variabel CLP (FD), dan beri label. Sebagai contoh:call_residue_vars(Program, Vs0), include(fd_var, Vs0, Vs), label(Vs)
. Apa yang kamu pikirkan?Python 2,
4140 byteBukan pendekatan terpendek, tetapi sangat efisien. Uji di Ideone .
Bagaimana itu bekerja
Untuk
10**len(`n`)
putaran input n hingga daya terdekat 10 . Setelah itu, kami membagi hasilnya dengan 9 . Ini mengembalikan repdigit 1 ... 1 yang memiliki digit sebanyak n . Kami menyimpan hasilnya di r . Misalnya, jika n = 87654321 , maka r = 11111111 .Repdigit yang diinginkan akan berupa beberapa atau r . Untuk memutuskan mana, kami melakukan pembagian plafon n oleh r . Karena
/
lantai operator divisi Python 2 , ini dapat dicapai dengan-n/r
, yang akan menghasilkan nilai absolut yang benar, dengan tanda negatif. Misalnya, jika n = 87654321 , ini akan mengembalikan -8 .Akhirnya, kita mengalikan hasil bagi yang dihitung dengan -r untuk mengulang hasil bagi satu digit untuk setiap digit dalam n . Misalnya, jika n = 87654321 , ini mengembalikan 88888888 , yang merupakan repdigit yang diinginkan.
Akhirnya, untuk menghitung kenaikan yang diperlukan, kami mengurangi n dari hasil sebelumnya. Sebagai contoh kita n = 87654321 , ini mengembalikan 1234567 , seperti yang diinginkan.
sumber
lambda n:10**len(`n`)/9*-~int(`n*9`[0])-n
. Ini hampir berhasillambda n:int(`n*9`[0]*len(`n`))-n
, tetapi digitnya terlalu kecil dan saya tidak melihat cara yang baik untuk memperbaikinya.O(1)
.O(1)
, tapi saya rasa itu masuk akal.Python 2, 37 byte
Uji di Ideone . Perhatikan bahwa pendekatan ini terlalu tidak efisien untuk kasus uji 87654321 .
Bagaimana itu bekerja
Jika n sudah menjadi repdigit,
1-len(set(`n`))
akan mengembalikan 0 karena panjang himpunan digit n pada basis 10 akan menjadi 1 . Dalam kasus ini, f mengembalikan 0 .Jika n bukan repdigit,
f(n+1)
panggil f secara f dengan nilai n berikutnya yang mungkin .-~
menambah nilai kembali f ( 0 ketika repdigit ditemukan) dengan 1 setiap kali f disebut secara rekursif, sehingga nilai pengembalian akhir sama dengan jumlah kali f telah dipanggil, yaitu, berapa kali n harus ditingkatkan untuk dapatkan repdigit.sumber
L
perlu lama ditangani.-~
memungkinkan fungsi untuk menghitung jumlah panggilan itu dibuat.Perl 6 , 23 byte
Lambda yang mengambil nomor input sebagai argumen, dan mengembalikan hasilnya.
Penjelasan:
...
operator urutan untuk menambah nomor input hingga mencapai repdigit (diuji dengan memecah representasi string menjadi karakter dan melihat apakah semuanya sama) .sumber
/(.)$0*/
Java 7,
11676 byteDigunakan pendekatan luar biasa @Dennis ' untuk menurunkan byte-count dengan kekalahan 40 byte.
Kasus yang tidak disatukan & uji:
Coba di sini.
Keluaran:
sumber
2222
dan output keempat12345678
?2222
bukan222
. Saya memperbaiki kesalahan dalam kode, tetapi secara tidak sengaja masih menggunakan output lama di sini. Sudah diperbaiki sekarang. Adapun yang keempat, tidak, itu harus123467
(seperti yang Anda juga bisa lihat di pertanyaan OP).Pyth,
987 byte1 byte terima kasih kepada @FryAmTheEggman.
Cobalah online.
Sangat tidak efisien, loop melalui semua angka dari input ke repdigit berikutnya.
sumber
Brain-Flak
690358 byteIni dia
Cobalah secara Online
Penjelasan
Mulailah dengan membuat salinan input kedua yang kurang dari aslinya. Kami akan menggunakan salinan untuk mencari repdigit berikutnya. Kami mengurangi satu jika nomor itu sendiri adalah repdigit
Dorong satu untuk memenuhi lingkaran yang akan datang. (tidak harus menjadi salah satu bukan nol)
Loop ini akan berjalan sampai ada repdigit di atas tumpukan
Pop omong kosong. Mereka adalah "boolean" di atas yang menggerakkan loop, karena tidak diperlukan lagi kita pop itu.
Tambahkan satu dan duplikat bagian atas. Salinan akan diuraikan menjadi digit-digitnya.
Sementara salinannya bukan nol ...
Salin lagi
Mod 10 dan pindah ke tumpukan lainnya
Membagi dengan 10 (divisi Integer)
Letakkan angka nol yang merupakan salinan kami
Kami sekarang telah mendekomposisi angka menjadi basis 10 digit, Jadi kami bertukar ke tumpukan dengan semua digit.
Sedangkan digit terdepan tidak nol
Kami mengambil salinan ketinggian tumpukan (yaitu jumlah digit) ...
Kurangi satu dari setiap nomor di tumpukan secara diam-diam
Masukkan tinggi tumpukan yang kami ambil. (dan bertukar ke tumpukan lain)
Kami menggunakan ketinggian tumpukan untuk menarik semua digit yang kami tempatkan di tumpukan lainnya kembali ke tumpukan yang tepat.
Letakkan nol yang setinggi tumpukan kami
Tukar kembali ke tumpukan dengan digit (atau berapa digit)
Akhiri lingkaran
Sekarang kita telah mengurangi digit teratas dari semua digit lainnya. Jika semua digit nol angka asli (bukan input tetapi nomor yang kami periksa) adalah repdigit. [rujukan?] . Jadi kita perlu memeriksa bukan-nol.
Sementara tinggi tumpukan tidak nol
Jika digit bukan nol pindahkan ke tumpukan lain dan ganti dengan nol.
Pop itu (sekarang nol)
Akhiri lingkaran
Tukar ke tumpukan lain (ya ..)
Raih diri kami salinan tinggi tumpukan minus dua
Sedangkan tinggi tumpukan tidak dua (asli dan akumulator)
Pop bagian atas
Akhiri sementara
Letakkan salinan tinggi tumpukan kami minus dua. Ini akhirnya menjadi jumlah digit yang tidak sama dengan digit pertama. Dengan kata lain jika nol, itu adalah repdigit.
Jika loop ini berakhir, kami telah menemukan repdigit
Pop the "boolean"
Kurangi yang asli dari repdigit
sumber
Python 2, 52 byte
Python 2 memiliki beberapa trik yang membuat ini lebih pendek. Misalnya, input berupa angka, jadi kita tidak perlu melakukan cast ke int. (-5 byte) Kami juga tidak perlu menempatkan tanda kurung di sekitar
a-b
(-1 byte)Gunakan skrip ini untuk memverifikasi semua kasus uji:
Anda juga dapat mencobanya online!
sumber
GNU sed, 223 +1 (r flag) = 224 byte
Menjalankan:
Keluaran:
Ini adalah solusi sed murni , aritmatika disimulasikan menggunakan ekspresi reguler saja. Algoritma bekerja sebagai berikut:
^current_reputation:needed_reputation%$
a)
%:
menerapkan kenaikan untuk diperlukan_reputasib)
:%
menerapkan kenaikan untuk current_reputationsumber
Jawa,
7472 byte(Jika entri Java lainnya adalah 76 byte, ini adalah
7472, karena ituduaempat byte lebih pendek).Ngomong-ngomong, tambah saja inputnya sampai menjadi repdigit sambil menambah penghitung. Kembalikan konter.
Ya, itu adalah tiga plus berturut-turut, dua untuk menambah input, satu untuk merangkai string kosong untuk menjadikannya string.
Tidak, saya tidak berpikir itu akan sah tanpa ruang di antara keduanya, tetapi begitulah. Itulah yang salah ketik akan lakukan untuk Anda: satu byte lebih pendek.
Menggunakan for-loop alih-alih sementara waktu membutuhkan banyak byte:
Edit:
Versi sebelumnya harus
matches("^(\\d)\\1*$")
memeriksa repdigit, tetapi karena kita baru saja mengonversi int menjadi string, menggunakan.
kecocokan sudah cukup.Kasus yang tidak disatukan & uji:
Coba di sini.
}
Keluaran:
sumber
R,
1029891 byteTidak Disatukan:
Mengacaukan dengan format (
) menambahkan beberapa byte, tetapi R tidak benar-benar fleksibel!as.numeric
danas.character
sumber
Perl, 40 + 1 (
-n
) = 41 byteJika mencetak apa pun alih-alih
0
ketika nomor sudah repdigit dapat diterima, maka 37 byte sudah cukup:Jalankan dengan
-n
(1 byte) dan-E
atau-M5.010
(gratis):Penjelasan : ada dua bagian utama dalam kode:
/^(.)\1*$/&&say$v
dan$_++&&++$v&&redo
. Tes pertama jika$_
repdigit; jika ya itu mencetak nomor yang kami tambahkan ke nomor asli untuk menjadikannya repdigit ($v
), dan jika tidak, kami memiliki 1 untuk keduanya$_
dan$v
, dan memulai dari awal.sumber
perl -pe '@x=sort/./g;//;$_=(($x[-1]>$&)+$&)x+@x-$_'
JavaScript (ES6), 42 byte
Penjelasan: Menghitung secara rekursif
p
sebagai kekuatan berikutnya10
setelahn
. Digit yang akan diulang kemudian dihitung sebagai1+floor(9n/p)
, dan repunitnya sederhana(p-1)/9
, dari mana hasilnya mengikuti.sumber
05AB1E ,
106 byteCobalah online!
Penjelasan
sumber
§
dan ubah¹-
menjadiα
. Dan di sini alternatif 8-byte yang agak mirip:∞+.ΔÙg}α
Pyke,
1311 byteCoba di sini!
sumber
Sebenarnya, 15 byte
Cobalah online!
Penjelasan:
sumber
Ubur-ubur , 20 byte
Cobalah online! TIO tidak dapat menangani kasus uji yang lebih lama, tetapi mengingat waktu dan memori yang cukup, mereka harus bekerja juga.
Penjelasan
i
adalah input, dan<
menurunkannya. Nilai ini diumpankan ke fungsi di sebelah kiri.\>
menambah nilai (setidaknya sekali) sampai fungsi ke kanan memberikan nilai yang benar.&
s) dari empat fungsi.0~j
dikonversi ke string.u
menghapus digit duplikat.>
menghapus kepala string yang dihasilkan.N
adalah negasi logis: memberikan1
untuk string kosong, dan0
untuk non-kosong. Dengan demikian fungsi tes untuk rep-digit, dan hasilnya\
adalah penghitungan rep-digit berikutnya<i
.)-
kurangi hasil dari input fungsi, yaitu<i
,.<
kurangi. Akhirnya,p
cetak hasilnya.sumber
PowerShell v2 +, 66 byte
Pengecoran PowerShell yang biasanya sangat bagus untuk golf adalah kejatuhan besar di sini.
Mengambil input
$n
sebagai string, dan memasukifor
lingkaran. Untuk langkah pengaturan, kami mengekstrak karakter pertama$n[0]
, tetapi harus mengubahnya kembali menjadi string"$(...)"
sebelum memasukkan sebagai int+
dan menyimpannya$x
. Jika tidak, aritmatika nanti akan menggunakan nilai ASCII dari kode-char.Pengecekan bersyarat apakah string yang dibuat dari
$n.length
"$x"
s, disimpan sementara$y
, kurang dari$n
. Selama tidak, kami menambah$x++
, menyiapkan persyaratan untuk loop berikutnya.Sebagai contoh, untuk input
123
, nilai$y
saat kondisi pertama kali diperiksa akan menjadi111
, yang kurang dari$n
, sehingga loop berlanjut. Tidak ada apa pun di badan loop, sehingga kenaikan langkah terjadi$x++
, maka kondisional diperiksa lagi. Waktu ini$y
sama dengan222
, yang lebih besar dari$n
, sehingga loop berakhir. Jika input sudah menjadi repdigit, syaratnya tidak terpenuhi, karena pada saat$y
itu sama dengan$n
.Setelah keluar dari loop, kita dilemparkan
$y
ke integer+
, lalu kurangi$n
. Hasil itu ditinggalkan di jalur pipa dan hasilnya tersirat.sumber
PHP 5.6,
59535150 byteDisimpan
68 byte berkat @manatwork.Tes dengan:
The
count_chars()
fungsi dengan 3 sebagai parameter kedua mengembalikan sebuah string dengan karakter yang berbeda dalam sebuah string. Ketika string ini panjangnya 1 karakter ([1]
akan mengembalikan false ketika panjangnya 1) lalu gema$b
, jika tidak, tambahkan$b
dan putar lagi.sumber
count_chars()
. Bagaimana dengan 3 sebagai parameter $ mode? Jadi ini akan menjadiwhile
kondisi:count_chars($argv[1]+$b,3)[1]
.count
ataustrlen
ternyata panjangnya sama.echo$b?:0;
MATL , 10 byte
Cobalah online!
Ini terus menambah input sampai semua digit sama, jadi lambat. Kasing uji untuk
87654321
waktu input habis di kompiler online.sumber
Ruby, 42 karakter
Mengharapkan input string.
Contoh dijalankan:
Ruby, 39 karakter
Panggilan rekursif, berjalan ke "SystemStackError: level stack terlalu dalam" pada hasil yang lebih besar.
Contoh dijalankan:
sumber
Matlab,
6564 byteKarena loop sementara itu agak lambat ...
Penjelasan
Menyimpan satu byte berkat @Luis Mendo .
sumber
+0
?diff
secara otomatis melemparkan karakter ke angkadiff
memperlakukan string sebagai sym dan mencoba untuk membedakan.Excel,
8579 byteMasukkan formula berikut ke sel mana pun kecuali sel
N
karena itu nama untuk referensi sel input:Penjelasan:
N
adalah input dan juga nama sel referensi .LEFT(N)
ambil digit pertama dari nilai input.LEN(N)
mengembalikan panjang nilai input.REPT(LEFT(N),LEN(N))
ulangi digit pertama dari nilai inputLEN(N)
kali dan kalikan dengan 1 untuk mengonversi format teks ke format angka sehingga kita dapat menggunakannya untuk perbandingan angka.sumber
Num_chars
diLEFT
dan menyimpan 4 bytes:LEFT(N)
IF
kondisi menjadi1
atau0
menggunakan--
sehingga Anda tidak perlu mengulangi diri Anda sendiri hanya untuk+1
:=REPT(LEFT(N)+(--1*(REPT(LEFT(N),LEN(N)))<N),LEN(N))-N
=REPT(LEFT(N)+(1*(REPT(LEFT(N),LEN(N)))<N),LEN(N))-N
Brachylog v2, 6 byte
Cobalah online!
5-byte
+↙.=∧
lolos dari penghilanganℕ
karena tidak mencoba output non-positif sama sekali, tetapi juga gagal ketika diberi nomor yang sudah repdigit karena tidak mencoba output non-positif sama sekali.sumber
Java, 59 byte
(Saya masih tidak yakin bagaimana cara menghitung entri Java, tetapi menurut standar yang ditetapkan oleh entri Java pertama , entri ini adalah 59 byte, karena ini lebih pendek 17 byte).
Lagi pula, jika kita memiliki repdigit, kembalikan 0, jika tidak tambahkan 1 ke input, panggil sendiri dan tambahkan 1 ke hasilnya.
Kasus yang tidak disatukan & uji:
Coba di sini.
Keluaran:
Seperti yang Anda lihat, entri terakhir kehabisan memori sebelum dapat selesai. (Sangat sesuai)
StackOverflowError
dilempar darijava.util.regex.Pattern.sequence(Pattern.java:2134)
, tapi saya cukup yakin tidak ada yang salah dengan regex itu sendiri, karena itu sama dengan yang saya gunakan pada entri saya sebelumnya .sumber
C #, 82 byte
sumber
C, 84 byte
Tes utama:
sumber
Prolog, 120 byte
Cobalah online!
sumber