Numeri di output, più o meno


15

La sfida

Data una stringa di input (o matrice) composta da < e >, genera una sequenza (array o stringa) di numeri interi tale che:

  • gli operatori sono tutti corretti se applicati in ordine tra numeri consecutivi nell'output
  • tutti i numeri interi sono positivi (1 o superiore)
  • la somma degli interi è piccola quanto è matematicamente possibile

Gli input possono variare per corrispondere a "maggiore di" e "minore di" nella lingua scelta.

Come output alternativo, basta specificare la somma dei numeri nell'output. Indica quale versione stai risolvendo nel titolo Risposta.

Si applicano le esclusioni e le regole usuali, vince il byte più piccolo.

Puoi supporre che la stringa di input non porterà mai a un overflow di numeri interi nella tua lingua, se ciò aiuta.

Esempi

  • >2 1quale somma a3
  • >>>4 3 2 1quale somma a10
  • ><2 1 2quale somma a5
  • 1quale somma a1
  • >>>>>>>>>10 9 8 7 6 5 4 3 2 1quale somma a55
  • >><<>><>>>3 2 1 2 3 2 1 4 3 2 1quale somma a24
  • ><>><>><>2 1 3 2 1 3 2 1 2 1quale somma a18
  • <<<<>1 2 3 4 5 1quale somma a16
  • <<<<><<>1 2 3 4 5 1 2 3 1quale somma a22
  • >><<3 2 1 2 3quale somma a11

Possiamo usare simboli diversi da >e <?
Erik the Outgolfer,

@JonathanAllan Penso che siano gli esempi che sono sbagliati, e dovresti supporre che quando rispondi, non che le specifiche siano sbagliate. EDIT: Beh, allora temo che non siano validi, poiché è la specifica che definisce una sfida, non i casi di test.
Erik the Outgolfer

4
Sto solo aspettando una risposta in <> <.
Khuldraeseth na'Barya,

1
Scuse enormi a tutti per aver incasinato gli esempi! Come per gli altri personaggi, sì, purché abbiano lo stesso significato nella tua lingua
simonalexander2005

3
@Scrooble L'hai scritto male. È><>
Jo King il

Risposte:


3

Gelatina , 19 byte

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

Provalo online!

Il valore di ciascun numero è max ( numero di >immediatamente a destra di esso , numero di <immediatamente a sinistra di esso ) + 1 .


In alternativa ...

Provalo online!


Non mi piacciono le lingue che richiedono la trascrizione di un programma come Stax ... beh, Jelly è borderline. (richiede un programma per comprimere le stringhe) Almeno, Jelly vince ancora.
user202729


Esteticamente, neanche a me piace molto. Ma la cosa che mi piace soprattutto in una lingua da golf è qualunque cosa permetta ai suoi programmi di essere più piccoli. Ho ancora qualche idea di stax su questo ...
ricorsivo il

8

> <> , 40 38 byte

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

Provalo online!

Una lingua appropriata Per riferimento><> stesso produce 2,1,2,1.

Come funziona:

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 per indicare quale valore ha la lingua stessa. :) (E poiché è anche solo una buona risposta, altrimenti non l'avrei fatto +1).
Kevin Cruijssen,

5

Python 3, 93 byte

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

Provalo online!

in chiaro:

# 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
Questo è il mio primo golf!
Fons

5

Haskell , 119 byte

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

Provalo online!

Spiegazione

L'idea qui è che abbiamo serie di >s o <s, che ciascuna mappa su intervalli crescente e decrescente. Quindi usiamogroup per dividere la stringa in gruppi di caratteri consecutivi. Il nostro compito è quindi di ricucirli nel modo giusto.

Quando abbiamo <>vogliamo cucire insieme le due liste prendendo ad esempio il valore finale più grande

<<<<<<>>

è diviso

<<<<<<  >>

mappato su intervalli

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

Quindi quando cuciamo cadiamo 3perché è più piccolo ( 3non è più grande di 7).

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

Quando abbiamo ><fatto il contrario, lasciamo cadere il valore più grande.

Il codice attuale lo ottiene creando un operatore %. La definizione di %è piuttosto complessa, ma sostanzialmente legge da sinistra a destra tenendo traccia di quanti caratteri consecutivi sono uguali. Lo fa a sinistra aveva il valore dell'operatore. Quando raggiungiamo un punto in cui i personaggi cambiano, eseguiamo le cuciture come ho descritto.


Qual è lo scopo dell'ultima riga (2%)?
siracus

@siracusa Questa è la funzione stessa. Si tratta di una funzione pointfree, così si dice in sostanza chiamata %con 2come primo argomento.
Post Rock Garf Hunter,

È una pratica comune qui mettere la chiamata di funzione finale sull'ultima riga invece di aggiungere mainun'implementazione completa ?
siracus

1
@siracusa Sì. Gli invii sono consentiti come funzioni denominate, funzioni anonime o come programmi completi. Questa è una funzione anonima. Scelgo anonimo semplicemente perché è il più corto.
Post Rock Garf Hunter,

@siracusa Vedi la nostra guida alle regole del golf a Haskell .
Laikoni,

4

Retina 0.8.2 , 36 byte


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

Provalo online! Il link include casi di test. Spiegazione:


1

Inserire 1s prima, tra e dopo la <s e la >s.

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

Incrementare ripetutamente numeri interi fino a quando tutti i confronti non sono soddisfatti.

1

Somma gli interi e converti in decimale.


3

Java 10, 198 181 byte

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

Provalo online.

Spiegazione:

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 byte

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

Esegui ed esegui il debug

Funziona codificando la lunghezza di input, quindi concatenando gli intervalli generati insieme. Disimballato, non golfato e commentato, sembra così.

|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

Esegui questo



1

Rosso , 185 byte

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

Dopo la spiegazione dell'utente202729 ...

Provalo 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 ""]
    ]
]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.