Dane wyjściowe, mniej więcej

15

Wyzwanie

Biorąc pod uwagę ciąg wejściowy (lub tablicę) składający się z <i >, wypisz ciąg (tablicę lub ciąg) liczb całkowitych, taki, że:

  • operatory są poprawne, gdy są stosowane w kolejności między kolejnymi liczbami na wyjściu
  • wszystkie liczby całkowite są dodatnie (1 lub więcej)
  • suma liczb całkowitych jest tak mała, jak jest to możliwe matematycznie

Dane wejściowe mogą się różnić, aby dopasować „większy niż” i „mniejszy niż” w wybranym języku.

Jako wyjście alternatywne wystarczy podać sumę liczb na wyjściu. Podaj wersję, którą rozwiązujesz w tytule odpowiedzi.

Obowiązują zwykłe wyłączenia i reguły, wygrywa najmniejsze bajty.

Możesz założyć, że ciąg wejściowy nigdy nie doprowadzi do przepełnienia liczb całkowitych w twoim języku, jeśli to pomoże.

Przykłady

  • >daje, 2 1które sumy3
  • >>>daje, 4 3 2 1które sumy10
  • ><daje, 2 1 2które sumy5
  • daje, 1które sumy1
  • >>>>>>>>>daje, 10 9 8 7 6 5 4 3 2 1które sumy55
  • >><<>><>>>daje, 3 2 1 2 3 2 1 4 3 2 1które sumy24
  • ><>><>><>daje, 2 1 3 2 1 3 2 1 2 1które sumy18
  • <<<<>daje, 1 2 3 4 5 1które sumy16
  • <<<<><<>daje, 1 2 3 4 5 1 2 3 1które sumy22
  • >><<daje, 3 2 1 2 3które sumy11
simonalexander2005
źródło
Czy możemy używać symboli innych niż >i <?
Erik the Outgolfer
@JonathanAllan Myślę, że to przykłady są błędne, i powinieneś założyć, że odpowiadając, nie że specyfikacja jest zła. EDYCJA: Cóż, obawiam się, że są one nieprawidłowe, ponieważ to specyfikacja określa wyzwanie, a nie przypadki testowe.
Erik the Outgolfer
4
Czekam na odpowiedź w <> <.
Khuldraeseth na'Barya
1
Ogromne przeprosiny dla wszystkich za zepsucie przykładów! Jeśli chodzi o inne postacie, tak, pod warunkiem, że mają takie samo znaczenie w twoim języku
simonalexander2005
3
@ Scrooble źle przeliterowałeś. To><>
Jo King

Odpowiedzi:

3

Galaretka , 19 bajtów

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

Wypróbuj online!

Wartość każdej liczby wynosi max ( liczba >bezpośrednio po jej prawej stronie , liczba <bezpośrednio po jej lewej stronie ) + 1 .


Alternatywnie...

Wypróbuj online!

użytkownik202729
źródło
Nie lubię języków wymagających programu do transpozycji, takiego jak Stax ... cóż, Jelly jest na granicy. (wymaga programu do kompresji ciągów) Przynajmniej Galaretka wciąż wygrywa.
user202729,
Estetycznie też mi się to nie podoba. Ale najbardziej podoba mi się w golfie to, co pozwala najmniejszym programom. Nadal mam kilka pomysłów na to, żeby się tym zająć ...
rekurencyjny
8

> <> , 40 38 bajtów

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

Wypróbuj online!

Odpowiedni język. Dla porównania ><>sama wydajność daje 2,1,2,1.

Jak to działa:

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
Jo King
źródło
+1 za określenie wartości samego języka. :) (A ponieważ to także dobra odpowiedź, w przeciwnym razie nie dałbym +1).
Kevin Cruijssen
5

Python 3, 93 bajty

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

Wypróbuj online!

Nieszyfrowane:

# 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)
Fons
źródło
1
To jest mój pierwszy golf!
Fons
5

Haskell , 119 bajtów

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

Wypróbuj online!

Wyjaśnienie

Chodzi o to, że mamy przebiegi >s lub <s, z których każda mapuje zakresy rosnące i malejące. Dlatego używamy groupdo dzielenia łańcucha na grupy kolejnych znaków. Naszym zadaniem jest połączenie ich we właściwy sposób.

Kiedy mamy <>, chcemy połączyć ze sobą dwie listy, biorąc na przykład większą wartość końcową

<<<<<<>>

jest podzielony

<<<<<<  >>

zmapowane do zakresów

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

Następnie, kiedy zszywamy, upuszczamy, 3ponieważ jest mniejszy ( 3nie jest większy niż 7).

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

Kiedy to robimy, ><robimy coś przeciwnego, upuszczamy większą wartość.

Rzeczywisty kod osiąga to poprzez utworzenie operatora %. Definicja %jest dość złożona, ale w zasadzie odczytuje od lewej do prawej, śledząc, ile kolejnych znaków jest takich samych. Robi to po lewej stronie miał wartość operatora. Po dotarciu do miejsca, w którym zmieniają się postacie, wykonujemy szycie zgodnie z opisem.

Post Rock Garf Hunter
źródło
Jaki jest cel ostatniej linii (2%)?
siracusa
@siracusa To jest sama funkcja. Jest to funkcja bezcelowa, więc w zasadzie mówi „call %with” 2jako pierwszy argument.
Post Rock Garf Hunter
Czy jest to powszechna praktyka polegająca na umieszczaniu ostatniego wywołania funkcji w ostatnim wierszu zamiast dodawania pełnej mainimplementacji?
siracusa
1
@siracusa Tak. Zgłoszenia są dozwolone jako funkcje nazwane, funkcje anonimowe lub jako kompletne programy. To anonimowa funkcja. Wybieram anonimowy tylko dlatego, że jest najkrótszy.
Post Rock Garf Hunter
@siracusa Zobacz nasz przewodnik po zasadach gry w golfa w Haskell .
Laikoni
4

Retina 0.8.2 , 36 bajtów


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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:


1

Wstaw 1s przed, między i po <s i >s.

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

Kilkakrotnie zwiększaj liczby całkowite, aż wszystkie porównania zostaną spełnione.

1

Zsumuj liczby całkowite i przelicz na dziesiętne.

Neil
źródło
3

Java 10, 198 181 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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
Kevin Cruijssen
źródło
2

Stax , 21 bajtów

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

Uruchom i debuguj

Działa poprzez kodowanie długości wejścia, a następnie łączenie wygenerowanych zakresów razem. Rozpakowane, niepolowane i skomentowane, wygląda to tak.

|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

Uruchom ten

rekurencyjny
źródło
2

Perl 5 -p , 53 bajtów

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

Wypróbuj online!

Ton Hospel
źródło
1
Wydaje się, że ta odpowiedź została zaimplementowana na podstawie przypadków testowych zamiast specyfikacji wyzwania. Niestety zostały zidentyfikowane jako błędne .
Erik the Outgolfer
1
@EriktheOutgolfer Naprawiono
Ton Hospel
1

Czerwony , 185 bajtów

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

Po wyjaśnieniu użytkownika202729 ...

Wypróbuj online!

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 ""]
    ]
]
Galen Iwanow
źródło