Выходные числа, более или менее


15

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

Для заданной входной строки (или массива), состоящей из <и >, выведите последовательность (массив или строку) целых чисел, такую ​​что:

  • все операторы являются правильными, если их применять по порядку между последовательными числами в выходных данных.
  • все целые числа положительны (1 или больше)
  • сумма целых чисел настолько мала, насколько это математически возможно

Входные данные могут варьироваться в зависимости от "больше чем" и "меньше чем" на выбранном вами языке.

В качестве альтернативного вывода просто укажите сумму чисел в выводе. Укажите версию, которую вы решаете, в заголовке своего ответа.

Применяются обычные исключения и правила, побеждают наименьшие байты.

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

Примеры

  • >дает 2 1какие суммы3
  • >>>дает 4 3 2 1какие суммы10
  • ><дает 2 1 2какие суммы5
  • дает 1какие суммы1
  • >>>>>>>>>дает 10 9 8 7 6 5 4 3 2 1какие суммы55
  • >><<>><>>>дает 3 2 1 2 3 2 1 4 3 2 1какие суммы24
  • ><>><>><>дает 2 1 3 2 1 3 2 1 2 1какие суммы18
  • <<<<>дает 1 2 3 4 5 1какие суммы16
  • <<<<><<>дает 1 2 3 4 5 1 2 3 1какие суммы22
  • >><<дает 3 2 1 2 3какие суммы11

Можем ли мы использовать символы, кроме >и <?
— Эрик Outgolfer

@JonathanAllan Я думаю, что это неправильные примеры, и вы должны исходить из того, что, отвечая, не то, что спецификация неверна. РЕДАКТИРОВАТЬ: Ну, тогда я боюсь, что они недействительны, так как задача определяет вызов, а не тестовые случаи.
— Эрик Outgolfer

4
Просто жду ответа в <> <.
— Хулдрасет на'Барья

1
Огромные извинения всем за то, что испортили примеры! Что касается других символов, да, если они имеют одинаковое значение на вашем языке
— simonalexander2005

3
@ Scrooble Вы написали это неправильно. Это><>
— Джо Кинг

Ответы:


3

Желе , 19 байт

0;+×¥@\
=”<µCṚÇṚ»Ç‘

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

Значение каждого числа является максимальным ( число >непосредственно справа от него , число <непосредственно слева от него ) + 1 .


С другой стороны ...

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


Мне не нравятся языки, требующие переноса программы, как Stax ... ну, Джелли граничит. (требуется программа для сжатия строк) По крайней мере, Джелли все еще выигрывает.
— user202729


Эстетически мне это тоже не нравится. Но больше всего мне нравится в языке игры в гольф то, что позволяет его программам быть наименьшими. У меня до сих пор есть несколько идей для Stax об этом ...
— рекурсивный

8

> <> , 40 38 байт

