Belirli bir aralıkta kaç tamsayı bir sayı içeriyor


19

Program girişi numarası başlangıç ve aralığının sonuna arasında görünür kaç tamsayılar numarası, aralığının başlangıcını ve aralığının bitişini ve çıkış almalı dahil . Hem programlara hem de işlevlere izin verilir.

Örnek Girdiler

Örneğin:

//Input example 1
3,1,100
//Input example 2
3
1
100
//Input example 3
3 1 100
//Input example 4
a(3, 1, 100);

Yukarıdaki dört giriş örneğinin tümü geçerlidir ve bunların tümü, 3söz konusu sayı 1, aralığın başlangıcı ve aralığın 100sonu olduğu anlamına gelir.

Ve sonra programın gerektiği birçok kez nasıl çıktı 3aralığında görünür 1için 100 kapsayıcı . 3tamsayılar görünür 3, 13, 23, 30, 31, 32, 33, ..., 9319 kez olmak üzere toplam en. Bu yüzden program çıktı 19olarak çıkmalıdır , çünkü ila 3aralığında kaç kez görünür .1100

kurallar

  • Hem programlara hem de işlevlere izin verilir.
  • Tüm sayılar orada olacak, yani tamsayı olacak değil herhangi biri floatler veya doubles.
  • Not: aranan numara her zaman aralıkta olacaktır 0≤x≤127. Bu aralığın dışında olacağı hiçbir durum olmayacaktır 0≤x≤127.
  • İlk örnekte olduğu gibi 33, olduğu gibi , sayı iki kez değil , 3sadece bir kez görünecek şekilde sayılır .
  • Aralığın başlangıç ​​ve bitiş değerleri arasında -65536ve 65535kapsayıcı olacaktır.
  • Aralık başlangıcının değeri asla aralık sonunu aşmayacak veya ona eşit olmayacaktır. start < end
  • Ayrıca aralık dahil. Örneğin, giriş 8 8 10olsaydı, aralık olur 8≤x≤10ve dolayısıyla çıkış 1 olur.
  • Giriş, örneklerde gösterilen yollardan herhangi biri ile alınabilir. Giriş, istediğiniz şekilde dize veya sayı olarak alınabilir.

Test Durumları

3 1 100
19

3 3 93
19

12,-200,200
24          //This is because 12 appears in -129, -128, ..., -112, -12, 12, 112, 120, 121, 122, ...

123,1,3
0           //This is because all of 123's digits have to appear in the same order

3 33 34
2           //Because 3 appears in 2 numbers: 33 and 34

a(0,-1,1);
1

$ java NotVerbose 127 -12 27
0

Snack Parçacığı

Yanıtınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

# Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

# Perl, 43 + 2 (-p flag) = 45 bytes

Dil adını, daha sonra skor tablosu snippet'inde görünecek bir bağlantı da yapabilirsiniz:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Yanıtlar:


8

05AB1E , 6 bayt

Formdaki girdi: üst sınır , alt sınır , sayı .

Ÿvy³åO

Açıklama:

Ÿ       # Inclusive range, [a, ..., b]
 vy     # For each element...
   ³å   # Check if the third input is a substring of the number
     O  # Sum up the results

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin!


4
Groovy {a,b,c->} Aww ... dangit seçer , tekrar başlamadan önce kaybettim.
Sihirli Ahtapot Urn

Bu mücadeleyi kazandığınız için tebrikler!
Kritixi Lithos

@KritixiLithos Teşekkürler! :)
Adnan

6 bayt alternatifi:Ÿʒ³å}g
Kevin Cruijssen

9

Bash, 20 bayt

bariz cevap

seq $2 $3|grep -c $1

misal

$ bash golf 3 1 100
19

6

Perl, 20 bayt

Kullanılarak 2 bayt Kaydedilen grep@ ardnew en gibi cevap .

Bayt sayısı 18 bayt kod ve -apbayrak içerir.

$_=grep/@F/,<>..<>

3 numarayı üç ayrı satıra verin:

