Números de saída, mais ou menos

15

O desafio

Dada uma sequência de entrada (ou matriz) que consiste em <e >, gera uma sequência (matriz ou sequência) de números inteiros, tais como:

  • os operadores estão todos corretos quando aplicados em ordem entre números consecutivos na saída
  • todos os números inteiros são positivos (1 ou maior)
  • a soma dos números inteiros é tão pequena quanto é matematicamente possível

As entradas podem variar para corresponder a "maior que" e "menor que" no idioma escolhido.

Como saída alternativa, basta especificar a soma dos números na saída. Indique qual versão você está resolvendo no título da resposta.

Exclusões e regras usuais se aplicam, os menores bytes são ganhos.

Você pode assumir que a sequência de entrada nunca levará a um estouro de número inteiro no seu idioma, se isso ajudar.

Exemplos

  • >2 1quais somas para3
  • >>>4 3 2 1quais somas para10
  • ><2 1 2quais somas para5
  • 1quais somas para1
  • >>>>>>>>>10 9 8 7 6 5 4 3 2 1quais somas para55
  • >><<>><>>>3 2 1 2 3 2 1 4 3 2 1quais somas para24
  • ><>><>><>2 1 3 2 1 3 2 1 2 1quais somas para18
  • <<<<>1 2 3 4 5 1quais somas para16
  • <<<<><<>1 2 3 4 5 1 2 3 1quais somas para22
  • >><<3 2 1 2 3quais somas para11
simonalexander2005
fonte
Podemos usar símbolos diferentes de >e <?
Erik the Outgolfer
@ JonathanAllan Acho que são os exemplos errados, e você deve assumir que, ao responder, não que as especificações estejam erradas. EDIT: Bem, então eu acho que eles são inválidos, pois é a especificação que define um desafio, não os casos de teste.
Erik the Outgolfer
4
Apenas esperando por uma resposta em <> <.
Khuldraeseth na'Barya
1
Desculpas maciças a todos por estragar os exemplos! Quanto aos outros caracteres, sim, desde que tenham o mesmo significado no seu idioma
simonalexander2005
3
@ Scrooble Você escreveu errado. É><>
Jo King

Respostas:

3

Geléia , 19 bytes

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

Experimente online!

O valor de cada número é max ( número de >imediatamente à direita , número de <imediatamente à esquerda ) + 1 .


Alternativamente...

Experimente online!

user202729
fonte
Não gosto de idiomas que exijam um programa para transpilar como Stax ... bem, Jelly é limítrofe. (requer um programa para comprimir as cordas) Pelo menos, o Jelly ainda vence.
user202729
Esteticamente, eu também não gosto muito. Mas o que mais gosto em uma linguagem de golfe é o que permite que seus programas sejam menores. Eu ainda tenho algumas idéias para stax sobre este ...
recursivo
8

> <> , 40 38 bytes

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

Experimente online!

Um idioma apropriado. Para referência em ><>si produz 2,1,2,1.

Como funciona:

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
Brincadeira
fonte
+1 por indicar qual valor o próprio idioma possui. :) (E porque é apenas uma boa resposta também, caso contrário, eu não a teria
marcado com +1
5

Python 3, 93 bytes

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

Experimente online!

Sem embaralhar:

# 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
fonte
1
Este é o meu primeiro golfe!
Fons
5

Haskell , 119 bytes

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

Experimente online!

Explicação

A idéia aqui é que temos execuções de >s ou <s, cada uma mapeada para faixas ascendentes e descendentes. Então nós usamosgroup para dividir a sequência em grupos de caracteres consecutivos. Nosso trabalho é costurá-las da maneira adequada.

Quando temos <>, queremos unir as duas listas, tomando o maior valor final, por exemplo

<<<<<<>>

é dividido

<<<<<<  >>

mapeado para intervalos

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

Então, quando costuramos, caímos 3porque é menor ( 3não é maior que 7).

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

Quando temos ><o oposto, diminuímos o valor maior.

O código real atinge isso criando um operador %. A definição de %é bastante complexa, mas basicamente lê da esquerda para a direita, acompanhando quantos caracteres consecutivos são iguais. Faz isso à esquerda tinha o valor do operador. Quando chegamos a um lugar onde os caracteres mudam, realizamos a costura como descrevi.

Post Rock Garf Hunter
fonte
Qual é o objetivo da última linha (2%)?
31418 siracusa
@siracusa Essa é a função em si. É uma função pointfree, por isso basicamente diz chamada %com 2como o primeiro argumento.
Post Rock Garf Hunter
É uma prática comum aqui apenas colocar a chamada de função final na última linha, em vez de adicionar uma mainimplementação completa ?
31418 siracusa
1
@siracusa Sim. Os envios são permitidos como funções nomeadas, funções anônimas ou como programas completos. Esta é uma função anônima. Eu escolho o anônimo simplesmente porque é o mais curto.
Post Rock Garf Hunter
@siracusa Consulte o nosso Guia de regras de golfe em Haskell .
Laikoni 30/03/19
4

Retina 0.8.2 , 36 bytes


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

Experimente online! O link inclui casos de teste. Explicação:


1

Inserir 1s antes, entre e após os <s e >s.

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

Aumente repetidamente números inteiros até que todas as comparações sejam satisfeitas.

1

Soma os números inteiros e converta em decimal.

Neil
fonte
3

Java 10, 198 181 bytes

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

Experimente online.

Explicação:

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
fonte
3

Haskell , 87 bytes

r=reverse
s#c=(+1).length.takeWhile(==c)<$>scanr(:)[]s
f s=zipWith max(s#'>')$r$r s#'<'

Experimente online!

Um porto da minha resposta Jelly.

user202729
fonte
Você pode
usar
@ user56656 Obrigado!
precisa saber é o seguinte
2

Stax , 21 bytes

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

Execute e depure

Ele funciona codificando a entrada no comprimento da execução e concatenando os intervalos gerados juntos. Descompactado, não jogado e comentado, é assim.

|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

Execute este

recursivo
fonte
2

Perl 5 -p , 53 bytes

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

Experimente online!

Ton Hospel
fonte
1
Essa resposta parece ter sido implementada com base nos casos de teste, e não na especificação do desafio. Infelizmente, eles foram identificados como errados .
Erik the Outgolfer
1
@EriktheOutgolfer Fixed
Ton Hospel
1

Vermelho , 185 bytes

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

Após a explicação de user202729 ...

Experimente 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 Ivanov
fonte