DAPATKAN dubs Anda bersama


24

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

1
Apakah kami diizinkan mengambil input sebagai string?
Dead Possum

6
@DeadPossum Saya akan menganggap itu diizinkan, karena Anda tetap mendapatkan string jika Anda membaca input dari STDIN, argumen baris perintah atau file (yang semuanya merupakan metode input yang dapat diterima).
Martin Ender

1
Bisakah kita berasumsi bahwa input akan lebih besar dari 0?
Martin Ender

1
@MartinEnder Ya
sagiksp

2
Suara positif untuk game dubs! Periksa mereka!
ZombieChowder

Jawaban:


19

Mathematica, 29 byte

Bagaimana dengan solusi aritmatika?

IntegerExponent[9#+#~Mod~10]&

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 input 0.


1
Saat-saat seperti inilah saya berharap situs ini mendukung MathJax; rumus tebal tidak sebagus yang mengeset. Sangat menyenangkan bahwa Anda meluangkan waktu untuk menulis superscript eksponen.
wizzwizz4

1
@ wizzwizz4 Saya dulu menggunakan pemformatan kode, tetapi saya telah menemukan bahwa huruf tebal (yang biasanya digunakan oleh Dennis) sedikit lebih mudah dibaca daripada itu. Tapi setuju, itu tidak sebagus MathJax.
Martin Ender

13

Retina , 9 byte

&`(.)\1*$

Cobalah online!

Menghitung jumlah pertandingan yang tumpang tindih (.)\1*$yang merupakan regex yang cocok dengan akhiran karakter yang identik.


2
Ini pasti meme: Anda dan regex Anda
Christopher

Saya perlu mempelajari semua pengubah ini - saya hanya akan pergi untuk (.)(?=\1*$).
Neil

1
@DownChristopher ia benar-benar membuat bahasa berbasis regex, ini melampaui materi meme c:
Rod

1
@ Neil Jika itu penghiburan, upaya pertama saya adalah (?=(.)\1*$)(jadi pada dasarnya sama dengan Anda).
Martin Ender

1
Ya, terima kasih!
Neil

9

Brachylog , 4 byte

ẹḅtl

Cobalah online!

Penjelasan

ẹ       Elements: split to a list of digits
 ḅ      Blocks: group consecutive equal digits into lists
  t     Tail: take the last list
   l    Length: Output is the length of that last list

Jika bekerja langsung pada integer (dan saya tidak yakin mengapa saya tidak mengimplementasikannya sehingga), ini hanya akan menjadi 3 byte karena tidak akan diperlukan.


9

Python 2 , 47 41 byte

lambda s:len(`s`)-len(`s`.rstrip(`s%10`))

Cobalah online!

36 byte - Untuk input yang lebih fleksibel

lambda s:len(s)-len(s.rstrip(s[-1]))

Cobalah online!


Wow. Saya harus belajar builtin lebih penuh perhatian. +1
Dead Possum

2
@DeadPossum dir(object)adalah teman kita c:
Rod

BTW kita tidak diperbolehkan mengambil string sebagai input. "Jika metode input Anda secara otomatis mengembalikan string maka yakin, tetapi Anda tidak dapat berasumsi bahwa input akan diberikan sebagai string." : C
Dead Possum

1
@DeadPossum Saya berpikir bahwa penulis berubah pikiran tentang itu. Komentar itu sepertinya sudah dihapus.
Brian McCutchon

8

Javascript (ES6), 55 52 32 30 byte

a=>a.match`(.)\\1*$`[0].length
  • Disimpan 19 byte berkat @MartinEnder dengan mengganti regex
  • Disimpan 2 byte berkat @ user81655 menggunakan templat templat yang ditandai

Menggunakan regex untuk mencocokkan grup terakhir dari digit terakhir

Catatan: Posting pertama kali. Jangan ragu untuk berkomentar.

f=a=>a.match`(.)\\1*$`[0].length


console.log(f("14892093"));//1
console.log(f("12344444"));//5
console.log(f("112311"));//2
console.log(f("888888"));//6
console.log(f("135866667 "));//1

Selamat datang di PPCG! Anda dapat menyimpan banyak byte dengan menggunakan backreference alih-alih mengisi karakter yang diulang secara manual:/(.)\1*$/
Martin Ender

Juga, fungsi yang tidak disebutkan namanya benar-benar baik-baik saja (kecuali jika Anda memerlukan nama untuk panggilan rekursif misalnya), sehingga Anda dapat menyimpan dua byte pada f=.
Martin Ender

Kerja bagus! Ini pasti melewati ulasan tetapi ini bisa golf
Christopher

@ MartinEnder Terima kasih! Saya masih harus belajar cara bermain golf
Weedoze

@DownChristopher Terima kasih! Saya akan mencoba melakukan yang lebih baik lain kali
Weedoze


7

PHP, 47 45 40 byte

while($argn[-++$i]==$argn[-1]);echo$i-1;

Jalankan 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:

<?=strlen($a=$argv[1])-strlen(chop($a,$a[-1]));

menghapus dari kanan setiap karakter yang cocok dengan karakter paling kanan dan menghitung perbedaan panjangnya.


-Rdan $argnbisa menghemat 5 byte.
Titus




6

Perl 5 , 22 byte

21 byte kode + -pbendera.

/(.)\1*$/;$_=length$&

Cobalah online!

/(.)\1*$/mendapatkan angka identik terakhir, dan kemudian $_=length$&menetapkan panjangnya $_, yang dicetak secara tersirat berkat -pbendera.


6

C (gcc) , 32 29 byte

f(x){x=x%100%11?1:-~f(x/10);}

Ini adalah port jawaban Python saya .

Ini bekerja dengan gcc, tetapi kurangnya returnpernyataan adalah perilaku yang tidak ditentukan.

Cobalah online!


Saya bingung, kenapa Anda tidak melewati pointer, dan mengubah nilai di lokasi, atau hanya mengembalikan nilai. Ini sepertinya hanya mengubah salinan lokal, yang akan membuat fungsi tidak dapat digunakan, tetapi ini berfungsi pada TIO. Anda juga menambahkan 1 ke n di footer, bukan sizeof (int), bukankah itu memindahkan 1 byte ke depan, daripada lebar penuh int? Jelas ada beberapa trik yang bisa saya pelajari di sini, dan saya mungkin bisa menggunakan yang pertama dalam jawaban saya sendiri.
Bijan

2
Semua returnpernyataan 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.
Dennis

Apakah ada case (ketika menggunakan ints) ketika akan lebih baik untuk mengembalikan, sepertinya dalam kasus terburuk Anda akan membuat int baru, dan menetapkan itu.
Bijan

@Bijan C compiler selalu menyelaraskan akses memori langsung ke ukuran atom primitif yang bersangkutan - saya tidak ingat apakah itu dalam standar, meskipun
cat

5

Python 2, 51 byte

Mengambil bilangan bulat sebagai input. Cobalah online

lambda S:[x==`S`[-1]for x in`S`[::-1]+'~'].index(0)

48 byte untuk string sebagai input. Cobalah online

lambda S:[x==S[-1]for x in S[::-1]+'~'].index(0)

5

C # , 63 62 byte


Golf

i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}

Tidak disatukan

i => {
    int a = i.Length - 1,
        b = a;

    while( a-- > 0 && i[ a ] == i[ b ] );

    return b - a;
}

Tidak terbaca dibaca

i => {
    int a = i.Length - 1, // Store the length of the input
        b = a ;           // Get the position of the last char

    // Cycle through the string from the right to the left
    //   while the current char is equal to the last char
    while( a-- > 0 && i[ a ] == i[ b ] );

    // Return the difference between the last position
    //   and the last occurrence of the same char
    return b - a;
}

Kode lengkap

using System;

namespace Namespace {
   class Program {
      static void Main( String[] args ) {
         Func<String, Int32> f = i => {
            int a = i.Length - 1, b = a;
            while( a-- > 0 && i[ a ] == i[ b ] );
            return b - a;
         };

         List<String>
            testCases = new List<String>() {
               "14892093",
               "12344444",
               "112311",
               "888888",
               "135866667"
            };

         foreach( String testCase in testCases ) {
            Console.WriteLine( $" Input: {testCase}\nOutput: {f( testCase )}\n" );
         }

         Console.ReadLine();
      }
   }
}

Rilis

  • v1.1 - - 1 byte - Terima kasih atas komentar Kevin .
  • v1.0 -  63 bytes- Solusi awal.

Catatan

Tidak ada yang perlu ditambahkan


+1 Anda dapat melakukan golf dengan 1 byte. Seperti ini:i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}
Kevin Cruijssen


4

MATL , 6 5 byte

1 byte disimpan berkat @Luis

&Y'O)

Cobalah di MATL Online

Penjelasan

        % Implicitly grab input as a string
&Y'     % Perform run-length encoding on the string but keep only the second output
        % Which is the number of successive times an element appeared
O)      % Grab the last element from this array
        % Implicitly display

Saya lupa bahwa &hal itu terjadi pada Y':-D Mengapa tidak mengambil input sebagai string yang dilampirkan dalam tanda kutip dan menyingkirkan j?
Luis Mendo

@LuisMendo Saya tidak yakin apakah saya bisa melakukan itu karena tantangan secara eksplisit mengatakan bahwa input adalah "integer"
Suever

Saya berasumsi demikian dari komentar Martin dan dari aturan default, yang memungkinkan itu. Tapi saya tidak begitu yakin
Luis Mendo

@LuisMendo Ah ok tidak melihat komentarnya. Akan memperbarui!
Suever

4

Cubix, 24 19 byte

)uO)ABq-!wpUp)W.@;;

Catatan

  • Sebenarnya menghitung berapa banyak karakter yang sama di akhir input, jadi ini berfungsi untuk bilangan bulat yang sangat besar dan string yang sangat panjang juga (selama jumlah karakter yang sama di akhir lebih kecil dari presisi maksimum JavaScript ( sekitar 15 digit pada basis-10).
  • Input masuk dalam bidang input, output dicetak ke bidang output

Coba di sini

Penjelasan

Pertama, mari kita perluas kubus

    ) u
    O )
A B q - ! w p U
p ) W . @ ; ; .
    . .
    . .

Langkah-langkah dalam eksekusi dapat dibagi menjadi tiga fase:

  1. Masukan parse
  2. Bandingkan karakter
  3. Hasil cetak

Fase 1: Input

Dua karakter pertama yang dieksekusi adalah Adan B. Amembaca 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).

    . .
    . .
A B E . . . . .
. . . . . . . .
    . .
    . .

Fase 2: Perbandingan karakter

Tumpukannya adalah ..., C[a-1], C[a], counter, di mana counterpenghitung yang akan bertambah ketika kedua karakter yang diperiksa ( C[a]dan C[a-1]) sama. IP pertama kali memasuki loop ini pada Skarakter, bergerak ke kanan. The Ekarakter adalah posisi di mana IP akan berakhir (menunjuk kanan) saat C[a]dan C[a-1]tidak memiliki nilai yang sama, yang berarti bahwa mengurangkan C[a]dari C[a-1]tidak menghasilkan 0, dalam hal instruksi berikut !akan dilewati (yang merupakan w).

    . .
    . .
. S q - ! w E .
p ) W . . ; ; .
    . .
    . .

Berikut adalah instruksi yang dijalankan selama satu lingkaran penuh:

q-!;;p) # Explanation
q       # Push counter to the bottom of the stack
        #     Stack (counter, ..., C[a-1], C[a])
 -      # Subtract C[a] from C[a-1], which is 0 if both are equal
        #     Stack (counter, ..., C[a-1], C[a], C[a-1]-C[a])
  !     # Leave the loop if C[a-1]-C[a] does not equal 0
   ;;   # Remove result of subtraction and C[a] from stack
        #     Stack (counter, ..., C[a-1])
     p  # Move the bottom of the stack to the top
        #     Stack (..., C[a-1], counter)
      ) # Increment the counter
        #     Stack (..., C[a-1], counter + 1)

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 -1bukan 0. Jalan di kubus terlihat seperti ini, mulai dari S, menunjuk ke kanan. Dua no-ops yang dijalankan oleh IP digantikan oleh panah yang mengarah ke IP.

    ) u
    O )
. B . . . S p U
. ) . . @ . . .
    > >
    . .

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.

p))OB)@ # Explanation
p       # Pull the counter to the top
        #     Stack: (..., counter)
 ))     # Add two
        #     Stack: (..., counter + 2)
   O    # Output as number
    B)  # Reverse the stack and increment the top
      @ # End the program

Alea iacta est.


3

Batch, 91 byte

@set s=-%1
@set n=1
:l
@if %s:~-2,1%==%s:~-1% set s=%s:~,-1%&set/an+=1&goto l
@echo %n%

The -mencegah tes dari lari awal string.


3

JavaScript (ES6), 34 byte

f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)

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. paku sundefined pada iterasi pertama, yang berarti n%10-ppengembalian NaN(falsy). Setelah itu, psama dengan digit sebelumnya dengan n%10. Ketika digit saat ini ( n%10) dan sebelumnya ( p) berbeda, loop berakhir.


3

Raeda , 12 byte

{count|tail}

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: countdantail :

  1. count membaca nilai dari aliran dan mendorong jumlah elemen berurutan ke aliran.
  2. tail mengembalikan nilai terakhir dalam aliran.

3

T-SQL, 238 214 Bytes

declare @ varchar(max) = '' declare @i int=0, @e int=0, @n int=right(@,1), @m int while (@i<=len(@)) begin set @m=(substring(@,len(@)-@i,1)) if (@n=@m) set @e=@e+1 else if (@i=0) set @e=1 set @i=@i+1 end select @e

Atau:

declare @ varchar(max) = '12345678999999'
declare 
    @i int = 0,
    @e int = 0,
    @n int = right(@,1),
    @m int

while (@i <= len(@))
begin
    set @m = (substring(@,len(@)-@i,1))
    if (@n = @m) set @e = @e + 1
    else
    if (@i) = 0 set @e = 1
    set @i = @i + 1
end
select @e

2

Java 7, 78 byte

int c(int n){return(""+n).length()-(""+n).replaceAll("(.)\\1*$","").length();}

Coba di sini.

Saya mencoba beberapa hal menggunakan rekursi atau loop, tetapi keduanya berakhir di atas 100 byte ..


2

Powershell, 41 Bytes

for($n="$args";$n[-1]-eq$n[-++$a]){};$a-1

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.


2

Mathematica, 33 30 byte

Terima kasih kepada Greg Martin untuk menghemat 3 byte.

Tr[1^Last@Split@Characters@#]&

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.


Charactersbukan IntegerDigits?
Greg Martin

@GregMartin Ah ya, saya kira. Terima kasih.
Martin Ender

Anda masih belum mengalahkan pegolf Mathematica yang cerdik lainnya untuk pertanyaan ini;)
Greg Martin

@GregMartin Sayang sekali. :)
Martin Ender


2

JavaScript (ES6), 39 38 37 27 byte

f=n=>n%100%11?1:1+f(n/10|0)

Mungkin tidak lebih pendek dari solusi berbasis regex, tapi saya tidak bisa menolak menulis solusi sepenuhnya berdasarkan aritmatika. Tekniknya adalah mengambil n % 100 % 11dan membaginya berulang kali hingga 10 sampai hasilnya nol, lalu hitung iterasinya. Ini berfungsi karena jika dua digit terakhir adalah sama, n % 100 % 11akan menjadi 0.


Ah, kamu selesai sebelum aku haha! Saya tidak yakin apakah akan mengirim jawaban lain, karena kemungkinan besar mereka akan bertemu setelah bermain golf, tapi inilah solusi saya menggunakan 34 byte:f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)
user81655

@ user81655 Bagus sekali, silakan mempostingnya. Saya tidak berpikir saya akan bertemu dengan itu tanpa makeover lengkap, dan tentu saja sekarang saya telah melihat milik Anda yang tidak akan terjadi ;-)
ETHproduksi

2

Haskell , 33 byte

f(h:t)=sum[1|all(==h)t]+f t
f _=0

Cobalah online!

Mengambil input string. Berulang-ulang memotong karakter pertama, dan menambahkan 1 jika semua karakter dalam suffix sama dengan yang pertama.


2

R, 35 byte

rle(rev(charToRaw(scan(,''))))$l[1]

Penjelasan singkat

                  scan(,'')         # get input as a string
        charToRaw(         )        # convert to a vector of raws (splits the string)
    rev(                    )       # reverse the vector
rle(                         )$l[1] # the first length from run length encoding

2

Befunge-98 , 19 byte

01g3j@.$~:01p-!j$1+

Cobalah online!

Ini bisa dibuat lebih pendek jika saya hanya menggunakan stack.

Bagaimana itu bekerja:

01g3j@.$~:01p-!j$1+
01g                 ; Get the stored value (default: 32)                 ;
   3j               ; Skip to the ~                                      ;
        ~           ; Get the next character of input                    ;
         :01p       ; Overwrite the stored value with the new char       ;
             -!     ; Compare the old value and the new                  ;
               j$   ; Skip the $ when equal, else pop the counter        ;
                 1+ ; Increment the counter                              ;

; When the input runs out, ~ reflects the IP and we run: ;
   @.$
     $              ; Pop the extraneous value (the stored value) ;
   @.               ; Print the number and exit                   ;

2

Python 3 - 50 44 byte

Program lengkap (dengan Python 3, input()mengembalikan string, apa pun inputnya):

g=input();print(len(g)-len(g.rstrip(g[-1]))) 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.