Hitung kemunculan bilangan bulat [tertutup]

13

Berdasarkan pertanyaan Berapa banyak bilangan bulat positif <1.000.000 mengandung angka 2? . Saya mencari solusi paling kreatif untuk menghitung semua Integer dari Xhingga Ymengandung Integer Z. Zdapat dari 0 hingga Y.

Setiap bilangan bulat yang ditemukan hanya dihitung satu kali, bahkan jika bilangan bulat Zlebih sering muncul. Sebagai contoh:

Z = 2
123 counts 1
22222 also counts 1

Saya akan mulai dengan algoritma yang sangat sederhana yang ditulis dalam Java (karena dicintai oleh semua orang):

public class Count {
    public static void main(String[] args) {
        int count = 0;
        for (int i = Integer.parseInt(args[0]); i <= Integer.parseInt(args[1]); i++) {
            if (Integer.toString(i).contains(args[2])) {
                count++;
            }
        }
        System.out.println(count);
    }
}

jika Anda menjalankan ini dengan

java -jar Count.jar 0 1000000 2

Anda mendapatkan ini sebagai hasilnya:

468559

Karena masalah ini tidak sulit untuk diselesaikan, itu hanya . Jawaban yang paling banyak diposting diposting oleh 28 Februari menang!

Obl Tobl
sumber
Tidak sepenuhnya jelas dari pos Anda, tetapi saya kira Z dapat antara 0 dan inf? Atau hanya antara 0 dan 9?
mmumboss
Z dapat antara 0 dan Y. Tidak masuk akal bahwa Z bisa lebih besar dari Y.
Obl Tobl
@ OblTobl Apakah Anda benar-benar ingin secara eksplisit mengecualikan kasus Z> Y? Mengapa tidak hanya memiliki output yang diharapkan dalam hal ini menjadi 0?
Cruncher
@Cruncher saya tidak keberatan! tapi menurut saya agak tidak berguna ;-)
Obl Tobl
Apakah ini berarti itu Nbisa 123dan hanya akan cocok jika substring 123 ada?
Populus

Jawaban:

26

bash (20)

seq $1 $2|grep -c $3

Pemakaian

$ bash count.sh 0 1000000 2
468559
Dennis
sumber
10
itu lucu jika panggilannya lebih lama dari program itu sendiri ;-)
Obl Tobl
11

Funciton

Seperti biasa, karena ketinggian garis yang ditambahkan oleh StackExchange memecah garis, pertimbangkan untuk menjalankan $('pre').css('line-height',1)konsol browser Anda untuk memperbaikinya.

Tidak seperti jawaban Funciton saya yang lain, yang ini tidak menggunakan deklarasi fungsi apa pun. Itu hanya sebuah program. Ia menggunakan ekspresi lambda, meskipun - fitur yang saya tambahkan ke Funciton pada bulan Desember :)