1v!rnr~<oa
?\i:0(?^3%\+$
{/?:-{:}-1/1:

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

Подходящий язык. Для справки ><>сама дает 2,1,2,1.

Как это устроено:

1v   Initialise the stack as 1 and enter loop
 \i:0(?^  If we're out of input, go to the first line
        3%\ Otherwise mod the input by 3, yielding 0 for < and 2 for >
        -1/Subtract 1 to get -1 and 1 respectively
    -{:}   Copy the previous number and subtract the above from it

 /?:    If the number is not 0, repeat the loop

?\        \+$  Otherwise:
                Increment each number until we reach the original 0
{/        /1:   And enter the first loop again

      ~<    When we're out of input, pop the extra -1 from EOF
   rnr      Output the first number
1v!         Push a 1 
        oa  Print a newline and repeat, popping the extra 1 each time

+1 за указание, какое значение имеет сам язык. :) (И потому что это также хороший ответ, иначе я бы не
— добавил +1

5

Python 3, 93 байта

k=0
for r in input().split('<'):p=len(r);print(max(k,p)+1,*range(p,0,-1),end=' ');k=1+(p<1)*k

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

расшифровывали:

# offset, will be explained later
k = 0 
for run in input().split('<'):
    # p = length of sequence of '>'s, which will produce p+1 decreasing integers
    p = len(run)
    # will print:
    # p+1 p p-1 ... 1    or    k+1 p p-1 ... 1
    print(max(k, p) + 1, *range(p, 0, -1), end=' ')
    # offset of the next sequence: (i.e. -1 + the minimal value of the first integer)
    k = 1 + (k if p > 0 else 0)

1
Это мой первый гольф!
— Fons

5

Haskell , 119 байт

n%">"=r[1..n]
n%"<"=[1..n]
n%(c:b)|c==b!!0=(n+1)%b|a:s<-2%b,e:z<-r$n%[c]=r z++last(max:[min|c>'<'])a e:s
r=reverse
(2%)

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

объяснение

Идея здесь состоит в том, что у нас есть серии >s или <s, каждый из которых соответствует возрастающим и нисходящим диапазонам. Поэтому мы используем groupдля разделения строки на группы последовательных символов. Наша работа состоит в том, чтобы затем соединить их надлежащим образом.

Когда у нас есть, <>мы хотим соединить два списка, например, с большим конечным значением

<<<<<<>>

разделен

<<<<<<  >>

сопоставлены с диапазонами

[1,2,3,4,5,6,7] [3,2,1]

Затем, когда мы сшиваем, мы падаем, 3потому что он меньше ( 3не больше чем 7).

 [1,2,3,4,5,6,7,2,1]

Когда у нас есть, ><мы делаем противоположное, мы опускаем большее значение.

Фактический код достигает этого, делая оператора %. Определение %довольно сложное, но в основном оно читает слева направо, отслеживая, сколько последовательных символов совпадают. Это делает слева значение оператора. Когда мы достигаем места, где меняются персонажи, мы выполняем сшивание, как я описал.


Какова цель последней строки (2%)?
— Сиракуза

@siracusa Это сама функция. Это функция pointfree, поэтому он в основном говорит , вызов %с 2первым аргументом.
— Пост Рок Гарф Хантер

Является ли здесь обычной практикой просто помещать последний вызов функции в последнюю строку вместо добавления полной mainреализации?
— Сиракуза

1
@siracusa Да. Представления допускаются как именованные функции, анонимные функции или как полные программы. Это анонимная функция. Я выбираю анонимный просто потому, что он самый короткий.
— Пост Рок Гарф Хантер


4

Сетчатка 0.8.2 , 36 байт


1
{`\b(1+)>\1
1$&
}`(1+)<\1\b
$&1
1

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:


1

Вставьте 1s до, между и после <s и >s.

{`\b(1+)>\1
1$&
}`(1+)<\1\b
$&1

Повторно увеличивайте целые числа, пока все сравнения не будут выполнены.

1

Суммируйте целые числа и преобразуйте в десятичную.


3

Java 10, 198 181 байт

s->{var p=s.split("(?<=(.))(?!\\1)");int l=p.length,L[]=new int[l],i=l,r=0,a,b;for(;i-->0;r+=a*-~a/2-(i<l-1?p[i].charAt(0)<61?a<(b=L[i+1])?a:b:1:0))a=L[i]=p[i].length()+1;return r;}

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

Объяснение:

s->{                      // Method with String parameter and integer return-type
  var p=s.split("(?<=(.))(?!\\1)");
                          //  Split the String into parts
                          //  (i.e. ">><<>><>>>" becomes [>>, <<, >>, <, >>>])
  int l=p.length,         //  Get the amount of parts
      L[]=new int[l],     //  Create an integer-array of the same size
      i=l,                //  Index-integer, starting at this size
      r=0,                //  Result-integer, starting at 0
      a,b;                //  Two temp integers to reduce the byte-count
  for(;i-->0;             //  Loop downwards over the array; range: (`l`,0]
      ;r+=                //    After every iteration: increase the result with:
          a*-~a/2         //     The triangle number of the current item
        -(i<l-1?          //     If it's not the last item:
           p[i].charAt(0)<61?
                          //      And the order of the current and previous is "<>":
            a<(b=L[i+1])? //       If the current item in `L` is smaller than the previous:
             a            //        Subtract the current item
            :             //       Else (the current is equal or larger than the previous):
             b            //        Subtract the previous item
           :              //      Else (the order of the two parts is "><" instead):
            1             //       Subtract 1
          :               //     Else (it's the last item in `L`):
           0))            //      Leave the result `r` unchanged
    a=L[i]=               //   Set both `a` and the current item in `L` to:
     p[i].length()+1;     //    The length of the part + 1
  return r;}              //  Return the result


2

Stax , 21 байт

éda╓~/└↨☺∟╒←║ç Γφ5←9h

Запустите и отладьте его

Он работает путем кодирования входной длины, а затем объединяет сгенерированные диапазоны. Распакованный, размазанный и прокомментированный, это выглядит так.

|R      run-length encode
{       begin block
  H^R   range from [1 .. run length]
  _hh|1 -1 ** (character code / 2)
  *     multiply run; this will reverse it iff character is '>'
m       map runs using preceding block
O       push a 1 under the top of stack
{       begin block
  h|M   get the start of the generated range, and take max of it and top of stack
  _DE   push the rest (tail) of the generated range to the stack
F       foreach generated range
L|+     sum of all values on the stack

Запустите этот


2

Perl 5 -p , 53 байта

#!/usr/bin/perl -p
s//1/g;1while s/(?=\b(1+)>\1)|(1+)<\2\b\K/1/;$_=y/1//

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


1
Этот ответ, кажется, был реализован на основе тестовых случаев, а не спецификации запроса. К сожалению, они были определены как неправильные .
— Эрик Outgolfer

1
@EriktheOutgolfer Исправлено
— Тон Хоспел

1

Красный , 185 байт

func[s][repeat n 1 + length? s[l: 0 i: n - 1 while[i > 0 and(s/(i) = #"<")][i:  i - 1 l: l + 1]r: 0 i: n while[(i <= length? s)and(s/(i) = #">")][i: i + 1 r:
r + 1]prin[1 + max l r""]]]

После объяснения пользователя 202729 ...

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

f: func[s][
   repeat n 1 + length? s[
       l: 0
       i: n - 1
       while [i > 0 and (s/(i) = #"<")][ 
           i: i - 1
           l: l + 1
        ]
        r: 0
        i: n
        while [(i <= length? s) and (s/(i) = #">")][
            i: i + 1
            r: r + 1
        ]
        prin[1 + max l r ""]
    ]
]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.