Сколько целых чисел содержит число в определенном диапазоне


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появляется в диапазоне от 1до 100.

правила

  • Обе программы и функции разрешены.
  • Все числа будут целыми числами, это означает, что не будет floats или doubles.
  • Примечание: искомый номер всегда будет в диапазоне 0≤x≤127. Там не будет ни одного случая , когда он будет находиться вне этого 0≤x≤127диапазона.
  • Как и в первом примере, для случая as 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

Закуска

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# 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, я потерял, прежде чем я начал снова.
Волшебная Осьминог Урна

Поздравляю за победу в этом испытании!
Kritixi Lithos

@KritixiLithos Спасибо! :)
Аднан


9

Баш, 20 байт

очевидный ответ

seq $2 $3|grep -c $1

пример

$ bash golf 3 1 100
19

6

Perl, 20 байт

Сохраненный 2 байта, используя grepкак в @ ardnew - х ответ .

Bytecount включает 18 байтов кода и -apфлагов.

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

Дайте 3 числа на трех отдельных строках:

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

5

Python 2, 47 43 байта

Относительно просто, используя 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
@ Артье для удовольствия!
Каде

4

JavaScript (ES6), 46 45 байт

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

(Моя лучшая нерекурсивная версия была 61 байт.) Редактирование: 1 байт сохранен благодаря @ edc65.


!!matchвместо includes.
edc65

4

Желе , 7 байт

rAẇ@€⁵S

TryItOnline!

Ввод: начало, конец, поиск

Как?

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

Приведение по умолчанию целого числа к итерируемой для проверки существования подсписка приводит к десятичному списку (не списку символов), поэтому отрицательные числа имеют ведущее отрицательное значение (например, -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( |?{...}) , чтобы вытащить эти числа, регулярное выражение -matchпротив $c. Это инкапсулировано в паранах, мы берем .countих, и это остается на конвейере, и вывод неявен.


Однако, если мы гарантируем, что диапазон будет не более 50 000 элементов, мы можем пропустить цикл и просто использовать оператор диапазона ..напрямую, для 45 43 байтов . Так как это не указано в технических требованиях, это недопустимо. Облом.

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

Большой! Спасибо за информацию об элементах 50K. Несколько предложенийparam($c,$a,$b)$(for(;$a-le$b){1|?{$a++-match$c}}).count
Mazy

В 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)12-> 24.


Пример использования должен вывести 24, потому что 12 появляется 24 раза между -200 и 200
Kritixi Lithos

@KritixiLithos: Ой, прости! Конечно, это просто ошибка копирования и переноса.
Ними

2

Java 7 85 байт

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 байта

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)

принимает первый ввод карри; Назовите это так: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! Хороший ответ, но при условии, что входные данные уже указаны, обычно не принимаются. Чтобы ваш ответ был квалифицированным, вам нужно будет либо прочитать входные данные из стандартного ввода, такие как:, 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 благодаря лямбдам

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

У Явы также есть лямбды
Kritixi Lithos

Да, я только начал читать об этом, но разве они не нуждаются в каких-то шаблонных материалах, которые бы увеличили счет, или я не могу их сосчитать
Yodle

Бесстыдно украл ответ @Grax's на javascript (n,s,e)=>s>e?0:((""+s).Contains(n+"")?1:0)+f(n,++s,e);- это намного короче
hstde

1

Рубин 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 байта с подчеркиванием или любой буквой в качестве разделителя регулярных выражений. (не нуждается в кавычках)
Тит

Вы можете сэкономить 3 байта<?=count(preg_grep("/$argv[1]/",range($argv[2],$argv[3])));
Йорг Хюльсерманн

1

С, 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 и вместо этого инициализировать его 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 (b, "% d", i); if (strstr (b, n)) ++ t;} return t;} Я думаю, что скомпилировать даже без include ...
RosLuP

93 байтаb[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;}
floorcat

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 байтов сохранено благодаря Титу


strstr($a[2]++,$a[1])>""вместо strpos($a[2]++,$a[1])!==falseсохранения 5 байтов.
Тит

1

Powershell, 48 байт

Согласно правилу, диапазон может содержать более 50000 элементов. Поэтому мы не можем ..напрямую использовать оператор диапазона . Спасибо 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

Джапт , 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-байтовое решение неверно. См. Это правило: « Как и в первом примере, в случае« as » 33число 3будет считаться появившимся только один раз, а не дважды». Ваш счетчик совпадений Wбудет считаться 3дважды.
Кевин Круйссен,

Спасибо, @KevinCruijssen, вернулся к нему ~ месяц спустя, и мне было интересно, почему я делаю это так, как я делал, когда был более короткий путь - должен был перечитать задачу перед обновлением! Я откатил это сейчас.
лохматый

У меня тоже самое случалось несколько раз. Я вижу свой ответ, думаю: это может быть намного легче, я изменяю это. И прямо перед тем, как нажать «Сохранить изменения», я вижу, что теперь я неверно истолковал проблему. Кстати, мне все еще любопытно объяснить 8-байтовое решение. :)
Кевин Круйссен

1
@KevinCruijssen: объяснение добавлено.
лохматый

0

Ява, 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 и вместо этого объявить его с помощью alike, int a=0,i=l;чтобы сохранить несколько байтов
Kritixi Lithos

Ах, я знал, что что-то пропустил, спасибо!
Йодле

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 минут назад, поэтому для того, чтобы это был конкурирующий ответ, нужно, чтобы это сработало до того, как начался вызов. Вы можете это проверить?
Каде

Я так думаю, если нет, я изменю его на неконкурентный, необходимо редактировать исправленные ошибки. сейчас изменится (я использую вызовы для улучшения языка)
downrep_nation

2
Фиксация кода 8 минут назад изменила Iфункцию, чтобы сначала преобразовать элемент в строку перед проверкой, содержит ли он его.
Каде


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.