perl -ape '$_=grep/@F/,<>..<>' <<< "3
1
100"

5

Python 2, 47 43 Bayt

Python 2'nin reprkısa formunu kullanarak nispeten basittir .

f=lambda n,a,b:a<b and(`n`in`a`)+f(n,-~a,b)

Çıkışı:

f(  3,    1, 100) -> 19
f(  3,    3,  93) -> 19
f( 12, -200, 200) -> 24
f(123,    1,   3) -> 0
f(  3,   33,  34) -> 2
f(  0,   -1,   1) -> 1
f(127,   12,  27) -> 0

Neden -~abunun yerine tamamen süslü ve kullanmak zorundaydınız a+1?
Artyer

1
@Artyer eğlenmek için!
Kade

4

JavaScript (ES6), 46 45 bayt

f=(n,s,e)=>s<=e&&!!`${s++}`.match(n)+f(n,s,e)

(Benim en iyi yinelemesiz sürümü 61 bayt idi.) Düzenleme: @ edc65 sayesinde 1 bayt kaydedildi.


!!matchyerine includes.
edc65

4

Jöle , 7 bayt

rAẇ@€⁵S

TryItOnline!

Giriş: Başlat, Son, Bul

Nasıl?

rAẇ@€⁵S - Main link: Start, End, ToFind
r       - range: [Start, ..., End]
 A      - absolute values
     ⁵  - third input: ToFind
  ẇ@€   - sublist exists in with reversed @rguments for €ach
      S - sum

Bir tamsayının alt liste varlığı denetimi için yinelenebilir bir varsayılan değere dönüştürülmesi, ondalık bir listeye (bir karakter listesi değil) verilir, bu nedenle negatif sayıların önde gelen negatif değeri vardır (örn. -122-> bir alt liste [-1,2,2]bulamaz [1,2]) mutlak değer ilk önce en golfçü çözüm gibi görünüyor.


4

PowerShell v2 +, 64 62 56 bayt

param($c,$a,$b)$(for(;$a-le$b){1|?{$a++-match$c}}).count

Mazzy sayesinde -6 bayt

Upper_bound upper_bound form numarasının komut satırı bağımsız değişkenleriyle girin . Bir komut dosyası bloğu oluşturmak için forçevrelenmemişse, ayrıştırma hatalarına neden olan noktalı virgüller nedeniyle gösterimde küçük bir aptallık $(...). Temel olarak , regex karşı olan sayıları çıkarmak için (the ) tuşunu kullanarak vurana $akadar yukarı doğru dönüyoruz . Bu, parens içinde kapsüllenir, bunları alırız ve boru hattında kalır ve çıktı örtüktür.$bWhere-Object|?{...}-match$c.count


Bununla birlikte, aralığın 50.000'den fazla öğe olmayacağını garanti edersek, döngüyü atlayabilir ve sadece aralık operatörünü 45 43 bayt.. için doğrudan kullanabiliriz . Ancak, bu meydan okuma özelliklerinde olmadığı için, bu geçerli değildir. Aylak.

param($c,$a,$b)($a..$b|?{$_-match$c}).count

Harika! 50K öğeleri bilgisi için teşekkürler. Birkaç öneriparam($c,$a,$b)$(for(;$a-le$b){1|?{$a++-match$c}}).count
mazzy

param($c,$a,$b)($a..$b|?{$_-match$c}).countÜzerinde aralığında -65536..65535 ile çalışırPowershell 5.1
Mazzy

3

Vim, 46 , 41 bayt

