Повертайте кожне число з групи чисел


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
Або перекриття? Чи слід сортувати вихід і не містити дублікатів?
Пітер Тейлор

@Gareth Так, це кодовий гольф, то, будь ласка, проголосуйте за найкоротшу відповідь. Метт і Пітер, я редагував питання, будь ласка, перевір його. Дякую!
BernaMariano

Чи повинна вона бути повноцінною програмою і чи є обмеження на формат виводу?
Бред Гілберт 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

@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 символ до кількості символів за варіант (спасибі Гарет, ..кінда).-n-p


Я, мабуть, зробив підрахунок символів неправильно (з параметрами командного рядка). Не соромтеся виправити мій підрахунок, будь ласка
ardnew

Йдучи відповіді на це запитання на мета , вам потрібно лише додати 1 символ для nпараметра.
Гарет

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

4

гольфскрипт, 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, заробив її.
Гарет

@Gareth Дякую Я спершу подумав, що просто зроблю це перламутровим способом: зміни - на .. і оцінюй це. Тоді я не міг знайти жодного розумного способу побудувати будь-який масив, тому зробив це. Я впевнений, що хтось зіткнеться із рішенням ~ 20 char із golfscript.
shiona

Наразі у мене 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

Hassium , 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, f = вхід (). розділити (','), []
для i в z:
 x = i.split ('-')
 якщо len (x)> 1: f + = діапазон (int (x [0]), int (x [1]) + 1)
 інше: f + = [int (x [0])]
друк str (f) [1: -1]

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

>>> python 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-
пробільний


1

PowerShell, 79 71 байт

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

Спробуйте в Інтернеті!

Внутрішня частина змінює "1,5-9,12" на формат "(1), (5..9), (12)", який PowerShell розуміє, а потім виконує його з iex, що створює масив масивів. Потім повторіть кожен внутрішній масив, а потім нарешті з'єднайте всі зовнішні елементи масиву

Запозичує код з мого «Help Me Управління My Time» відповідь

Використання

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 байт завдяки Veskah



1

K (oK) , 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 байтів.
Shaggy

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.