Mengharapkan input sebagai tiga bilangan bulat desimal (bisa negatif) dipisahkan oleh spasi (yaitu x y z). Bahkan, zbisa berupa string apa pun; misalnya, bisa jadi hanya tanda minus ( , U + 2212) untuk menghitung jumlah angka negatif dalam interval :)

           ┌───╖
     ┌───┬─┤ ♯ ╟──────────┐
     │   │ ╘═══╝ ╔════╗ ┌─┴─╖             ┌────╖ ╔═══╗
   ┌─┴─╖ └────┐  ║ 21 ║ │ × ╟─────────────┤ >> ╟─╢   ║
 ┌─┤ ʃ ╟───┐  │  ╚══╤═╝ ╘═╤═╝             ╘═╤══╝ ╚═══╝
 │ ╘═╤═╝   │  └──┐  └─────┘   ┌───────────┐ │
 │ ╔═╧═╗ ┌─┴─╖ ┌─┴─╖ ╔════╗ ┌─┴─╖   ┌───╖ ├─┴────────┐
 │ ║   ╟─┤ · ╟─┤ ʘ ╟─╢ 32 ╟─┤ · ╟───┤ ʘ ╟─┘          │
 │ ╚═══╝ ╘═╤═╝ ╘═══╝ ╚════╝ ╘═╤═╝   ╘═╤═╝ ┌─────┐    │
 │         └───────┐  ╔═══╗ ┌─┴─╖     │ ┌─┴─╖   │    │
 │ ┌───────────┐   └──╢ 0 ╟─┤ ʃ ╟─┐   │ │ ♯ ║   │    │
 │ │   ┌───╖ ┌─┴─╖    ╚═══╝ ╘═╤═╝ │   │ ╘═╤═╝ ┌─┴─╖  │
 │ │ ┌─┤ ♯ ╟─┤   ╟─┬─┐ ╔════╗ │ ┌─┴─╖ │   │ ┌─┤ × ║  │
 │ │ │ ╘═══╝ └─┬─╜ └─┘ ║ −1 ║ └─┤ · ╟─┴───┘ │ ╘═╤═╝  │
 │ │ │    ┌────┴────┐  ╚══╤═╝   ╘═╤═╝       │ ╔═╧══╗ │
 │ │ │    │ ┌───╖ ┌─┴─╖ ┌─┴─╖ ┌───┴─────╖   │ ║ 21 ║ │
 │ │ │    └─┤ ♯ ╟─┤ ? ╟─┤ = ║ │ str→int ║   │ ╚════╝ │
 │ │ │      ╘═══╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═══════╝   │ ┌────╖ │
 │ │ │      ╔═══╗ ┌─┴─╖   └─┐ ┌─┴─╖         └─┤ >> ╟─┘
 │ │ │      ║ 0 ╟─┤ ? ╟─┐   └─┤ · ╟───┐       ╘═╤══╝
 │ │ │      ╚═══╝ ╘═╤═╝ └─┐   ╘═╤═╝   └───┐   ┌─┴─╖
 │ │ │            ┌─┴─╖   └─┐ ┌─┴─╖       └───┤ ʘ ║
 │ │ └────────────┤ · ╟─┐   └─┤ ≤ ║           ╘═╤═╝
 │ │              ╘═╤═╝ │     ╘═╤═╝ ┌─────────╖ │
 │ │        ╔═══╗ ╔═╧═╕ │       └─┬─┤ int→str ╟─┘
 │ │        ║ 0 ╟─╢   ├─┤         │ ╘═════════╝
 │ │        ╚═══╝ ╚═╤═╛ └─────────┘
 │ └────────────────┴─┐              │
 │    ┌─────────╖   ┌─┴─╖ ┌─┐   ┌────┴────╖
 └────┤ str→int ╟───┤   ╟─┴─┘   │ int→str ║
      ╘═════════╝   └─┬─╜       ╘════╤════╝
                      └──────────────┘
Timwi
sumber
1
Itu keren sekali! Menggunakan bahasa yang Anda buat sendiri
pcnThird
2
@pcnThird: Saya pikir Timwi menghabiskan seluruh waktunya untuk bermain golf atau membuat bahasa untuk bermain golf (lihat juga Sclipting)!
Gabe
10

C #

public class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine(Enumerable.Range(Convert.ToInt32(args[0]), (Convert.ToInt32(args[1]) + 1) - Convert.ToInt32(args[0])).Count(x => x.ToString().Contains(args[2])));
    }
}

Contoh

count.exe 0 1000000 2
468559
Mo D
sumber
solusi cerdas! Saya suka Anda melakukannya tanpa loop.
Obl Tobl
@ OblTobl tanpa loop yang terlihat .
Justin
tentu saja, nice anyways
Obl Tobl
1
Ia memiliki bug, .Rangemenerima (int start, int count), tidak (start, end). Saya selalu jatuh ke dalam perangkap ini sendiri :)
Grozz
Melayani saya tepat untuk dengan cepat mengetuk ini di Notepad ... Saya telah mengubah kode sehingga sekarang benar!
Mo D
5

APL (29)

{+/∨/¨(⍕⍺)∘⍷¨⍕¨⊃{⍺+0,⍳⍵-⍺}/⍵}

