จำนวนเต็มที่มีตัวเลขในช่วงที่เฉพาะเจาะจง


19

โปรแกรมที่ควรจะใส่หมายเลขที่เริ่มต้นของช่วงและจุดสิ้นสุดของช่วงและเอาท์พุทว่าหลายจำนวนเต็มจำนวนปรากฏขึ้นระหว่างการเริ่มต้นและจุดสิ้นสุดของช่วงรวม อนุญาตทั้งโปรแกรมและฟังก์ชั่น

อินพุตตัวอย่าง

ตัวอย่างเช่น:

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

ตัวอย่างอินพุตทั้งสี่ข้างต้นถูกต้องและทั้งหมดหมายความว่า3เป็นตัวเลขในคำถาม1คือจุดเริ่มต้นของช่วงและ100จุดสิ้นสุดของช่วง

และจากนั้นโปรแกรมจะส่งออกกี่ครั้งที่3ปรากฏในช่วงจาก1การรวม100 3ปรากฏในจำนวนเต็ม3, 13, 23, 30, 31, 32, 33, ... , 93รวมจำนวนทั้งสิ้น 19 ครั้ง ดังนั้นโปรแกรมควรเอาท์พุท19เอาท์พุทเพราะนั่นเป็นวิธีที่หลายต่อหลายครั้ง3ที่ปรากฏในช่วงจากไป1100

กฎระเบียบ

  • อนุญาตทั้งโปรแกรมและฟังก์ชั่น
  • ตัวเลขทั้งหมดจะเป็นจำนวนเต็มซึ่งหมายความว่าจะมีไม่ใด ๆfloatหรือdoubles
  • หมายเหตุ: จำนวนที่ต้องการจะอยู่ในช่วง0≤x≤127เสมอ จะไม่มีกรณีที่จะอยู่นอก0≤x≤127ช่วงนี้
  • ในขณะที่ตัวอย่างแรกกับกรณีที่เป็น33จำนวน3จะถูกนับเป็นปรากฏเพียงครั้งเดียว , ไม่ได้เป็นครั้งที่สอง
  • ค่าของจุดเริ่มต้นและจุดสิ้นสุดของช่วงจะอยู่ระหว่าง-65536และ65535รวม
  • มูลค่าของการเริ่มต้นของช่วงจะไม่เกินหรือเท่ากับจุดสิ้นสุดของช่วง start < end
  • นอกจากนี้ยังรวมถึงช่วง ตัวอย่างเช่นถ้าอินพุตเป็น8 8 10ช่วงจะเป็น8≤x≤10และดังนั้นผลลัพธ์จะเป็น 1
  • อินพุตสามารถใช้วิธีใด ๆ ที่แสดงในตัวอย่าง อินพุตสามารถใช้เป็นสตริงหรือเป็นตัวเลขได้ทุกวิธีที่คุณต้องการ

กรณีทดสอบ

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

Snacket Snacket

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัว ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

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

คำตอบ:


8

05AB1E , 6 ไบต์

การป้อนข้อมูลในรูปแบบ: ขอบเขตบน , ลดผูกพัน , จำนวน

Ÿvy³åO

คำอธิบาย:

Ÿ       # 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 ลองออนไลน์!


4
เลือก Groovy {a,b,c->} Aww ... dangit ฉันแพ้ก่อนที่ฉันจะเริ่มอีกครั้ง
Magic Octopus Urn

ยินดีด้วยสำหรับการชนะการท้าทายนี้!
Kritixi Lithos

@KritixiLithos ขอบคุณ! :)
Adnan

ทางเลือก 6 ไบต์:Ÿʒ³å}g
Kevin Cruijssen

9

Bash ขนาด 20 ไบต์

คำตอบที่ชัดเจน

seq $2 $3|grep -c $1

ตัวอย่าง

$ bash golf 3 1 100
19

6

Perl, 20 ไบต์

ที่บันทึกไว้ 2 ไบต์โดยใช้grepในขณะที่ @ ardnew ของคำตอบ

Bytecount มีโค้ดและ-apแฟล็ก18 ไบต์

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

ให้ตัวเลข 3 ตัวในสามบรรทัดแยกกัน:

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

5

