Вернуть каждое число из группы чисел


11

Соревнование

Программа должна вернуть все числа, включенные в группу (последовательность, разделенная запятой и дефисом) чисел.

правила

  • s строка последовательности;
  • все числа, включенные в, sявляются положительными ;
  • числа всегда будут увеличиваться ;
  • числа никогда не повторятся
  • когда вы отвечаете, покажите вывод для s="1,3-5,9,16,18-23"

Примеры

input(s)    outputs
-----------------
1           1
1,2         1,2
1-4         1,2,3,4
1-4,6       1,2,3,4,6
1-4,8-11    1,2,3,4,8,9,10,11

Удачи. знак равно


1
Будем ли мы когда-нибудь иметь входные последовательности, которые не будут постоянно увеличиваться, например: 4-9,1-2или 1-3,9-6?
Мэтт

1
Или перекрытие? Должен ли вывод сортироваться и не содержать дубликатов?
Питер Тейлор

@ Гарет Да, это код-гольф, тогда, пожалуйста, проголосуйте за самый короткий ответ. Мэтт и Питер, я редактировал вопрос, пожалуйста, проверьте его. Благодаря!
БернаМариано

Это должна быть полная программа, и есть ли ограничение на формат вывода?
Брэд Гилберт b2gills

Ответы:


6

GolfScript (24 символа)

','/{~.,!{~)),>~}*}%','*

Например

$ golfscript.rb expand.gs <<<"1,3-5,9,16,18-23"
1,3,4,5,9,16,18,19,20,21,22,23

На самом деле у меня есть четыре 24-символьных решения, но я выбрал это, потому что в нем нет буквенно-цифровых символов.

Как это работает

# On the stack: a string such as "1,3-5,9,16,18-23"
','/
# Split on commas to get ["1" "3-5" "9" "16" "18-23"]
{
    # This is executed for each of those strings in a map
    # So stack holds e.g. "1" or "3-5"

    # Evaluate the string.
    # If it's a single number, this puts the number on the stack.
    # Otherwise it's parsed as a positive number followed by a negative number.
    ~
    # Stack holds e.g. 1 or 3 -5
    # Duplicate the last element on the stack and make a list of that length.
    # If it's negative or zero, the list will be empty
    .,
    # Negate. An empty list => 1; a non-empty list => 0
    !
    # If the string was a single number "n", the stack now holds n 0
    # If the string was a range "m-n", the stack now holds m -n 1
    # The following block will be executed 0 times for "n" and once for "m-n"
    {
        # Here we rely on twos-complement numbers satisfying ~n = -n -1
        # Stack: m -n
        ~))
        # Stack: m -(-n)-1+2  =  m n+1
        ,
        # Stack: m [0 1 2 ... n]
        >
        # Stack: [m m+1 ... n]
        ~
        # Stack: m m+1 ... n
    }*
}%
# On the stack: e.g. [1 3 4 5 9 16 18 19 20 21 22 23]
','*
# Joined by , to give the desired output

Как вы можете расширить 3-5 в 3,4,5 без использования одного персонажа -?
БернаМариано

@ BernaMariano, извините, я как-то пропустил ваш вопрос. Я расширю ответ подробным объяснением.
Питер Тейлор

7

Perl 25 26 25

$_ строка последовательности

s/-/../g;$_=join",",eval

Пример сеанса:

[~/] $ perl -M5.010 -pe 's/-/../g;$_=join",",eval' <<< "1,3-5,9,16,18-23"
1,3,4,5,9,16,18,19,20,21,22,23

Добавлен 1 символ к количеству символов для опции (спасибо Гарет, ..kinda).-n-p


Я, вероятно, сделал неправильный подсчет символов (с параметрами командной строки). Не стесняйтесь исправить мой подсчет, пожалуйста
ardnew

Исходя из ответа на этот вопрос на мета , вам нужно всего лишь добавить 1 символ для nопции.
Гарет

Удалить -M5.010и обменять -eна-E
Брэд Гилберт b2gills

4

golfscript, 46 45