Ini adalah fungsi yang mengambil Zsebagai argumen kiri dan interval [X,Y]sebagai argumen kanan:

      2 {+/∨/¨(⍕⍺)∘⍷¨⍕¨⊃{⍺+0,⍳⍵-⍺}/⍵} 0 1e6
468559
      0 {+/∨/¨(⍕⍺)∘⍷¨⍕¨⊃{⍺+0,⍳⍵-⍺}/⍵} 0 1e6
402131
      42 {+/∨/¨(⍕⍺)∘⍷¨⍕¨⊃{⍺+0,⍳⍵-⍺}/⍵} 0 1e6
49401
marinus
sumber
tidak begitu jelas ... tapi sangat keren!
Obl Tobl
4

Python 2.7

Perlu untuk kecepatan

Penjelasan

masukkan deskripsi gambar di sini

Penerapan

def Count(lo,hi,key):
    if hi == 0: return 0
    # Count(lo,hi,key) = Count(0,hi,key) - Count(0,lo - 1,key)
    if lo != 0: return Count(0, hi, key) - Count(0, lo - 1, key)
    # Calculate no of digits in the number to search
    # LOG10(hi) may be a descent trick but because of float approximation
    # this would not be reliable
    n = len(str(hi)) - 1
    # find the most significant digit
    a_n = hi/10**n
    if a_n < key:
        count = a_n*(10**n - 9**n)
    elif a_n > key:
        count = (a_n - 1)*(10**n - 9**n) + 10**n
    else:
        count = a_n*(10**n - 9**n) + 1
    if hi % 10**n != 0:
        if a_n != key:
            return count + Count(0, hi%10**n, key)
        else:
            return count + hi%10**n
    else:
        return count

Demo

In [2]: %timeit Count(0,123456789987654321,2)
100000 loops, best of 3: 13.2 us per loop

Perbandingan

@Dennis

$ \time -f%e bash count.sh 0 1234567 2
585029
11.45

@arshajii

In [6]: %timeit count(0,1234567,2)
1 loops, best of 3: 550 ms per loop
Abhijit
sumber
Ini, tentu saja, jauh lebih cepat, tetapi tidak memenuhi persyaratan pertanyaan. keydapat berupa bilangan bulat apa pun , bukan digit, antara lodan hi.
Dennis
masih ada solusi matematis, meskipun akan lebih lama lagi ...
Red Alert
3

Python 2.7

Solusi menggunakan ekspresi reguler:

