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

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!


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

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

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.


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


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.


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


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



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 ""]
    ]
]
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.