Моя первая в истории программа сценариев игры в гольф заняла несколько часов.

{','/{'-'/{~}%.,1-{))+{,}/\-~}{~}if}%","*}:r; 

# call:
"1,3-5,9,16,18-23"r

# return:
1,3,4,5,9,16,18,19,20,21,22,23

Вы можете попробовать это на http://golfscript.apphb.com/

Мой лучший способ объяснить это злодеяние:

{...}:r;     # makes a function block ... and names it r

','/         # slices the top element of stack from each ','
             # so we get ["1" "3-5" "9" "16" "18-23"]

{...}%       # makes a function block ... and calls it for 
             # each element in the list

'-'/{~}%     # slices the list by '-' and evals each element 
             # from string to int. ["1"] becomes [1], 
             # ["3-5"] becomes [3 5]

.,1-         # adds the length of the list -1 on top of the stack
             # so for [1] the stack becomes [1] 0, for [3 5]
             # it becomes [3 5] 1

# next we add two function blocks, they, like the 0/1 just before
# are used by an if clause a tiny bit later. First block is for 
# lists that have a 1 on top of them, the latter for ones with 0.

# First block, we have something like [3 5]

))+          # pops the top element of the array, increments 
             # it and puts back. [3 6]

## It seems {...}%~ is same as {...}/
## this is why these two are not in the code any more

{,}%         # , makes a list from 0 to n-1, where n is the parameter
             # so we get [[0 1 2] [0 1 2 3 4 5]]

~            # Dumps the outer array, [0 1 2] [0 1 2 3 4 5]

\            # swaps the two arrays

-            # set complement [3 4 5]

~            # dumps the array, so the elements are left in the stack

# Second block, we have something like [16]

~            # just dumps the array, 16

# Blocks end

if           # takes the top three elements of the stack, evaluates the 
             # first (0 or 1), runs second if true (anything but 
             # [], "", 0 or {} ), otherwise the third.

","*         # joins an array with ","

изменить 1: изменил последний {}% ~ на {} /, также мое описание, вероятно, было неверным.


2
+1, потому что любой, кто делает программу на GolfScript, заработал ее.
Гарет

@ Гарет Спасибо. Сначала я подумал, что просто сделаю это perl-способом: поменяю на ... и оценим. Тогда я не мог найти никакого разумного способа построить какие-либо массивы, поэтому я сделал это. Я уверен, что кто-то найдет решение с ~ 20 символами на гольфе.
Шион

У меня 24 на данный момент, так что я приму 20 в качестве вызова;) Вы можете сэкономить несколько довольно легко, хотя. Проблема требует программы, а не функции, поэтому вы можете потерять начальное {и конечное значения, }:r;а также сохранить его, заменив 1-на (. (Между прочим, IIRC - это один трюк, который я также пропустил в своей первой программе GolfScript)
Питер Тейлор,

PS Есть тонкая разница между {...}%~и {...}/. Если вы получаете доступ к чему-то дальше вниз по стеку, используя integer $первое, то это проще, потому что вам не нужно каждый раз корректировать целое число, чтобы компенсировать то, что вы оставляете в стеке.
Питер Тейлор


3

К, 47

","/:,/${x+!1+y-x}.'2#'a,'a:"I"$'"-"\:'","\:0:0

Прецедент

k)","/:,/${x+!1+y-x}.'2#'a,'a:"I"$'"-"\:'","\:0:0
1,3-5,9,16,18-23
"1,3,4,5,9,16,18,19,20,21,22,23"

","/:$,/{{x+!1+y-x}. 2#"J"$"-"\:x}'","\:0:0для 43 байт
streetster


2

J, 53 43 41 39 38 символов

;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1

Берет ввод с клавиатуры:

   ;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1
1-4,8-11
1 2 3 4 8 9 10 11

Выход для запрошенного теста:

   ;(}.[:i.1+])/&.>".'- ,;'charsub 1!:1[1
1,3-5,9,16,18-23
1 3 4 5 9 16 18 19 20 21 22 23

2

