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!


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

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 ║
      ╘═════════╝   └─┬─╜       ╘════╤════╝
                      └──────────────┘

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

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

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

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

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

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

3

Scala:

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


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

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

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.


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

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"

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

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
}

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

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

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

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.


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

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

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=!).


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


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.


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


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 );


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.

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

1

k [28 karakter]

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

Pemakaian

{+/($x+!y)like"*",$:[z],"*"}[0;1000000;2]
468559

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