>>> from re import findall as f
>>> count=lambda x,y,z:len(f('\d*%d\d*'%z,str(range(x,y+1))))
>>>
>>> count(0,1000000,2)
468559
arshajii
sumber
Anda dapat menggunakannya re.findalldalam satu __import__('re').findall('\d...
kalimat
3

pesta - 32 31 17 14 karakter + panjang X, Y dan Z

Terima kasih kepada devnull untuk sarannya seq!

seq [X] [Y]|grep -c [Z]

misal X = 100, Y = 200, Z = 20

$ seq 100 200|grep -c 20
2

misal X = 100, Y = 200, Z = 10

$ seq 100 200|grep -c 10
11

misal X = 0, Y = 1000000, Z = 2

$ seq 0 1000000|grep -c 2
468559

sumber
bagus dan jelas!
Obl Tobl
Mengapa menggunakan echosaat Anda bisa menggunakan seqdan mengurangi panjangnya hingga 4 karakter? (1 untuk panjang perintah, 2 karena bisa menghilangkan kurung kurawal dan 1 untuk mengganti ..dengan satu spasi)
devnull
@ evnull - terima kasih, dan juga dapat menyingkirkan xargsdan wc- dan itu juga berjalan lebih cepat!
3

PHP

Tidak ada yang orisinal, hanya merayakan posting pertama saya di sini.

<?php

    $x = $argv[1];
    $y = $argv[2];
    $z = $argv[3];
    $count = 0;

    do
    {
        if (!(strpos($x, $z) === false))
            $count++;
        $x++;
    } while ($x <= $y);

    echo $count;

?>

Memasukkan

php script.php 0 1000000 2

Keluaran

468559

sumber
3

Scala:

args(0).toInt to args(1).toInt count (_.toString contains args(2))

Grozz
sumber
2

Rubi

Ini adalah contoh yang bagus untuk menggunakan pengurangan!

puts (ARGV[0]..ARGV[1]).reduce(0) { |c, n| n.to_s.include?(ARGV[2].to_s) ? c + 1 : c }

Memasukkan:

ruby script.rb 0 1000000 2

Keluaran:

468559
Pablo
sumber
2

Golf Python - 61

f=lambda x,y,z:len([i for i in range(x,y)if str(z)in str(i)])

Python bukan golf

def f(x, y, z):
    c = 0
    for i in range(x, y):
        c += str(z) in str(i)
    return c
cjfaure
sumber
2

Java8

Menggunakan hal-hal IntStream baru, ini menjadi dasarnya satu liner, jika Anda mengabaikan hal-hal Java Framework wajib:

import java.util.stream.IntStream;
public class A{
  public static void main(String[] args){
    System.out.println(IntStream.rangeClosed(Integer.parseInt(args[0], Integer.parseInt(args[1])).filter(x -> ((Integer)x).toString().contains(args[2])).count());
  }
}

Itu bisa dijalankan di sini , walaupun saya memang harus meng-hardcode nilai-nilainya.

Sinkingpoint
sumber
Solusi Java yang sangat menarik
Obl Tobl
2

F #

Solusi ini digunakan IndexOfuntuk mencari string, kemudian sedikit mengutak-atik angka untuk mengkonversi hasilnya menjadi 1 jika ditemukan, dan 0 jika tidak ditemukan, kemudian jumlah hasilnya:

let count x y (z : string) = 
    [ x .. y ] |> Seq.sumBy(fun n -> min 1 (n.ToString().IndexOf z + 1))

Dan itu bisa disebut seperti ini:

count 0 1000000 "2" // 468559
pswg
sumber
2

Ekspresi Reguler

Mengikuti akan menghitung angka 1 hingga 49.

#!/bin/bash

echo "12313451231241241111111111111111111111111111111111111"  |\  
sed "s/[^1]//g;s/11111/5/g;s/1111/4/g;s/111/3/g;s/11/2/g;s/555555555/45/g;s/55555555/40/g;s/5555555/35/g;s/555555/30/g;s/55555/25/g;s/5555/20/g;s/555/15/g;s/55/10/g;s/54/9/g;s/53/8/g;s/52/7/g;s/51/6/g;s/50/5
/g;s/40/4/g;s/30/3/g;s/20/2/g;s/10/1/g"
Craig Taylor
sumber
2

R 23 25 27karakter

Dapatkan saja alat yang tepat untuk pekerjaan itu. Penggunaan sederhana grep di R, tidak ada yang mewah.

Inilah yang dilakukannya: grepsemua instance 2dalam vektor 0sampai 10e6dan menghitung jumlah hasil yang digunakan length.

length(grep(2,0:100000,value=TRUE))

length(grep(2,0:10e6))

Hasil: [1] 468559


Di luar kantor, Anda dapat menulis fungsi yang menggunakan angka-angka sebagai input, seperti yang ditunjukkan pada contoh.

count = function(x=0, y=1000000, z=2){
  length(grep(z,x:y))
}

Sekarang Anda dapat memanggil countdengan x, y dan z, jika tidak disetel (secara default), nilai untuk x, y dan z masing-masing adalah 0, 1000000 dan 2. Beberapa contoh:

count()
[1] 468559

atau

count(20, 222, 2)
[1] 59

atau

count(0, 100, 10)
[1] 2

Beberapa di sini menganggap waktu itu penting, menggunakan fungsi ini dalam R membutuhkan waktu sekitar 1 detik.

system.time(count())
user  system elapsed 
0.979   0.003   0.981
SepupuCocaine
sumber
mungkin ini terlalu pendek ;-)
Obl Tobl
Yah, ini bukan kode-golf pula :) Saya bertanya-tanya: apa yang akan terlihat seperti program jika harus mengambil angka sebagai input (daripada hardcoding mereka)?
Timwi
Menciptakan fungsi untuk imajinatif;)
CousinCocaine
1