Калий , 173 байта

Это было довольно долго и, возможно, не будет конкурировать, так как в конце есть трейлинг.

 func main(){p="1,2,3,5-8".split(",")for(c=0;c<p.length;c++){e=p[c]if(e.contains("-")){p=e.split("-")for(x=p[0].toInt();x<=p[1].toInt()print(x++ +",")){}}else print(e+",")}}

Запустите онлайн и посмотрите расширенный здесь



1

Python 2,7, 147 138 байт

г, е = вход (). сплит ( ''), []
для я в z:
 х = i.split ( '-')
 если len (x)> 1: f + = range (int (x [0]), int (x [1]) + 1)
 остальное: F + = [Int (х [0])]
печать str (f) [1: -1]

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

>>> питон nums.py
"1,3-5,9,16,18-23"
1, 3, 4, 5, 9, 16, 18, 19, 20, 21, 22, 23

Не самая лучшая программа ...


1
Добро пожаловать в PPCG. Я думаю, что вы можете сократить ответ, используя 1 пробел для отступов.
Intrepidcoder

Спасибо @intrepidcoder, я не знал, что вы можете использовать отступы одного пробела.
Алекс

1

MATLAB, 47 байтов

disp(eval(['[',strrep(input(''),'-',':'),']']))

Этот фрагмент читает строку ввода из командного окна, заменяет '-' на ':', добавляет квадратные скобки к строке и затем оценивает ее, так что ввод будет расширен до полного массива чисел.

Пример ввода:

'1,3-5,9,16,18-23'

Пример вывода:

1     3     4     5     9    16    18    19    20    21    22    23

Я считаю, что этот вывод разрешен, так как задача только сказать, что все числа в группе должны отображаться.


вывод через запятую был бы лучше, хотя я могу увидеть шаблон с 5 пробелами , это здорово для меня :)
BernaMariano


1

PowerShell, 79 71 байт

('('+($args[0]-replace'-','..'-replace',','),(')+')'|iex|%{$_})-join','

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

Внутренняя часть изменяет формат «1,5-9,12» на формат «(1), (5..9), (12)», который понимает PowerShell, а затем выполняет его с iex, который создает массив массивов. Затем выполните итерацию по каждому внутреннему массиву, а затем, наконец, объедините все элементы внешнего массива вместе.

Заимствует код из моего ответа «Помоги мне управлять своим временем»

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

PS C:\Tools\Scripts\golfing> .\return-each-number-from-a-group-of-numbers.ps1 '1,3-5,9,16,18-23'
1,3,4,5,9,16,18,19,20,21,22,23

-8 байт благодаря вескам



1

K (ок) , 40 31 байт

Решение

,/{{x+!1+y-x}. 2#.:'"-"\x}'","\

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

Объяснение:

Удалось больше поиграть в гольф, добавив объяснение ...

,/{{x+!1+y-x}. 2#.:'"-"\x}'","\ / the solution
                           ","\ / split input on ","
  {                      }'     / apply lambda to each
                    "-"\x       / split x on "-"
                 .:'            / value (.:) each (')
               2#               / 2 take (dupe if only 1 element)
   {        }.                  / diadic lambda, 2 args x and y
         y-x                    / y subtract x
       1+                       / add 1
      !                         / range 0..n
    x+                          / add x
,/                              / flatten

0

Clojure, 110 байт

#(clojure.string/join","(for[s(.split %",")[a b][(map read-string(.split s"-"))]r(if b(range a(inc b))[a])]r))

Работать со строками не очень весело :(




0

Japt , 12 байт

q, c@OvXr-'ò

Попробуй


Вы можете заменить c@на £?
Оливер

@Oliver, так как это старая задача, в которой не указан формат ввода-вывода, я допустил ошибку из-за осторожности, принимая входные данные в виде строки с разделителями-запятыми и выводя их в виде уплощенного массива. Обычно, однако, да, я бы указал входные данные в виде массива строк, выходные данные в виде многомерного массива и просто использовал бы £вместо первых 5 байтов.
Лохматый

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