Algoritmo de correspondência entre parênteses de golfe A


25

Você receberá uma string s. É garantido que a corda tem iguais e pelo menos um [s e ]s. Também é garantido que os suportes estejam equilibrados. A cadeia também pode ter outros caracteres.

O objetivo é produzir / retornar uma lista de tuplas ou uma lista de listas contendo índices de cada [e ]par.

nota: a sequência é indexada a zero.

Exemplo: !^45sdfd[hello world[[djfut]%%357]sr[jf]s][srtdg][]deve retornar

[(8, 41), (20, 33), (21, 27), (36, 39), (42, 48), (49, 50)]ou algo equivalente a isso. Tuplas não são necessárias. As listas também podem ser usadas.

Casos de teste:

input:[[asdf][][td([)ty54g% ]hg[[f]u][f[[jhg][gfd]sdf]sdfs]ghd]fr43f]
output:[(0, 62),(1, 6), (7, 8), (9, 56), (13, 22), (25, 30), (26, 28), (31, 52), (33, 47), (34, 38), (39, 43)]
input:[[][][][]][[][][][[[[(]]]]]))
output:[(0, 9), (1, 2), (3, 4), (5, 6), (7, 8), (10,26),(11, 12), (13, 14), (15, 16), (17, 25), (18, 24), (19, 23), (20, 22)]
input:[][][[]]
output:[(0, 1), (2, 3), (4, 7), (5, 6)]
input:[[[[[asd]as]sd]df]fgf][][]
output:[(0, 21), (1, 17), (2, 14), (3, 11), (4, 8), (22, 23), (24, 25)]
input:[]
output:[(0,1)]
input:[[(])]
output:[(0, 5), (1, 3)]

Isso é , então o código mais curto em bytes para cada linguagem de programação vence.


1
A ordem de saída é importante?
wastl

1
não, não tem.
Windmill Cookies

21
"note: A string é indexada em zero." - É muito comum para permitir implementações de escolher uma indexação consistente neste tipo de desafios (mas, é claro, depende de você)
Jonathan Allan

1
Podemos considerar a entrada como uma matriz de caracteres?
Shaggy

7
Custa um byte ...
dylnan

Respostas:




5

JavaScript, 69 62 bytes

Um pouco rápido de golfe no trem para casa. Provavelmente pode ser melhorado.

Recebe entrada como uma matriz de caracteres e gera um objeto com as chaves sendo os índices de se [seus valores são os índices de seus ]s correspondentes .

a=>a.map((x,y)=>x==`]`?o[a.pop()]=y:x==`[`&&a.push(y),o={})&&o

Experimente online


Surpreende-me que você possa jogar golfe no celular. : P
Oliver

2
@ Oliver, me surpreende que eu possa (quase) digitar em telas sensíveis ao toque - trazer de volta os teclados!
Shaggy

4

Haskell , 92 79 bytes

g(u:a)n(']':x)=(u,n):g a(n+1)x
g a n(s:x)=g([n|s=='[']++a)(n+1)x
g[]_[]=[]
g[]0

Experimente online!

Explicação

Criamos uma função gque leva 3 argumentos.

  • a, que são os locais de todos os [s sem correspondência .

  • n, que é o número de caracteres processados

  • x que são os personagens não processados.

Se nosso primeiro personagem for ], removemos uda frente nosso ae retornamos (u,n)mais o que resta.

g(u:a)n(']':x)=(u,n):g a(n+1)x

Se o nosso primeiro caractere não for ], isso é um [ou outro, incrementamos ne adicionamos [n|s=='[']à frente de a. [n|s=='[']será [n]se s=='['e []caso contrário.

g a n(s:x)=g([n|s=='[']++a)(n+1)x

Se estivermos sem caracteres, retornamos a lista vazia.

g[]_[]=[]

1
uau, isso é um bom pedaço de funções recursivas. Eu sou um novato em Haskell, isso me impressionou :)
Moinho cookies

@ gnu-ninguém Obrigado! Essa resposta provavelmente não é ótima, então eu encorajo você a tentar vencê-la ou esperar até que os jogadores de Haskell sérios cheguem.
Wheat Wizard

É melhor eu esperar até que os jogadores sérios Haskell chegar
Moinho cookies

4

Java 10, 95 bytes