Python 2, 47 43 Bytes

ค่อนข้างตรงไปตรงมาใช้reprรูปแบบย่อของ Python 2

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

ouput:

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

ทำไมคุณถึงต้องเป็นคนแฟนซีและใช้-~aแทนa+1?
Artyer

1
@Artyer เพื่อความสนุกสนาน!
Kade

4

JavaScript (ES6), 46 45 ไบต์

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

(รุ่นที่ไม่ใช่แบบเรียกซ้ำที่ดีที่สุดของฉันคือ 61 ไบต์) แก้ไข: บันทึก 1 ไบต์ขอบคุณ @ edc65


!!matchincludesแทน
edc65

4

เยลลี่ขนาด 7 ไบต์

rAẇ@€⁵S

TryItOnline!

อินพุต: เริ่ม, สิ้นสุด, ToFind

อย่างไร?

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

การคัดเลือกค่าเริ่มต้นของจำนวนเต็มเป็น iterable สำหรับการตรวจสอบการมีอยู่ของรายการย่อยจะใช้รายการทศนิยม (ไม่ใช่รายการตัวอักษร) ดังนั้นจำนวนลบจะมีค่าลบนำหน้า (เช่น-122-> [-1,2,2]ซึ่งไม่พบรายการย่อย[1,2]) ค่าสัมบูรณ์ก่อนดูเหมือนว่าจะเป็นทางออกที่ดีที่สุด


4

PowerShell v2 +, 64 62 56 ไบต์

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

-6 ไบต์ต้องขอบคุณเขาวงกต

การป้อนข้อมูลผ่านอาร์กิวเมนต์บรรทัดคำสั่งของแบบฟอร์มจำนวน LOWER_BOUND upper_bound โง่เล็กน้อยในสัญกรณ์เพราะอัฒภาคในการforแยกวิเคราะห์ทำให้เกิดข้อผิดพลาดหากไม่ได้ล้อมรอบใน$(...)การสร้างบล็อกสคริปต์ โดยทั่วไปเราห่วงขึ้นผ่าน$aจนกว่าเราจะตี$bโดยใช้Where-Object(คน|?{...}) ที่จะดึงออกหมายเลขที่ regex กับ-match $cนั่นถูกห่อหุ้มด้วย parens เราเอา.countมันมาและที่เหลืออยู่บนไปป์ไลน์และเอาท์พุทเป็นนัย


อย่างไรก็ตามหากเรารับประกันว่าช่วงจะไม่เกิน 50,000 องค์ประกอบเราสามารถข้ามลูปและเพียงใช้โอเปอเรเตอร์ช่วง..โดยตรงเป็น45 45ไบท์ เนื่องจากนั่นไม่ได้อยู่ในข้อกำหนดของการท้าทายแม้ว่าจะไม่ถูกต้อง คนเกียจคร้าน

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

ที่ดี! ขอบคุณสำหรับข้อมูลองค์ประกอบ 50K คำแนะนำสองข้อparam($c,$a,$b)$(for(;$a-le$b){1|?{$a++-match$c}}).count
mazzy

param($c,$a,$b)($a..$b|?{$_-match$c}).countทำงานร่วมกับช่วง -65536..65535 บนPowershell 5.1
Mazzy

3

เป็นกลุ่ม, 46 , 41 ไบต์

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

อินพุตอยู่ในรูปแบบนี้:

1, 100
3

2

Haskell, 65 ไบต์

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

