Продукт у винятковому та всеосяжному асортименті


18

Натхненний цим питанням на @ CᴏɴᴏʀO'Bʀɪᴇɴ .

Взято з питання:

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

Зауважте, що кінець може бути виключним або включаючи b. Я не прискіпливий. ^ _ ^

Різниця в цьому виклику полягає в тому, що ми будемо вибагливі щодо типу асортименту. Введення є рядок виду [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

Це , тому виграє найкоротша програма в байтах.


Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон 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

Відповіді:


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,:*}

Безголівки:

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

Пітон 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)

Бере вхід з stdin.


ми фактично розмістили свої відповіді в тому ж другому Oo
Eumel

@Eumel Це повинен бути знак.
Морган Трапп

я насправді розміщую цю інформацію на Meta зараз ^^
Eumel

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

о, справді? він показав відповіді n секунд тому на обидві відповіді
Евмель

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

Безголівки:

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

Математика, 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 байтів, змінюючи спосіб отримання цифр із вхідних даних. Ву!

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це перетворити на ряд.


використання:

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

Безумовно

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.