Um lambda nulo usando a sequência de entrada como um int[]dos pontos de código Unicode.

s->{int r=0,w=0;for(var c:s){if(c==91)s[w++]=r;if(c==93)System.out.println(s[--w]+","+r);r++;}}

Experimente Online

Ungolfed

s -> {
    int r = 0, w = 0;
    for (var c : s) {
        if (c == 91)
            s[w++] = r;
        if (c == 93)
            System.out.println(s[--w] + "," + r);
        r++;
    }
}

Agradecimentos

  • agradecimentos a Jonathan Frech pela idéia de usar a string de entrada como uma pilha ( aqui )

É necessário definir re wcomo parte do código, não como parâmetros: s->{int r=0,w=0;...}.
Olivier Grégoire

@ OlivierGrégoire Kind of ambígua, mas este parece ter sido destinada a cobrir várias entradas vazias.
Jakob

1
A resposta que você cita responde explicitamente à pergunta "Podemos pegar um parâmetro vazio em vez de usá-lo em lugar algum ?". Você está usando essas entradas. Não vejo ambiguidade aqui.
Olivier Grégoire

A parte de edição da pergunta a torna absolutamente inequívoca quanto ao "não uso" da variável.
Olivier Grégoire

Certo, mas por que a resposta principal (1) não indica que as entradas não são utilizadas, (2) especifica quais são os valores de entradas extras e (3) menciona a possibilidade de abusar de entradas extras? Independentemente, eu vou mover as variáveis.
Jakob

4

vim, 89 bytes

:s/\(.\)/\1<C-V><C-M>/g|g/^\[/ :norm %mm%:pu! =line('.').','.line(\"'m\")<C-V><C-M><C-X>$<C-X>J
:v/\[/d|%s/\[//g

Anotado

:s/\(.\)/\1<C-V><C-M>/g            " one character per line
|g/^\[/                            " for each opening square bracket:
  :norm %mm%                       "   mark the line with the matching bracket
  :pu! =line('.').','.line(\"'m\") "   write the line numbers to preceeding line
  <C-V><C-M><C-X>$<C-X>J           "   convert to 0-based counting and join lines
:v/\[/d                            " remove all non-opening bracket lines
|%s/\[//g                          " remove brackets

<C-V>é 0x16. <C-M>é 0x0d. <C-X>é 0x18.

Experimente online!


4

QBasic (QB64), 137 127 112 bytes

INPUT a$
for i=0to len(a$)
c$=mid$(a$,i+1,1)
if"["=c$then
b(n)=i
n=n+1
elseif"]"=c$then
n=n-1
?b(n),i
endif
next

Precisamos de quatro dois bytes porque o desafio requer indexação 0. Meu primeiro post QBasic, o feedback é apreciado.

  • 10 bytes graças a steenbergh
  • 3 bytes graças a Erik the Outgolfer
  • 12 bytes salvando no formato de arquivo unix ( \r\n-> \n)

É assim quando executado:

Como fica


Agradável. Algumas dicas: use em ?vez de print(o compilador expande isso automaticamente para print), você não precisa dos espaços entre as seqüências de caracteres citadas e THENnos IFs, e pode soltar o idepois NEXT.
214186 #

@steenbergh Hein, parece que eu esqueci de remover o espaço em branco ... mas eu removi o que estava entre 0e to? Estou confuso ...
wastl

1
Não tenho certeza sobre o QB64, mas acho que if c$="["pode se tornar if"["=c$, elseif c$="]"pode se tornar elseif"]"=c$, end ifpode se tornar endife, com uma ligeira alteração na saída, ?b(n),ipode se tornar ?b(n)i(QBasic 1.1 é o que eu uso, seu caso pode ser diferente).
Erik the Outgolfer,

@EriktheOutgolfer tudo, menos ?b(n)ifuncionou
wastl

3

Pitão, 26 bytes

VQIqN\[=+YZ)IqN\],.)YZ)=hZ

Experimente aqui

Explicação

VQIqN\[=+YZ)IqN\],.)YZ)=hZ
VQ                     =hZ   For each character in the input (indexed by Z)...
  IqN\[=+YZ)                 ... if the character is [, add the index to Y...
            IqN\],.)YZ)      ... if the character is ], output the previous index
                             and current index.

