Di 4chan, game populer didapat. Setiap posting di situs mendapat ID posting berurutan. Karena Anda tidak dapat memengaruhi atau menentukannya, orang mencoba menebak (setidaknya sebagian dari) nomor pos mereka sendiri, biasanya beberapa digit pertama. Versi lain dari gim ini disebut dubs, dan tujuannya adalah mendapatkan digit berulang di akhir nomor (yaitu 1234555).
Tugas Anda, jika Anda ingin menerimanya, adalah menulis sebuah program yang mengambil id pos sebagai input (integer standar, Anda dapat mengasumsikan di bawah 2 ^ 32), dan mengembalikan berapa banyak digit berulang di akhir.
Aturan
- Celah standar tidak diijinkan .
- Program dapat berupa fungsi, program penuh, perintah REPL, apa pun yang berfungsi, sungguh, selama tidak ada kode / argumen eksternal yang tidak terhitung diperlukan untuk menjalankannya.
- Input dapat berasal dari STDIN, argumen fungsi, argumen baris perintah, file, apa pun yang cocok untuk Anda.
Uji Kasus
Input: 14892093
Output: 1
Input: 12344444
Output: 5
Input: 112311
Output: 2
Input: 888888
Output: 6
Input: 135866667 //Post number I got on /pol/ few days ago, rip
Output: 1
code-golf
number
number-theory
counting
sagiksp
sumber
sumber
Jawaban:
Mathematica, 29 byte
Bagaimana dengan solusi aritmatika?
Saya sangat senang melihat bahwa ini mengalahkan pendekatan langsung Mathematica.
Penjelasan
Kode itu sendiri menghitung 9 * n + n% 10 dan kemudian menemukan kekuatan terbesar 10 yang membagi input, atau dengan kata lain, menghitung nol yang tertinggal. Kita perlu menunjukkan jika n berakhir di k berulang digit, bahwa 9 * n + n% 10 memiliki k trailing nol.
Rep-digit paling mudah diekspresikan secara matematis dengan membagi angka seperti 99999 (yaitu 10 5 -1 ) dengan 9 dan kemudian mengalikannya dengan digit yang diulang. Jadi kita dapat menulis n = m * 10 k + d * (10 k -1) / 9 , di mana m ≢ d (mod 10) , untuk memastikan bahwa n tidak berakhir pada lebih dari k digit berulang. Perhatikan bahwa d = n% 10 .
Mari kita tancapkan itu ke formula kita 9 * n + n% 10 . Kami mendapatkan 9 * m * 10 k + d * (10 k -1) + d . The d di akhir dibatalkan, jadi kami pergi dengan: 9 * m * 10 k + d * 10 k = (9 * m + d) * 10 k . Tapi 9 ≡ -1 (mod 10) , jadi 9 * m + d ≡ d - m (mod 10) . Tetapi kami telah menegaskan bahwa m ≢ d (mod 10) dan karenanya d - m ≢ 0 (mod 10) .
Dengan kata lain, kami telah menunjukkan bahwa 9 * m + d tidak dapat dibagi dengan 10 dan oleh karena itu, kekuatan terbesar dari 10 yang membagi 9 * n + n% 10 = (9 * m + d) * 10 k adalah k , jumlah trailing digit berulang.
Sebagai bonus, solusi ini mencetak hasil yang benar
∞
,, untuk input0
.sumber
Retina , 9 byte
Cobalah online!
Menghitung jumlah pertandingan yang tumpang tindih
(.)\1*$
yang merupakan regex yang cocok dengan akhiran karakter yang identik.sumber
(.)(?=\1*$)
.(?=(.)\1*$)
(jadi pada dasarnya sama dengan Anda).Brachylog , 4 byte
Cobalah online!
Penjelasan
Jika
ḅ
bekerja langsung pada integer (dan saya tidak yakin mengapa saya tidak mengimplementasikannya sehingga), ini hanya akan menjadi 3 byte karenaẹ
tidak akan diperlukan.sumber
Python 2 ,
4741 byteCobalah online!
36 byte - Untuk input yang lebih fleksibel
Cobalah online!
sumber
dir(object)
adalah teman kita c:Javascript (ES6),
55523230 byteMenggunakan regex untuk mencocokkan grup terakhir dari digit terakhir
Catatan: Posting pertama kali. Jangan ragu untuk berkomentar.
sumber
/(.)\1*$/
f=
.C,
62564847 byteMenyimpan satu byte berkat @Steadybox!
Cobalah online!
sumber
PHP,
474540 byteJalankan dengan
echo <n> | php -nR '<code>
sepertinya satu loop masih lebih kecil dari jawaban pertama saya. cukup hitung karakter yang sama dengan yang terakhir. Ini menggunakan offset string negatif dari PHP 7.1 .
-5 byte oleh Titus. Terima kasih!
Jawaban lama:
menghapus dari kanan setiap karakter yang cocok dengan karakter paling kanan dan menghitung perbedaan panjangnya.
sumber
-R
dan$argn
bisa menghemat 5 byte.05AB1E , 4 byte
Cobalah online! atau sebagai Test suite
Penjelasan
sumber
CJam , 7 byte
Cobalah online!
Penjelasan
sumber
Jelly , 5 byte
Cobalah online!
Penjelasan
sumber
Perl 5 , 22 byte
21 byte kode +
-p
bendera.Cobalah online!
/(.)\1*$/
mendapatkan angka identik terakhir, dan kemudian$_=length$&
menetapkan panjangnya$_
, yang dicetak secara tersirat berkat-p
bendera.sumber
C (gcc) ,
3229 byteIni adalah port jawaban Python saya .
Ini bekerja dengan gcc, tetapi kurangnya
return
pernyataan adalah perilaku yang tidak ditentukan.Cobalah online!
sumber
return
pernyataan yang dilakukan adalah menyimpan nilai balik dalam EAX. Dengan gcc, menugaskannya ke variabel terjadi untuk melakukan hal yang sama. Adapun aritmatika pointer, ketika Anda menambahkan 1 ke pointer int, itu bergerak ke int berikutnya, bukan byte berikutnya.Python 2, 51 byte
Mengambil bilangan bulat sebagai input. Cobalah online
48 byte untuk string sebagai input. Cobalah online
sumber
C # ,
6362 byteGolf
Tidak disatukan
Tidak terbaca dibaca
Kode lengkap
Rilis
- 1 byte
- Terima kasih atas komentar Kevin .63 bytes
- Solusi awal.Catatan
Tidak ada yang perlu ditambahkan
sumber
i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}
Python 2 ,
3832 byteTerima kasih kepada @xnor karena telah menghemat 6 byte!
Cobalah online!
sumber
MATL ,
65 byte1 byte disimpan berkat @Luis
Cobalah di MATL Online
Penjelasan
sumber
&
hal itu terjadi padaY'
:-D Mengapa tidak mengambil input sebagai string yang dilampirkan dalam tanda kutip dan menyingkirkanj
?Cubix,
2419 byteCatatan
Coba di sini
Penjelasan
Pertama, mari kita perluas kubus
Langkah-langkah dalam eksekusi dapat dibagi menjadi tiga fase:
Fase 1: Input
Dua karakter pertama yang dieksekusi adalah
A
danB
.A
membaca semua input dan mendorongnya sebagai kode karakter ke stack. Perhatikan bahwa ini dilakukan secara terbalik, karakter pertama berakhir di atas tumpukan, karakter terakhir hampir di bagian bawah. Di bagian paling bawah,-1
(EOF
) ditempatkan, yang akan digunakan sebagai penghitung untuk jumlah karakter berturut-turut di akhir string. Karena kita membutuhkan bagian atas tumpukan untuk memuat dua karakter terakhir, kita membalik tumpukan, sebelum memasuki loop. Perhatikan bahwa bagian atas tumpukan sekarang terlihat seperti:..., C[n-1], C[n], -1
.Tempat IP pada kubus adalah di mana tempatnya
E
, dan itu menunjuk ke kanan. Semua instruksi yang belum dieksekusi, digantikan oleh no-ops (berhenti penuh).Fase 2: Perbandingan karakter
Tumpukannya adalah
..., C[a-1], C[a], counter
, di manacounter
penghitung yang akan bertambah ketika kedua karakter yang diperiksa (C[a]
danC[a-1]
) sama. IP pertama kali memasuki loop ini padaS
karakter, bergerak ke kanan. TheE
karakter adalah posisi di mana IP akan berakhir (menunjuk kanan) saatC[a]
danC[a-1]
tidak memiliki nilai yang sama, yang berarti bahwa mengurangkanC[a]
dariC[a-1]
tidak menghasilkan0
, dalam hal instruksi berikut!
akan dilewati (yang merupakanw
).Berikut adalah instruksi yang dijalankan selama satu lingkaran penuh:
Dan kemudian ia berputar.
Fase 3: Hasil cetak
Sejak kita meninggalkan loop awal, tumpukan terlihat seperti ini:
counter, ..., C[a-1]-C[a]
. Sangat mudah untuk mencetak penghitung, tetapi kita harus menambah penghitung sekali karena kita tidak melakukannya di iterasi terakhir dari loop, dan sekali lagi karena kita mulai menghitung-1
bukan0
. Jalan di kubus terlihat seperti ini, mulai dariS
, menunjuk ke kanan. Dua no-ops yang dijalankan oleh IP digantikan oleh panah yang mengarah ke IP.Instruksi dieksekusi dalam urutan berikut. Perhatikan bahwa
B)
petunjuk pada akhirnya mengubah tumpukan, tetapi tidak memengaruhi program, karena kami akan menghentikannya, dan kami tidak menggunakan tumpukan itu lagi.Alea iacta est.
sumber
Batch, 91 byte
The
-
mencegah tes dari lari awal string.sumber
JavaScript (ES6), 34 byte
Tidak lebih pendek dari solusi regex.
Fungsi rekursif yang mengevaluasi digit dari kanan ke kiri, berhenti ketika digit yang berbeda ditemukan. Hasilnya adalah jumlah iterasi.
p
aku sundefined
pada iterasi pertama, yang berartin%10-p
pengembalianNaN
(falsy). Setelah itu,p
sama dengan digit sebelumnya dengann%10
. Ketika digit saat ini (n%10
) dan sebelumnya (p
) berbeda, loop berakhir.sumber
Raeda , 12 byte
Cobalah online!
Ini adalah fungsi anonim yang mengharapkan bahwa setiap karakter dari string input didorong ke aliran (saya pikir ini valid dalam semangat pertanyaan meta baru-baru ini ).
Ini menggunakan dua builtin:
count
dantail
:count
membaca nilai dari aliran dan mendorong jumlah elemen berurutan ke aliran.tail
mengembalikan nilai terakhir dalam aliran.sumber
T-SQL,
238214 BytesAtau:
sumber
Java 7, 78 byte
Coba di sini.
Saya mencoba beberapa hal menggunakan rekursi atau loop, tetapi keduanya berakhir di atas 100 byte ..
sumber
Powershell, 41 Bytes
loop lurus ke belakang sampai char tidak cocok dengan char terakhir di string, kembalikan indeks char -1 itu.
-3 terima kasih kepada @AdmBorkBork - menggunakan for for alih-alih sementara.
sumber
Mathematica,
3330 byteTerima kasih kepada Greg Martin untuk menghemat 3 byte.
Mengambil input sebagai string.
Mendapat angka desimal (dalam bentuk karakter), membaginya menjadi elemen-elemen yang identik, mendapatkan proses terakhir dan menghitung panjangnya dengan trik standar untuk mengambil jumlah vektor
1^list
.sumber
Characters
bukanIntegerDigits
?Utilitas Bash + Unix, 34 byte
Cobalah online!
sumber
JavaScript (ES6),
39383727 byteMungkin tidak lebih pendek dari solusi berbasis regex, tapi saya tidak bisa menolak menulis solusi sepenuhnya berdasarkan aritmatika. Tekniknya adalah mengambil
n % 100 % 11
dan membaginya berulang kali hingga 10 sampai hasilnya nol, lalu hitung iterasinya. Ini berfungsi karena jika dua digit terakhir adalah sama,n % 100 % 11
akan menjadi0
.sumber
f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)
Haskell , 33 byte
Cobalah online!
Mengambil input string. Berulang-ulang memotong karakter pertama, dan menambahkan 1 jika semua karakter dalam suffix sama dengan yang pertama.
sumber
R, 35 byte
Penjelasan singkat
sumber
Befunge-98 , 19 byte
Cobalah online!
Ini bisa dibuat lebih pendek jika saya hanya menggunakan stack.
Bagaimana itu bekerja:
sumber
Python 3 -
5044 byteProgram lengkap (dengan Python 3,
input()
mengembalikan string, apa pun inputnya):sumber