JavaScript (ES6), 63

f=(i,j,n)=>{for(c=0;i<=j;!~(''+i++).indexOf(n)?0:c++);return c}

Pemakaian:

f(0, 1e6, 2)
> 468559

Tidak golf:

f = (i,j,n) => {
  for(
    // Initialize the counter.
    c=0;
    // Iterate through all integers.
    i<=j;
    // Convert current number into string then increment it.
    // Check if the digit appears into the current number.
    !~(''+i++).indexOf(n)
      // Occurence not found.
      ? 0
      // Occurence found.
      // Add 1 to the counter.
      : c++
  );
  return c
}
Florent
sumber
1

Rubi

Pada dasarnya saya mengambil jawaban Pablo dan semi-golf (38 karakter jika Anda menjatuhkan spasi yang tidak perlu) menjadi contoh penggunaan yang tidak terlalu bagus select.

Ini memilih setiap indeks dalam rentang (x .. y)yang berisi z. Sayangnya, hasil antara ini disimpan dalam array, yang ukurannya kemudian dikembalikan.

x,y,z = $*
p (x..y).select{ |i| i[z] }.size

Kelihatannya cukup rapi baik secara sintaksis maupun semantik, meskipun i[z]bagian itu tampaknya tidak masuk akal.

Ini bekerja karena xdan ysebenarnya adalah string, bukan angka! Dengan demikian masing i- masing juga merupakan string, dan i[z]tentu saja memeriksa apakah string ztersebut terkandung dalam i.

$ ruby count-digits.rb 100 200 20
2
$ ruby count-digits.rb 0 1000000 2
468559
daniero
sumber
1

Python 2.7, 70 tanda

f = lambda x,y,z: sum(map(lambda x: str(z) in str(x), range(0, y+1)))

>>> f(0, 1000000, 2)
468559

Lebih pendek, 65 tanda

g = lambda x, y, z: sum(str(z) in str(i) for i in range(0, y+1))
>>> g(0, 1000000, 2)
468559
njzk2
sumber
Saya tidak berpikir Anda perlu range(0,y+1)jika range(y+1)melakukan hal yang sama. Juga, Anda dapat menghapus sebagian besar ruang tersebut jika Anda bermain golf ...
SimonT
1

Menggunakan ruby Enumerable#grep:

start, stop, target = $*
p (start..stop).grep(Regexp.new target).size
OI
sumber
1

T-SQL

Jika saya bisa berasumsi variabel @X, @Ydan @Zyang tersedia:

Dengan tabel (nomor besar sembarang;) yang ada - 65

select count(*)from n where n>=@X and n<=@Y and n like '%'+@Z+'%'

Dengan CTE rekursif - 127

with n(n)as(select @X union all select n+1 from n where n<@Y)select count(*)from n where n like'%'+@Z+'%'option(MAXRECURSION 0)

Jika variabel perlu didefinisikan secara eksplisit:

Tambahkan 58 pada kedua jawaban - Tabel angka: 123, CTE Rekursif: 185

declare @X int=0;declare @Y int=100;declare @Z varchar(30)='2';

Saya tidak tahu berapa banyak memori yang dapat digunakan oleh CTE rekursif, tetapi tentu saja tidak akan memenangkan kontes kecepatan. Contoh mencari 2 dalam 0 hingga 1000000 membutuhkan 8 detik pada sistem saya.

Inilah SQL Fiddle jika ada yang ingin bermain dengannya. Kueri 1000000 membutuhkan waktu 30+ detik untuk dijalankan.

Nick
sumber
tidak cepat tapi sangat kreatif!
Obl Tobl
1

Rebol

; version 1 (simple loop counting)

