Продукт по эксклюзивным и инклюзивным диапазонам


18

Вдохновленный этим вопросом на @ CᴏɴᴏʀO'Bʀɪᴇɴ .

Взято из вопроса:

Ваша задача проста: с учетом двух целых чисел a и b выведите ∏ [a, b]; то есть произведение диапазона между a и b. Вы можете использовать a и b в любом приемлемом формате, будь то аргументы функции, ввод списка, STDIN и так далее. Вы можете выводить данные в любом приемлемом формате, например, возвращаемое значение (для функций) или STDOUT. а всегда будет меньше, чем б.

Обратите внимание, что конец может быть исключительным или включающим б. Я не требователен ^ _ ^

Разница в этой задаче в том, что мы будем требовательны к типу диапазона. Ввод является строка вида [a,b], (a,b], [a,b)или , (a,b)где []это инклюзивный граница и ()является исключительной границей. Учитывая явные границы, предоставьте произведение ассортимента. Кроме того, входной диапазон всегда будет содержать по крайней мере 1 число, означающее, что такие диапазоны (3,4)недопустимы и не требуют проверки.

Контрольные примеры

[a,b) => result
[2,5) => 24
[5,10) => 15120
[-4,3) => 0
[0,3) => 0
[-4,0) => 24

[a,b] => result
[2,5] => 120
[5,10] => 151200
[-4,3] => 0
[0,3] => 0
[-4,-1] => 24

(a,b] => result
(2,5] => 60
(5,10] => 30240
(-4,3] => 0
(0,3] => 6
(-4,-1] => -6

(a,b) => result
(2,5) => 12
(5,10) => 3024
(-4,3) => 0
(0,3) => 2
(-4,0) => -6

Это , поэтому выигрывает самая короткая программа в байтах.


Leaderboard

Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

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

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

Ответы:


7

LabVIEW, 38 примитивов LabVIEW

«слегка» изменен, теперь устанавливает диапазоны, сканируя для () и [] и добавляя индекс к числам.

первый


5
Имея язык, требующий необычного gif, вы сразу получаете ∞ повторения. GG. +1
Эддисон Крамп

3

Python 2, 72 байта

lambda s:reduce(int.__mul__,range(*eval(s[1:-1]+'+'+`']'in s`))[s<'[':])

Чтобы извлечь числа, которые мы оцениваем s[1:-1], входная строка с удаленными концами, которая дает кортеж. Идея состоит в том, чтобы получить rangeэтот кортеж и взять продукт.

lambda s:reduce(int.__mul__,range(*eval(s[1:-1]))

Выдумывание происходит для настройки конечных точек. Верхняя конечная точка проста, просто обрежьте первый элемент, если ввод начинается с (, как [s<'[':].

Другая конечная точка сложнее. У Python нет чистого способа условно удалить последний элемент списка, потому что l[:0]удаляет все это. Итак, мы делаем что-то странное. Мы модифицируем строку кортежа до ее оценки, чтобы привязать строку "+True"или в "+False"зависимости от того, заканчивается ли s ]или ). Результатом является то, что нечто подобное 3,7становится либо тем, 3,7+Falseчто есть 3,7, либо тем, 3,7+Trueчто есть 3,8.

Альтернатива, красивее 72:

lambda s:eval("reduce(int.__mul__,range((s<'[')+%s+(']'in s)))"%s[1:-1])

3

Minecraft 15w35a +, размер программы 638 всего (см. Ниже)

То же, что мой ответ здесь , но измененный. Так как Minecraft не имеет строкового ввода, я взял на себя смелость сохранить табло. Если это проблема, считайте этот ответ неконкурентным.

введите описание изображения здесь

Это вычисляется PI a,bс включением / исключением, указанным двумя рычагами. введите описание изображения здесьВвод осуществляется с помощью этих двух команд: /scoreboard players set A A {num}и /scoreboard players set B A {num}. Не забудьте использовать /scoreboard objectives add A dummyперед вводом.

Забил с помощью: {program size} + ( 2 * {input command} ) + {scoreboard command} = 538 + ( 2 * 33 ) + 34 = 638.

Этот код соответствует следующему psuedocode:

R = 1
T = A
loop:
  R *= A
  A += 1
  if A == B:
    if A.exclusive:
      R /= T
    if B.exclusive:
      R /= B
    print R
    end program

Скачать мир здесь .


2

Pyth, 20 байт

*FPW}\)ztW}\(z}FvtPz

Попробуйте онлайн: демонстрация или тестовый набор

Объяснение:

*FPW}\)ztW}\(z}FvtPz   implicit: z = input string
                 tPz   remove the first and last character of z
                v      evaluate, returns a tuple of numbers
              }F       inclusive range
        tW             remove the first number, if
          }\(z            "(" in z
  PW                   remove the last number, if
    }\)z                  ")" in z
*F                     compute the product of the remaining numbers

2

Рубин, 79 77 байт

->s{a,b=s.scan /\-?\d+/;(a.to_i+(s[?[]?0:1)..b.to_i-(s[?]]?0:1)).reduce 1,:*}