การimportทำลายคะแนน ตัวอย่างการใช้งาน: ->((-200)#200)1224


ตัวอย่างการใช้งานควรส่งออก 24 เพราะ 12 ปรากฏขึ้น 24 ครั้งระหว่าง -200 ถึง 200
Kritixi Lithos

@KritixiLithos: โอ้ขอโทษ! แน่นอนว่ามันเป็นเพียงข้อผิดพลาดในการคัดลอกและวาง
nimi


2

Swift 3, 96 93 bytes

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

แก้ไข 1:

บันทึก 3 ไบต์โดยใช้พารามิเตอร์ชวเลข


2

สกาลา, 50 ไบต์

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

ใช้อินพุตแรก curried; เรียกว่าเป็นแบบนี้: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 ไบต์

ค่อนข้างตรงไปตรงมา:

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

1
ยินดีต้อนรับสู่ PPCG! คำตอบที่ดี แต่สมมติว่าอินพุตที่ระบุไว้โดยทั่วไปแล้วไม่เป็นที่ยอมรับ เพื่อให้คำตอบของคุณมีคุณสมบัติคุณจะต้องอ่านอินพุตจาก stdin เช่น: a=scan();sum(grepl(a,a[2]:a[3]))หรือเป็นอาร์กิวเมนต์ของฟังก์ชัน: function(a,b,c)sum(grepl(a,b:c))ซึ่งเทียบเท่ากันในกรณีนี้
Billywob

@Billywob ขอบคุณจะเก็บไว้ในใจ! แก้ไขคำตอบตามนั้น
Nutle

1

C #, 71 ไบต์

เอาชนะคำตอบ Java ของฉันขอบคุณ lambdas

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

Java ยังมี lambdas
Kritixi Lithos

ใช่ฉันเพิ่งเริ่มอ่านเกี่ยวกับเรื่องนี้ แต่พวกเขาไม่จำเป็นต้องมีบางอย่างสำเร็จรูปที่จะทำให้จำนวน bytecount ใหญ่ขึ้นหรือฉันไม่สามารถนับ
Yodle

การขโมย javascript ของ @Grax ลงคออย่างไม่มีจุดหมาย(n,s,e)=>s>e?0:((""+s).Contains(n+"")?1:0)+f(n,++s,e);นั้นสั้นลง
เรื่อย ๆ

1

Ruby 44 ไบต์

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

กรณีทดสอบ:

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 ไบต์

วิธีการตรงไปตรงมาสวย:

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

ลองออนไลน์


บันทึก 4 ไบต์ด้วยขีดล่างหรือตัวอักษรใด ๆ เป็นตัวคั่น regex (ต้องการคำพูดไม่ได้)
ติตัส

คุณสามารถบันทึก 3 Byte<?=count(preg_grep("/$argv[1]/",range($argv[2],$argv[3])));
JörgHülsermann

1

C, 143 135 ไบต์

ขอบคุณ @Kritixi Lithos ที่ช่วยประหยัด 8 ไบต์

แน่นอนว่าสิ่งนี้ทำได้ดีกว่านี้ แต่สิ่งที่ดีที่สุดที่ฉันเคยมีในตอนนี้ C ไม่ได้จัดการกับสตริงอย่างสง่างามมากดังนั้นโดยปกติจะใช้เวลาดำเนินการค่อนข้างน้อย

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 +

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

ฉันคิดว่าคุณสามารถลบออกint i=lจาก for-loop และแทนค่าเริ่มต้นด้วยint t=0เช่นเช่นint t=0,i=lเพื่อบันทึกไม่กี่ไบต์
Kritixi Lithos

มันไม่ได้รวบรวม? C (N, l, h) {char b [99], n [99]; int t = 0, i = l; sprintf (n, "% d", N); สำหรับ (; i <= h; i ++ ) {sprintf (ข "% d", i); if (strstr (ข, n)) ++ เสื้อ;} กลับมาที;} ผมคิดว่าแม้จะมีการรวบรวมไม่มี ได้แก่ ...
RosLuP

93 bytesb[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 ไบต์

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

นับซ้ำจนกระทั่งเริ่ม> สิ้นสุด

แก้ไข: สลับเป็นทดสอบ RegExp เพื่อบันทึกไบต์


1

PHP, 68 63 ไบต์

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

ใช้เช่น:

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

แก้ไข: บันทึก 5 ไบต์ด้วย Titus


strstr($a[2]++,$a[1])>""แทนการstrpos($a[2]++,$a[1])!==falseบันทึก 5 ไบต์
ติตัส

1

Powershell ขนาด 48 ไบต์

ตามกฎแล้วช่วงสามารถมีองค์ประกอบได้มากกว่า 50,000 องค์ประกอบ ดังนั้นเราจึงไม่สามารถใช้โอเปอเรเตอร์ช่วง..โดยตรงได้ ขอบคุณAdmBorkBork

ตรงไปตรงมา:

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

สคริปต์ทดสอบ:

$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"
}

เอาท์พุท:

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

1

Japt , 14 8 ไบต์

นำจำนวนเต็มที่พบเป็นค่าอินพุตสุดท้าย

õV èÈsøW

ลองออนไลน์


คำอธิบาย

             :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

เนื่องจากเวอร์ชันก่อนหน้าไม่มีคำอธิบายฉันไม่แน่ใจเกี่ยวกับสิ่งเหล่านั้น แต่โซลูชัน 6 ไบต์ปัจจุบันของคุณไม่ถูกต้องฉันกลัว ดูกฎนี้: " เช่นในตัวอย่างแรกโดยมีกรณีเป็น33ตัวเลข3จะถูกนับเป็นการปรากฏเพียงครั้งเดียวไม่ใช่สองครั้ง " การนับการเกิดขึ้นของคุณWจะนับเป็น3สองเท่า
Kevin Cruijssen

ขอบคุณ @KevinCruijssen กลับมาอีกครั้ง ~ เดือนต่อมาและสงสัยว่าทำไมฉันถึงทำแบบที่ฉันเคยเป็นเมื่อมีวิธีที่สั้นกว่า - ควรลองอ่านความท้าทายใหม่ก่อนอัปเดต! ตอนนี้ฉันกลับมาแล้ว
ปุย

ฉันมีสิ่งเดียวกันเกิดขึ้นไม่กี่ครั้ง ฉันเห็นคำตอบของฉันคิดว่า: สิ่งนี้ทำได้ง่ายกว่ามากกำลังเปลี่ยนแปลง และก่อนที่ฉันจะบันทึกการเปลี่ยนแปลงที่ฉันเห็นตอนนี้ฉันตีความความท้าทายผิด Btw ฉันยังอยากรู้เกี่ยวกับคำอธิบายสำหรับโซลูชัน 8 ไบต์ :)
Kevin Cruijssen