count: func [x [integer!] y [integer!] z [integer!] /local total] [
    total: 0
    for n x y 1 [if found? find to-string n z [++ total]]
    total
]


; version 2 (build series/list and get length)

count: func [x [integer!] y [integer!] z [integer!]] [
    length? collect [for n x y 1 [if find to-string n z [keep true]]]
]

Contoh penggunaan dalam konsol Rebol (REPL):

>> count 0 1000000 2
== 468559
draegtun
sumber
1

PowerShell

Dua solusi, keduanya 40 37 karakter.

Untuk semua versi PowerShell:

$a,$b,$c=$args;($a..$b-match$c).count

PowerShell V3 ke atas memiliki slsalias untuk Select-String. Ini mengharuskan @untuk memaksa array jika hanya satu nilai yang membuatnya melalui pipa.

$a,$b,$c=$args;@($a..$b|sls $c).count
Rynant
sumber
1

Batch

@setLocal enableDelayedExpansion&@set a=0&@for /L %%a in (%1,1,%2) do @set b=%%a&@if "!b:%3=!" NEQ "!b!" @set/aa+=1
@echo !a!

H:\uprof>count 0 1000000 2
468559

H:\uprof>count 1 2 3
0

Sedikit lebih mudah dibaca -

@setLocal enableDelayedExpansion
@set a=0
@for /L %%a in (%1,1,%2) do (
    @set b=%%a
    @if "!b:%3=!" NEQ "!b!" @set/aa+=1
)
@echo !a!

Bagus dan sederhana. Menggunakan manipulasi string untuk memeriksa apakah variabel !b!sama dengan dirinya sendiri tanpa input pengguna ketiga, %3( !b:%3=!).

hapus clemeat
sumber
1

Mathematica

Cara pertama: string

x, y, zdikonversi menjadi string. Jika string-integer tidak bebas z, itu dihitung.