Agradável! Minha abordagem ingênua foi de 36 bytes C,x"[" MQ #.e*qb\[t+lhfSI/LT"[]"._>Q,. Edit: eu sucedi golfe mina um pouco também, eu sou agora abaixo de 30.
Mr. Xcoder

3

R , 141 133 115 112 108 bytes

function(y,x=utf8ToInt(y)){for(i in seq(x)){if(x[i]==91)F=c(i,F);if(x[i]==93){T=c(T,F[1],i);F=F[-1]}};T[-1]}

Experimente online!

Nada especial. 1 indexado, porque eu disse isso. R realmente não tem pilhas, então eu usei originalmente c, heade tailpara obter o mesmo efeito literal. Versão original não gasta (atualiza usando utf8ToIntpara remover alguns bytes, usando o início do vetor como o topo da pilha e abusando Te Fbuiltins para evitar a inicialização das pilhas.):

f <- function(y, x=el(strsplit(y,""))) {
  p <- l <- NULL
  for(i in seq_along(x)) {
    if(x[[i]]=='[') {
      p <- c(p, i)
    }
    if(x[[i]]==']') {
      l <- c(l, tail(p, 1), i)
      p <- head(p, -1)
    }
  }
  l # Because I said so. Change to l-1 if you want to check the test cases.
}


e 1:nchar(y)é mais curto que seq_along(x). Very nice solução btw :)
Jayce

Gostaria de saber se gregexpré o caminho a percorrer.
ngm

Originalmente, tentei alavancar essa abordagem, mas não tenho certeza se esse é o caminho certo aqui.
Jayce

A solução JayCe é falha (verifique o resultado, ele retorna em 22 28 22vez de 22 28 21) provavelmente o (ab) uso de T / F não é realmente seguro: D. É mais curto e parece funcionar -> Experimente online!
precisa saber é o seguinte

2

Quarto (gforth) , 75 bytes

: f 0 do dup i + c@ dup 91 = if i s>f then 93 = if f>s . i . cr then loop ;

Experimente online!

Abusa da pilha de ponto flutuante, mas permite o uso de uma do loopvez que o código não toca (manualmente) na pilha de retorno.

Explicação

  1. Repetir caracteres na sequência
  2. Verifique cada personagem
    1. Se for igual a [, coloque na pilha de ponto flutuante
    2. se igual a ]pop da pilha de ponto flutuante e saída com a posição atual

Código Explicação

0 do                 \ start a loop from 0 to string-length
  dup                \ duplicate the starting address to avoid losing it
  i + c@             \ get the address of the current position and retrieve the character
  dup                \ duplicate the character, to allow checking twice
  91 = if            \ if char = [
    i s>f            \ store the current address on the floating point stack
  then               \ end the if-statement
  93 = if            \ if char = ]
    f>s .            \ pop the starting position from the float-stack and print
    i .              \ print the current position
    cr               \ output a newline
  then               \ end the if-statement
loop                 \ end the loop

2

Retina , 36 bytes

L$v`\[((\[)|(?<-2>])|[^]])*
$.`,$.>`

Experimente online! Explicação:

L

Gere uma lista a partir dos resultados da correspondência.

$

Use a seguinte substituição para gerar a lista em vez das correspondências.

v`

Permita que as correspondências se sobreponham.

\[((\[)|(?<-2>])|[^]])*