C<C-r>=r<tab><C-r>")<cr><esc>jC0<esc>:g/<C-r>"/norm G<C-v><C-a>
kd{

Girdi şu biçimde:

1, 100
3

2

Haskell, 65 bayt

import Data.List
(s#e)i=sum[1|x<-[s..e],isInfixOf(show i)$show x]

importPuanı bozar. Kullanım örneği: ((-200)#200)12-> 24.


Kullanım örneği 24 çıktı olmalıdır çünkü 12 -200 ile 200 arasında 24 kez görünür
Kritixi Lithos

@KritixiLithos: Ah, üzgünüm! Tabii ki, bu sadece bir kopyala ve pase hatası.
nimi

2

Java 7 85 bayt

int x(int a,int b,int c){int t=0;for(;b<=c;)if((b+++"").contains(a+""))t++;return t;}

2

Swift 3, 96 93 bayt

import Cocoa
func c(n:Int,s:Int,e:Int){print((s...e).filter{"\($0)".contains("\(n)")}.count)}

Düzenleme 1:

Steno parametreleri kullanarak 3 bayt kaydedildi


2

Scala, 50 bayt

(c:String)=>(_:Int)to(_:Int)count(""+_ contains c)

ilk girdiyi alır; şöyle söyle:f("12")(-200,200)

explantion:

(c:String)=>  //define an anonymous function taking a string parameter
  (_:Int)     //create a range from an anonymous int parameter
  to          //to
  (_:Int)     //another anonymous int parameter
  count(      //and count how many...
   ""+_       //elements converted to a string
   contains c //contain c
  )

2

R, 32 bayt

Oldukça açık:

function(a,b,c)sum(grepl(a,b:c))

1
PPCG'ye Hoşgeldiniz! Güzel bir cevap ama girdinin zaten belirtildiği varsayılırsa genellikle kabul edilmez. Yanıtınızı nitelemek için, ya: gibi bir girdiden stdin girdisini okumak zorundasınız ya da bu durumda her ikisi de eşdeğer a=scan();sum(grepl(a,a[2]:a[3]))bir işlev: olarak okumak zorunda kalacaksınız function(a,b,c)sum(grepl(a,b:c)).
Billywob

@Billywob teşekkürler, bunu aklınızda tutacak! cevabı buna göre düzenledi.
Nutle

1

C #, 71 bayt

Java cevabımı lambdas sayesinde geç

(t,l,u)=>{int d=0;for(;l<=u;)if((l+++"").Contains(t+""))d++;return d;};

Java'nın
lambdasları

Evet, sadece okumaya başladım, ancak bayt sayısını büyütecek bazı ortak şeyler gerektirmiyorlar, yoksa
sayamam

@Grax s javascript cevap (n,s,e)=>s>e?0:((""+s).Contains(n+"")?1:0)+f(n,++s,e);çok daha kısa çaldı
hstde

1

Yakut 44 bayt

m=->(n,s,f){(s..f).count{|x|x.to_s[/#{n}/]}}

Test Durumları:

m.(3,1,100)     #=> 19
m.(3,3,93)      #=> 19
m.(12,-200,200) #=> 24
m.(123,1,3)     #=>  0
m.(3,33,34)     #=>  2
m.(0,-1,1)      #=>  1
m.(127,-12,27)  #=>  0

1

PHP, 62 bayt

Oldukça basit bir yaklaşım:

<?=count(preg_grep('/'.($a=$argv)[1].'/',range($a[2],$a[3])));

Çevrimiçi deneyin


Normal ifade sınırlayıcı olarak alt çizgi veya herhangi bir harfle 4 bayt kaydedin. (alıntı yapılmasına gerek yoktur)
Titus

3 Byte tasarruf edebilirsiniz<?=count(preg_grep("/$argv[1]/",range($argv[2],$argv[3])));
Jörg Hülsermann

1

C, 143 bayt

8 bayt tasarruf etmeye yardımcı olduğu için @Kritixi Lithos'a teşekkürler

Elbette bu daha iyi yapılabilir, ama şimdilik var olan en iyisi. C, dizeleri çok zarif bir şekilde işlemez, bu nedenle doğal olarak birkaç işlem gerektirir.

int C(int N,int l,int h){char b[99],n[99];int t=0,i=1;sprintf(n,"%d",N);for(;i<=h;i++){sprintf(b,"%d",i);if(strstr(b,n))++t;}return t;}

Ungolfed + programı

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int C(int N,int l,int h)
{
    char b[99], n[99];
    int t=0,i=1;
    sprintf(n,"%d",N);
    for(;i<=h;i++)
    {
        sprintf(b,"%d",i);
        if(strstr(b,n))
            ++t;
    }
    return t;
}

int main()
{
  printf("%d\n", C(3, 1, 100));
}

Ben int i=lfor-döngüsü kaldırmak ve bunun yerine birkaç bayt kaydetmek için int t=0böyle ile başlatabilirsiniz düşünüyorum int t=0,i=l.
Kritixi Lithos

Bu derleme değil mi? C (N, l, h) {karakter b [99], n [99]; int t = 0, i = l; sprintf (n, "% d", N); için (; i <= h; i ++ ) {sprintf (b, "% d", i); eğer (strstr (b, n)) ++ t;} return t;} Ben dahil
etmeden

93 baytb[9],n[9],t;C(N,l,h){for(t=!sprintf(n,"%d",N);l<=h;strstr(b,n)&&++t)sprintf(b,"%d",l++);N=t;}
ceilingcat

1

JavaScript, 46 45 bayt

f=(i,s,e)=>s>e?0:RegExp(i).test(s)+f(i,++s,e)

Başlangıç> bitene kadar tekrar tekrar sayım

Düzenleme: Bir bayt kaydetmek için RegExp testine geçin


1

PHP, 68 63 bayt

for($a=$argv;$a[2]<=$a[3];)$o+=strstr($a[2]++,$a[1])>'';echo$o;

gibi kullanın:

 php -r "for($a=$argv;$a[2]<=$a[3];)$o+=strstr($a[2]++,$a[1])>'';echo$o;" 3 1 100

edit: Titus sayesinde 5 bayt kaydedildi


strstr($a[2]++,$a[1])>""yerine strpos($a[2]++,$a[1])!==false5 bayt kaydeder.
Titus

1

Powershell, 48 bayt

Kurallara göre, aralık 50.000'den fazla öğe içerebilir. Dolayısıyla, aralık operatörünü ..doğrudan kullanamayız . Teşekkürler AdmBorkBork .

Basit:

param($c,$a,$b)for(;$a-le$b){$i+=$a++-match$c}$i

Test komut dosyası:

$f = {

param($c,$a,$b)for(;$a-le$b){$i+=$a++-match$c}$i

}

@(
    ,(19, 3,1,100)
    ,(19, 3,3,93)
    ,(24, 12,-200,200)
    ,(0, 123,1,3)
    ,(2, 3,33,34)
    ,(1, 0,-1,1)
    ,(0, 127,-12,27)
    ,(44175, 0,-65536,65535)
) | % {
    $e,$a = $_
    $r = &$f @a
    "$($e-eq$r): $r"
}

Çıktı:

True: 19
True: 19
True: 24
True: 0
True: 2
True: 1
True: 0
True: 44175

1

Japt , 14 8 bayt

Son giriş değeri olarak bulunacak tamsayıyı alır.

õV èÈsøW

Çevrimiçi deneyin


açıklama

             :Implicit input of integers U=start, V=end & W=number
õV           :Range [U,V]
    È        :Map
     s       :  Convert to string
      øW     :  Contains W?
   è         :Count truthy values

Önceki sürümlerde açıklama olmadığı için bunlardan emin değilim, ancak şu anki 6 baytlık çözümünüz yanlış. Şu kurala bakın: " İlk örnekte olduğu gibi 33, olduğu gibi , sayı 3iki kez değil, yalnızca bir kez görünecek şekilde sayılır. " İçin gerçekleşme Wsayınız 3iki kez sayılır .
Kevin Cruijssen

Teşekkürler, @KevinCruijssen, ~ bir ay sonra geri döndü ve neden daha kısa bir yol varken bunu yaptığımı merak ediyordum - güncellemeden önce meydan okumayı tekrar okumalıydım! Şimdi geri aldım.
Shaggy

Aynı şeyi birkaç kez yaptım. Cevabımı görüyorum, düşünüyorum: bu çok daha kolay olabilir, değiştiriyorum. Ve değişiklikleri kaydetmeden hemen önce, şimdi meydan okumayı yanlış yorumladığımı görüyorum. Btw, hala 8 baytlık çözümün açıklamasını merak ediyorum. :)
Kevin Cruijssen

1
@KevinCruijssen: açıklama eklendi.
Shaggy

0

Java, 92 89 71 bayt

Şimdi lambdas ile!

(t,l,u)->{int z=0;for(;l<=u;)if((l+++"").contains(t+""))z++;return z;};

Eski 89 bayt işlevi çözümü:

int d(int t,int l,int u){int a=0,i=l;for(;i<=u;)if((i+++"").contains(t+""))a++;return a;}

Süper artış fonksiyonu için Yaşasın!


Sen kaldırabilirsiniz int i=liçin-döngüden ve bunun yerine ile beyan agibi int a=0,i=l;birkaç bayt tasarrufu için
Kritixi Lithos

Ah bir şeyi özlediğimi biliyordum, teşekkürler!
Yodle

1
Temel olarak bu cevapla aynı .
Kritixi Lithos

0

GolfSharp (rakip olmayan), 41 bayt

(w,q,e)=>r(q,1+e-q).w(n=>n.T().I(w)).L();

rakip 45 bayt

(w,q,e)=>r(q,1+e-q).w(n=>n.T().I(w.T())).L();

1
Son taahhüt 8 dakika önceydi, bu yüzden bunun rakip bir cevap olması, bunun meydan okuma başlamadan önce çalışmasını gerektiriyor. Bunu doğrulayabilir misin?
Kade

Bence, ben olmayan rekabet için değiştirirseniz, sabit hataları düzenlemek gereklidir düşünüyorum. şimdi değişecek (dili geliştirmek için zorluklar kullanıyorum)
downrep_nation

2
Kod 8 dakika önce I, öğeyi içerip içermediğini kontrol etmeden önce öğeyi bir dizeye dönüştürme işlevini değiştirdi .
Kade


0

Raket 91 bayt

(for/sum((i(range s(+ 1 e))))(if(string-contains?(number->string i)(number->string d))1 0))

Ungolfed:

(define(f d s e)
  (for/sum ((i (range s (+ 1 e))))
    (if(string-contains?
        (number->string i)
        (number->string d))
       1 0 )))

Test yapmak:

(f 3 1 100)
(f 3 3 93)
(f 12 -200 200)
(f 123 1 3)
(f 3 33 34)
(f 0 -1 1)

Çıktı:

19
19
24
0
2
1

0

Aksiyom bayt 90

f(y,a,b)==(c:=0;for x in a..b repeat(if position(y::String,x::String,1)~=0 then c:=c+1);c)

Sonuçlar

(3) -> f(3,1,100)=19,f(3,3,93)=19,f(12,-200,200)=24,f(123,1,3)=0,f(3,33,34)=2
   (3)  [19= 19,19= 19,24= 24,0= 0,2= 2]
                                  Type: Tuple Equation NonNegativeInteger
(4) -> f(0,-1,1)=1, f(127,12,27)=0
   (4)  [1= 1,0= 0]
                                  Type: Tuple Equation NonNegativeInteger

0

Mathematica, 70 bayt

(w=ToString;t=0;Table[If[StringContainsQ[w@i,w@#1],t++],{i,#2,#3}];t)&

giriş

[12, -200.200]

çıktı

24


0

Clojure, 65 bayt

#(count(for[i(range %2(inc %3)):when(some(set(str %))(str i))]i))

0

PHP, 56 Bayt

boru olarak çalıştır Çevrimiçi deneyin

Giriş

$argv = [number_to_find, range_start, range_end];

kod

<?=substr_count(join(range(($a=$argv)[1],$a[2])),$a[0]);

açıklama

#substrcount, counts the aparitions of a subtring in a string
substr_count( 
           join( range(($a=$argv)[1],$a[2])), # String with the range
           $a[0]);                            # The number you are looking for

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.