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


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.