Esta é uma aplicação dos grupos de balanceamento do .NET. O [é correspondido literalmente, e o máximo de caracteres possível é consumido. À medida que cada subseqüente [é correspondida, a correspondência é adicionada à $2pilha. Se essa pilha não estiver vazia, podemos corresponder a ], removendo a correspondência da pilha. Caso contrário, podemos corresponder a qualquer coisa que não seja um ](o que [já foi correspondido anteriormente). O jogo pára quando atende a correspondência ]para o [, uma vez que a $2pilha é (agora) esvaziar naquele ponto.

$.`,$.>`

A substituição consiste em duas variáveis ​​separadas por vírgula. O .indica que o comprimento da variável, em vez de seu valor, deve ser usado. A >indica que a variável deve ser avaliada em termos do separador da mão direita ao invés do jogo. A $`variável refere-se ao prefixo da correspondência, o que significa $.`indica a posição do [; o >modificador altera isso para o prefixo do separador direito da partida, que fornece a posição da correspondência ].


2

Geléia ,  22 21 20  19 bytes

Sem dúvida, é possível no Jelly pela metade dessa contagem de bytes: p ...

n€Ø[ḅ-µMịÄÐƤi€0ĖƊ’Ä

Um link monádico que aceita uma lista de caracteres que retorna uma lista de listas de números inteiros.
Como um programa completo, ele aceita uma string e imprime uma representação da referida lista.

Experimente online!

Quão?

n€Ø[ḅ-µMịÄÐƤi€0ĖƊ’Ä - Link: list of characters    e.g. "[f[o]o!]"
  Ø[                - list of characters = ['[', ']']
n€                  - not equal? for €ach              [[0,1],[1,1],[0,1],[1,1],[1,0],[1,1],[1,1],[1,0]]
                    -     ...relating to the characters:  [     f     [     o     ]     o     !     ]
    ḅ-              - convert from base -1             [1,0,1,0,-1,0,0,-1]
                    -     ...i.e.: 1 where '['; -1 where ']'; and 0 elsewhere
      µ             - start a new monadic chain with that as the argument, say V
                Ɗ   - last 3 links as a monad (function of V):
          ÐƤ        -   for post-fixes:
         Ä          -     cumulative sum               [[1,1,2,2,1,1,1,0],[0,1,1,0,0,0,-1],[1,1,0,0,0,-1],[0,-1,-1,-1,-2],[-1,-1,-1,-2],[0,0,-1],[0,-1],-1]
            i€0     -   1st index of 0 in €ach (or 0)  [8,1,3,1,0,1,1,0]
               Ė    -   enumerate                      [[1,8],[2,1],[3,3],[4,1],[5,0],[6,1],[7,1],[8,0]]
       M            - maximal indices of V             [1,3]
        ị           - index into                       [[1,8],[3,3]]
                 ’  - decrement                        [[0,7],[2,2]]
                  Ä - cumulative sum (vectorises)      [[0,7],[2,4]]

Eu estava tentando usar œ¿e é parentes, mas não consegui encontrar uma solução. Este foi o mais perto que eu cheguei.
dylnan

Sim, pode ser mais curto, mas só consegui um byte desprezível , e não metade dos bytes. Ainda parece muito tempo. :(
Erik the Outgolfer,

@EriktheOutgolfer também foi fácil salvar 1 byte aqui #
Jonathan Allan

2

SWI-Prolog 254 bytes

d([']'|T],I,[S|Z],M,R):-J is I+1,d(T,J,Z,[',','(',S,',',I,')'|M],R).
d(['['|T],I,S,M,R):-J is I+1,d(T,J,[I|S],M,R).
d([_|T],I,S,M,R):-J is I+1,d(T,J,S,M,R).
d(_,_,_,R,R).
m(X):-atom_chars(X,A),d(A,0,[],[']'],[_|R]),atomic_list_concat(['['|R],S),print(S).

Exemplo:

?- m('!^45sdfd[hello world[[djfut]%%357]sr[jf]s][srtdg][]').
'[(49,50),(42,48),(8,41),(36,39),(20,33),(21,27)]'
true 

1

C (gcc) , 87 bytes

f(char*Z){for(char*z=Z,*q=z;*z;*z++-93||printf("%d,%d;",*--q,z-1-Z))*z-91||(*q++=z-Z);}

Experimente online!

Explicação

Para acompanhar os índices de sequência do colchete de abertura, a sequência de entrada é substituída e usada como uma pilha.

f(char*Z){          // take mutable input string
 for(char*z=Z,*q=z; // copy pointer to current string index, current stack index
 *z;                // loop through the entire string
 *z++-93||          // if z == ']'
   printf("%d,%d;", // decrement stack pointer,
    *--q,z-1-Z))    //  write bracket pair position
  *z-91||           // if z == '['
   (*q++=z-Z);}     // write bracket position onto stack, increment stack pointer

Experimente online!



1

Japt v1.4.5, 23 bytes

;Ë¥']?ApENo):D¥'[©NpE
A

Experimente online!

Descompactado e como funciona

;UmDE{D==']?ApENo):D=='[&&NpE
A

;                              Use alternative set of initial variables
                               A = [] is used here
 UmDE{                         Map over each char of input string...
      D==']?                     If the char is closing bracket...
            ApENo)                 Push the current index and N.pop() to A
                  :D=='[&&       Otherwise, if the char is opening bracket...
                          NpE      Push the current index to N

A     Output A

A saída é uma matriz achatada de [closing index, opening index]. Se a ordem inversa não for desejada, a adição wno final faz o trabalho (+1 bytes).


1

Lisp comum, 95 bytes

(lambda(u &aux s)(dotimes(p(length u))(case(elt u p)(#\[(push p s))(#\](print`(,(pop s),p))))))
Versão longa
(defun par (string &aux stack)
  (dotimes (pos (length string))
    (case (char string pos)
      (#\[ (push pos stack))
      (#\] (print (list (pop stack) pos))))))
Testes
((lambda(u &aux s)(dotimes(p(length u))(case(elt u p)(#\[(push p s))(#\](print`(,(pop s),p))))))
 "!^45sdfd[hello world[[djfut]%%357]sr[jf]s][srtdg][] ")

impressões:

(21 27) 
(20 33) 
(36 39) 
(8 41) 
(42 48) 
(49 50)

1

K (ngn / k) , 38 37 bytes

{b@0N 2#,/=(|':+\-/a)b:&|/a:"[]"=\:x}

Experimente online!

{ } função com argumento x

"[]"=\:xduas listas booleanas para as ocorrências de "["e"]"

a: atribuir a a

|/ booleano "ou" das duas listas

& onde (em que índices) estão os colchetes?

b: atribuir a b

-/uma lista com 1 para "[", -1 para "]"e 0 em qualquer outro lugar

+\ somas parciais

|': máximos em pares (cada elemento maximizado com o anterior, o elemento inicial permanece o mesmo)

Isso representa a profundidade do colchete para cada caractere. Nós o indexamos com b(justaposição é indexação) e obtemos profundidade de colchete apenas para os colchetes.

= "agrupar por" - um dicionário mapeando as profundidades para os índices nos quais elas ocorrem

,/ concatenar os valores no dicionário, ignorando as chaves

0N 2# remodelar para uma matriz de 2 colunas (lista de listas)

b@índice bcom cada elemento da matriz


1

Geléia , 20 18 bytes

Economizei 1 byte graças a @ user202729 informando que µ€é)

ẹⱮØ[µ³ḣċþØ[_/Ụị)Z’

Experimente online!

Depois de lutar com isso por várias horas apenas para fazê-lo funcionar ... Estou sinceramente surpreso que tenha ficado tão curto assim :-)

Explicação

ẹⱮØ[µ³ḣċþØ[_/Ụị)Z’   Main link. Argument: s (string)  '[a[b]c[]][d]'
  Ø[                 Shortcut for the string "[]".
 Ɱ                   For each char in the "[]":
ẹ                      Find the indices of each occurrence in the input.
                     For our example, this gives the array [[1, 3, 7, 10], [5, 8, 9, 12]].

    µ                Begin a new monadic chain, with said array as its argument.
               )     For each of the two sub-arrays q within the array:
                         [[1, 3, 7, 10], [5, 8, 9, 12]]
     ³ḣ                For each item n in q, take the first n chars of the input.
                         [['[',     '[a[',      '[a[b]c[',   '[a[b]c[]]['],
                          ['[a[b]', '[a[b]c[]', '[a[b]c[]]', '[a[b]c[]][d]']]
        þØ[            For each string s in this, and each char c in "[]":
       ċ                 Count the occurrences of c in s.
                         [[[1, 0],  [2, 0],     [3, 1],      [4, 3]],
                          [[2, 1],  [3, 2],     [3, 3],      [4, 4]]]
           _/          Reduce each pair by subtraction. This is the number of open brackets
                         at each position.
                         [[1, 2, 2, 1], [1, 1, 0, 0]]
             U         Sort the indices by their values, using position as a tiebreaker.
                         [[1, 4, 2, 3], [3, 4, 1, 2]]
              ị        Index these values back into q.
                         [[1, 10, 3, 7], [9, 12, 5, 8]]

               )     Start a new monadic chain with the result as its argument.
                Z    Zip; transpose rows and columns.
                         [[1, 9], [10, 12], [3, 5], [7, 8]]
                 ’   Decrement; switch to 0-indexing.
                         [[0, 8], [9, 11], [2, 4], [6, 7]]

1

CJam , 25 bytes

0q{"[]"#"_ \p_p "S/=~)}/;

Surpreendentemente competitivo - perde apenas para Japt e Jelly [ Edit : and Charcoal and Stax :(]

Experimente online!

Explicação

0                          Push 0.
 q                         Push the input.
  {                   }/   For each character in the input:
   "[]"#                     Find index of this character in the string "[]" (or -1 if not found).
                   =         Use this index to choose
        "       "S/            one of the following snippets
                    ~          and execute it:
         _                       If it was 0 ('['), duplicate the number on the stack.
           \p_p                  If it was 1 (']'), print the current number and the one under it.
                                 If it was -1, do nothing.
                     )       Increment the number on top of the stack.
                        ;  Delete the number.


0

Pitão ,  28  26 bytes

{I#.e,t+lhfSI/LT`Y+._>Qk\]

Suíte de teste.

No momento, é mais longo do que a abordagem de Mnemonic , mas eu sinto que posso jogar um pouco mais e isso felizmente também não usa estruturas imperativas em Python V. A versão inicial tinha 36 bytes e também possuía vários bugs.

Como funciona

{I # .e, t + lhfSI / LT`Y + ._> Qk \] - Programa completo. Pega uma string citada Q de STDIN.
   .e - mapa enumerado. k = índice de iteração, b = elemento atual.
                     > Qk - Obtenha os elementos de Q em índices maiores que k.
                   ._ - Gera todos os prefixos disso.
                  + \] - E acrescente um "]" (para lidar com alguns casos extremos).
          f - Filtre esta lista, com T = elemento atual.
              L `Y - Para cada caractere em str ([])," [] "...
             / T - ... Conte as ocorrências em T.
           SI - E verifique se os valores estão classificados cada vez mais.
         h - cabeça. Recupere o primeiro elemento.
       + l - Obtenha o comprimento deste + k.
      t - Decremento (em 1).
     , - E emparelhe esse valor com k. Retorna [i, k] onde eu estou
                             o índice do correspondente] ek é o de [.
  # - Filtre esta lista por:
{I - O par é invariável ao deduplicar.

{I#.e,t+lhfSI/LT`Y._>Q aaalmost funciona para 22 bytes ...
Mr. Xcoder

0

Perl 5, 53 bytes

say"$-[0] ".($+[0]-1)while s/\[[^][]*\]/1x length$&/e

Correr como perl -nE '<above code snippet>' . Toma entrada através de stdin.

Como sempre, a solução Perl ideal para o problema é uma expressão regular. Tentamos corresponder a qualquer par de colchetes que não contenha nenhum par usando uma classe de caracteres um tanto boba ( s/\[[^][]*\]/.../). Se a correspondência for bem-sucedida, substituímos o texto correspondente pelo dígito 1repetidas vezes para não coincidir acidentalmente com esses colchetes e imprimimos os índices da correspondência. Enxague e repita.


0

Stax , 13 bytes

é√p(l▓1½\á²ë(

Execute e depure

Ele usa a pilha de entrada para rastrear pares de chaves abertas. Aqui está o programa descompactado, não destruído e comentado.

F       iterate over input characters
 .][I   get the index of the character in the string "[]", or -1
 ^|cv   skip the rest of this iteration if index was -1
 i~     push the current iteration index to the input stack
 C      skip the rest of this iteration if index was 0
 \      form a pair with the top two items from the input stack
 JP     join with space, and print

Execute este


0

Carvão , 20 bytes

FLθ≡§θι[⊞υι]«I⊟υ,Iι⸿

Experimente online! Link é a versão detalhada do código. Explicação:

FLθ

Loop sobre o intervalo implícito do comprimento da sequência de entrada.

≡§θι

Ligue o caractere atual.

[⊞υι

Se for um [, envie o índice atual para a variável de matriz predefinida.

]«I⊟υ,Iι⸿

Se for um ], pop o índice mais recente da variável da matriz e imprima-o e o índice atual separado por vírgula e inicie uma nova linha. Formatos de saída alternativos, se aceitáveis, economizariam alguns bytes: ]I⟦⊟υιωeconomiza 2 bytes, mas imprime cada índice em uma linha separada, espaçando duas vezes os pares de índices; ]I⟦⊟υιsimplesmente imprime os índices em linhas separadas, dificultando sua distinção.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.