f[{x_,y_},z_] :=Length[Select[ToString/@Range[Max[x, z], y], !StringFreeQ[#, ToString@z] &]]

Contohnya

f[{22, 1000}, 23]
f[{0, 10^6}, 2]

20
468559


Cara kedua: daftar digit

g[{x_,y_},z_]:=(t=Sequence@@ IntegerDigits@z;Length@Cases[IntegerDigits@Range[190], 
{s___,t,e___}])

Contohnya

g[{22, 1000}, 23]
g[{0, 10^6}, 2]

20
468559

DavidC
sumber
Mathematica selalu menarik, bahkan untuk masalah sederhana
Obl Tobl
1

GolfScript

Saya sudah mencoba untuk meningkatkan keterampilan GolfScript saya jadi saya pikir saya akan mencobanya dengan pertanyaan ini. Inilah yang saya pikirkan:

`@@0\{.3$>}{.`4$?-1>@+\(}while@;;\;

Ini dapat dipecah seperti ini:

0 1000000 2    # parameters

`@@            # convert Z to string and put at bottom of stack
0\             # init counter and swap
{.3$>}         # loop condition: Y > X
{              # loop body
  .`           # convert to string
  4$?          # search for substring
  -1>@+        # if found add to counter
  \(           # decrement Y
}              # end loop body
while          # perform loop
@;;\;          # cleanup

Meskipun itu adalah GolfScript, dengan tujuan lebih untuk membuatnya relatif efisien daripada kompak, jadi saya yakin seseorang dapat menunjukkan berbagai cara ini dapat ditingkatkan.

Demonstrasi : Perhatikan bahwa saya telah mengurangi Y di demo sehingga dapat selesai dalam <5 detik.

pswg
sumber
1

PHP - 112

Tidak ada loop yang terlihat, tetapi sedikit berat pada memori!

<?=count(array_filter(range($argv[1],$argv[2]),function($i)use($argv){return strpos($i,$argv[3].'')!==false;}));

Pemakaian php script.php 0 1000000 2

kacang zam
sumber
1

ECMAScript 3 hingga 6

(javascript, JScript, dll)

menggunakan regex:

function f(x,y,z,r){for(r=0,z=RegExp(z);x<y;r+=+z.test(''+x++));return r}

kerusakan:

function f(x,y,z,r){        // note argument `r`, eliminating the need for `var `
  for( r=0, z=RegExp(z)     // omitting `new` since ES will add it if omitted
     ; x<y                  // 
     ; r+=+z.test(''+x++)   // `x++` == post increment
                            // `''+Number` == convert Number to string
                            // `test` gives true | false
                            // `+Boolean` converts boolean to 1 | 0
                            // `r+=Number` incrementing r (were Number is always 1 or 0)
     );                     // no body thus semicolon is mandatory!
  return r;                 // returning r
}

menggunakan indexOf:

function f(x,y,z,r){for(r=0;x<y;r+=+!!~(''+x++).indexOf(z));return r}

kerusakan:

function f(x,y,z,r){                // note argument `r`, eliminating the need for `var `
  for( r=0                          // omitting `new` since ES will add it if omitted
     ; x<y                          // 
     ; r+=+!!~(''+x++).indexOf(z)   // `x++` == post increment
                                    // `''+Number` == convert Number to string
                                    // `indexOf` returns index or `-1` when not found
                                    // `!!~ indexOf` converts sentinel value to boolean
                                    // `+Boolean` converts boolean to 1 | 0
                                    // `r+=Number` incrementing r (were Number is 1 or 0)
     );                             // no body thus semicolon is mandatory!
  return r;                         // returning r
}

fungsi-tubuh ini adalah satu karakter kurang dari florent, jadi ketika menggunakan =>notasi fungsi ES6 total akan menjadi 62 karakter

Contoh panggilan: f(0,1e6,2)
Contoh penggunaan:alert( f(0,1e6,2) );

JSFiddle di sini

PS: kedua fungsi di atas mengembalikan variabel lokal mereka r.
Jadi ketika membocorkan variabel hasil rke lingkup global, orang dapat lagi menyimpan 10 karakter:

function f(x,y,z){for(r=0;i<=j;r+=+!!~(''+i++).indexOf(z));}

Contoh penggunaan: alert( f(0,1e6,2)||r );

GitaarLAB
sumber
1

Delphi - 120

Agak banyak untuk seleraku, akan melihat apakah aku bisa mendapatkan beberapa.

var x,y,z,i,c:int16;begin readLn(x,y,z);for i:=x to y do if inttostr(i).contains(inttostr(z))then inc(c);writeln(c);end.
Teun Pronk
sumber
tidak masalah untuk panjangnya, saya suka melihat solusi delphi ;-)
Obl Tobl
@ OblTobl Hebat, tapi sangat menyenangkan untuk membuatnya singkat: P
Teun Pronk
1

Python 2.7 - 50 karakter

Sedikit penghematan pada jawaban Python yang ada.

lambda x,y,z:sum(1for n in range(y-x)if`z+x`in`n`)

Menggunakan trik berikut:

  • Jumlah dapat diterapkan ke generator, tidak seperti len, jadi gunakan jumlah (1 ...) alih-alih len ([n ...])
  • Gunakan `` sebagai ganti str (), yang juga memungkinkan ...
  • Bunuh semua ruang - lihat '1untuk' dan 'jika z+xdalam n'
  • Hapus rentang pertama () arg dengan mulai dari 0 dan menguji offset (sebenarnya ... tidak ada yang menyelamatkan saya tetapi saya lebih suka tampilannya lebih baik :))

Beraksi:

In [694]: (lambda x,y,z:sum(1for n in range(y-x)if`z+x`in`n`))(0,1000000,2)
Out[694]: 468559
psion5mx
sumber
1

k [28 karakter]

{+/($x+!y)like"*",$:[z],"*"}

Pemakaian

{+/($x+!y)like"*",$:[z],"*"}[0;1000000;2]
468559
nyi
sumber
1
Anda dapat menyimpan karakter dengan mengganti $:[z]dengan ($z).
mollmerx
Namun, batas atas solusi Anda salah. Ia menyebutkan dari x ke x + y-1, bukan dari x ke y.
mollmerx