79 байт

->s{a,b=s.scan(/\-?\d+/).map &:to_i;((s[?[]?a:a+1)..(s[?]]?b:b-1)).reduce 1,:*}

Ungolfed:

-> s {
  a,b=s.scan /\-?\d+/    # Extracts integers from the input string, s
  (
    a.to_i+(s[?[]?0:1).. # Increase start of the range by 1 if s contains `(`
    b.to_i-(s[?]]?0:1)   # Decrease end of the range by 1 if s contains `)`
  ).reduce 1,:*
}

Использование:

->s{a,b=s.scan /\-?\d+/;(a.to_i+(s[?[]?0:1)..b.to_i-(s[?]]?0:1)).reduce 1,:*}["(2,5]"]
=> 60

2

Серьезно, 31 байт

,#d@p@',@s`εj≈`Mi(@)']=+)'(=+xπ

Принимает ввод в виде строки (в двойных кавычках)

Попробуйте онлайн (ввод должен быть введен вручную)

Объяснение:

,#d@p@                             get input, take first and last character off and push them individually
      ',@s`εj≈`Mi                  split on commas, map: join on empty, cast to int; explode list
                 (@)']=+)'(=+      increment start and end if braces are ( and ] respectively (since range does [a,b))
                             xπ    make range, push product

1

Python 3, 104

y,r=input().split(',')
t=int(y[1:])+(y[0]<')')
for x in range(t+1,int(r[:-1])+(r[-1]>'[')):t*=x
print(t)

Принимает ввод от стандартного ввода.


мы на самом деле разместили наши ответы в тот же второй OO
Eumel

@ Eumel Это должен быть значок.
Морган Трепп

Я действительно отправлю это на Meta прямо сейчас ^^
Eumel

@Eumel: На самом деле вы опубликовали свою 1 секунду до Моргана Треппа
ev3commander

Да неужели? он показал ответы n секунд назад на оба ответа
Eumel

1

MATLAB, 86 70 байт

s=sscanf(input(''),'%c%d,%d%c');a=s<42;disp(prod(a(1)+s(2):s(3)-a(4)))

Это также работает с Octave . Вы можете попробовать онлайн здесь . Я добавил код в качестве сценария в это рабочее пространство, поэтому вы можете просто ввести его productRangeв командной строке, а затем ввести свои данные, например '(2,5]'.


Поэтому код сначала сканирует входные данные, чтобы извлечь скобки и числа вместе:

s=sscanf(input(''),'%c%d,%d%c');

Это возвращает массив, который сделан из [bracket, number, number, bracket].

Массив сравнивается с 42фактически любым числом от 42 до 90 включительно. Это определяет, какого рода скобки это было, давая 1, если это исключительная скобка, и 0, если включающая скобка.

a=s<42;

Наконец, мы показываем продукт необходимого ассортимента:

disp(prod(a(1)+s(2):s(3)-a(4)))

Произведение состоит из цифр, начинающихся с первого числа s(2)плюс первый тип скобки a(1)(который является 1, если исключительная скобка), начиная с второго числа и включая s(3)второй тип скобки, включая второе a(4). Это дает правильный инклюзивный / эксклюзивный диапазон.


1

Юлия, 75 байт

s->prod((x=map(parse,split(s[2:end-1],",")))[1]+(s[1]<41):x[2]-(s[end]<42))

Это анонимная функция, которая принимает строку и возвращает целое число. Чтобы назвать его, дайте ему имя, например f=s->....

Ungolfed:

function f(s::AbstractString)
    # Extract the numbers in the input
    x = map(parse, split(s[2:end-1], ","))

    # Construct a range, incrementing or decrementing the endpoints
    # based on the ASCII value of the surrounding bracket
    r = x[1]+(s[1] == 40):x[2]-(s[end] == 41)

    # Return the product over the range
    return prod(r)
end

1

Mathematica, 128 байт

1##&@@Range[(t=ToExpression)[""<>Rest@#]+Boole[#[[1]]=="("],t[""<>Most@#2]-Boole[Last@#2==")"]]&@@Characters/@#~StringSplit~","&

Это слишком долго ... В настоящее время думаю о StringReplace+ RegularExpressionрешение.


0

PowerShell, 146 104 байта

param($i)$a,$b=$i.trim("[]()")-split',';($a,(1+$a))[$i[0]-eq'(']..($b,(+$b-1))[$i[-1]-eq')']-join'*'|iex

Вычеркнул 42 байта, изменив, как числа извлекаются из ввода. Woo!

param($i)                          # Takes input string as $i
$a,$b=$i.trim("[]()")-split','     # Trims the []() off $i, splits on comma,
                                   # stores the left in $a and the right in $b

($a,(1+$a))[$i[0]-eq'(']..($b,(+$b-1))[$i[-1]-eq')']-join'*'|iex
# Index into a dynamic array of either $a or $a+1 depending upon if the first
# character of our input string is a ( or not
# .. ranges that together with
# The same thing applied to $b, depending if the last character is ) or not
# Then that's joined with asterisks before
# Being executed (i.e., eval'd)


0

Perl 6 , 60 байт

{s/\((\-?\d+)/[$0^/;s/(\-?\d+)\)/^$0]/;s/\,/../;[*] EVAL $_}

Есть небольшое несоответствие, потому что вы бы написали (2,5]пример на Perl 6 2^..5( [2^..5]также работает).
Так что я должен поменяться (2с [2^, и ,с .., то я должен перейти EVALна Range.


использование:

# give it a name
my &code = {...}

# the `$ =` is so that it gets a scalar instead of a constant

say code $ = '(2,5)'; # 12
say code $ = '[2,5)'; # 24
say code $ = '(2,5]'; # 60
say code $ = '[2,5]'; # 120

say code $ = '(-4,0)' # -6
say code $ = '[-4,0)' # 24
say code $ = '(-4,0]' # 0
say code $ = '[-4,0]' # 0

say code $ = '(-4,-1)' # 6
say code $ = '[-4,-1)' # -24
say code $ = '(-4,-1]' # -6
say code $ = '[-4,-1]' # 24

# this is perfectly cromulent,
# as it returns the identity of `*`
say code $ = '(3,4)'; # 1

0

CJam, 34 байта

r)\(@+"[()]"2/\.#\',/:i.+~1$-,f+:*

Попробуйте онлайн

Объяснение:

r       Read input.
)       Split off last character.
\       Swap rest of input to top.
(       Split off first character.
@       Rotate last character to top.
+       Concatenate first and last character, which are the two braces.
"[()]"  Push string with all possible braces.
2/      Split it into start and end braces.
\       Swap braces from input to top.
.#      Apply find operator to vector elements, getting the position of each brace
        from input in corresponding list of possible braces. The lists of braces
        are ordered so that the position of each can be used as an offset for the
        start/end value of the interval.
\       Swap remaining input, which is a string with two numbers separated by
        a comma, to top.
',/     Split it at comma.
:i      Convert the two values from string to integer.
.+      Element-wise addition to add the offsets based on the brace types.
~       Unwrap the final start/end values for the interval.
1$      Copy start value to top.
-       Subtract it from end value.
,       Build 0-based list of values with correct length.
f+      Add the start value to all values.
:*      Reduce with multiplication.

0

JavaScript (ES6), 90 байт

s=>eval(`for(n=s.match(/-*\\d+/g),i=n[0],c=s[0]<"["||i;++i<+n[1]+(s.slice(-1)>")");)c*=i`)

объяснение

s=>
  eval(`                    // use eval to allow for loop without return or {}
    for(
      n=s.match(/-*\\d+/g), // n = array of input numbers [ a, b ]
      i=n[0],               // i = current number to multiply the result by
      c=s[0]<"["||i;        // c = result, initialise to a if inclusive else 1
      ++i<+n[1]             // iterate from a to b
        +(s.slice(-1)>")"); // if the end is inclusive, increment 1 more time
    )
      c*=i                  // multiply result
  `)                        // implicit: return c

Тестовое задание


0

R, 102 104 байта

f=function(s){x=scan(t=gsub('\\(|\\[|,|\\)|\\]',' ',s))+c(grepl('^\\(',s),-(grepl('\\)$',s)));prod(x[1]:x[2])}

Ungolfed

f=function(s){
    # remove delimiting punctuation from input string, parse and return an atomic vector
    x=scan(t=gsub('\\(|\\[|,|\\)|\\]',' ',s)) +
    # add /subtract from the range dependent on the `[)` pre/suf-fixes
    c(grepl('^\\(',s),-(grepl('\\)$',s)))
    # get the product of the appropriate range of numbers
    prod(x[1]:x[2])
}

изменить, чтобы разрешить отрицательные числа [за счет еще 2 символов


Язык?
ThisSuitIsBlackNot

@ThisSuitIsBlackNot - R(и исправлено в ответе)
mnel

0

JavaScript (ES6), 79

Как анонимный метод

r=>eval("[a,b,e]=r.match(/-?\\d+|.$/g);c=a-=-(r<'@');for(b-=e<'@';a++<b;)c*=a")

Тестовый фрагмент

F=r=>eval("[a,b,e]=r.match(/-?\\d+|.$/g);c=a-=-(r<'@');for(b-=e<'@';a++<b;)c*=a")

// TEST
console.log=x=>O.innerHTML+=x+'\n'

;[
 ['[2,5)',24],['[5,10)',15120],['[-4,3)',0],['[0,3)',0],['[-4,0)',24],
 ['[2,5]',120],['[5,10]',151200],['[-4,3]',0],['[0,3]',0],['[-4,-1]',24],
 ['(2,5]',60],['(5,10]',30240],['(-4,3]',0],['(0,3]',6],['(-4,-1]',-6],
 ['(2,5)',12],['(5,10)',3024],['(-4,3)',0],['(0,3)',2],['(-4,0)',-6]
].forEach(t=>{
  r=F(t[0]),k=t[1],console.log(t[0]+' -> '+r+' (check '+k+ (k==r?' ok)':' fail)'))
})
<pre id=O></pre>

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