1
@KevinCruijssen: เพิ่มคำอธิบายแล้ว
ปุย

0

Java, 92 89 71 ไบต์

ตอนนี้มีลูกแกะ!

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

ฟังก์ชัน 89 ไบต์แบบเก่า:

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

ไชโยสำหรับฟังก์ชั่นการเพิ่มระดับสุดยอด!


คุณสามารถลบออกint i=lจาก for-loop และแทนประกาศด้วยaต้องการint a=0,i=l;บันทึกไม่กี่ไบต์
Kritixi Lithos

อ่าฉันรู้ว่าฉันพลาดอะไรบางอย่างขอบคุณ!
Yodle

1
โดยพื้นฐานแล้วเหมือนกับคำตอบนี้
Kritixi Lithos

0

GolfSharp (ไม่ใช่การแข่งขัน), 41 ไบต์

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

การแข่งขัน 45 ไบต์

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

1
ความมุ่งมั่นล่าสุดคือ 8 นาทีที่ผ่านมาดังนั้นการที่จะเป็นคำตอบแบบแข่งขันต้องได้ผลก่อนที่ความท้าทายจะเริ่มขึ้น คุณตรวจสอบสิ่งนี้ได้ไหม
Kade

ฉันคิดว่าถ้าไม่ฉันจะเปลี่ยนเป็นไม่ใช่การแข่งขันแก้ไขข้อบกพร่องได้รับการแก้ไขเป็นสิ่งที่จำเป็น จะเปลี่ยนตอนนี้ (ฉันใช้ความท้าทายในการพัฒนาภาษา)
downrep_nation

2
รหัสกระทำ 8 นาทีที่ผ่านมาเปลี่ยนIฟังก์ชั่นการแปลงองค์ประกอบเป็นสตริงก่อนที่จะตรวจสอบว่ามันมี
Kade


0

แร็กเก็ต 91 ไบต์

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

การทดสอบ:

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

เอาท์พุท:

19
19
24
0
2
1

0

ความจริงไบต์ 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)

ผล

(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 ไบต์

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

อินพุต

[12 -200200]

เอาท์พุต

24



0

PHP, 56 ไบต์

ทำงานเป็นไปป์ ลองออนไลน์

อินพุต

$argv = [number_to_find, range_start, range_end];

รหัส

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

คำอธิบาย

#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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.