Golf Algoritması Eşleşen Parantezler


25

Bir dize verilecektir s. İpin eşit ve en az bir [s ve ]s'ye sahip olması garanti edilir . Ayrıca braketlerin dengeli olması garanti edilir. Dize başka karakterlere de sahip olabilir.

Amaç, her birinin indeksini [ve ]çiftini içeren listeler listesini veya listelerin bir çıktısını almak / iade etmektir .

not: Dize sıfır dizinli.

Örnek: !^45sdfd[hello world[[djfut]%%357]sr[jf]s][srtdg][]Dönmeli

[(8, 41), (20, 33), (21, 27), (36, 39), (42, 48), (49, 50)]veya buna eşdeğer bir şey. Tular gerekli değil. Listeler de kullanılabilir.

Test durumları:

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

Bu , bu nedenle her programlama dili için bayt cinsinden en kısa kod kazanır.


1
Çıktı sırası önemli mi?
Wastl

1
hayır, değil.
Yel Değirmeni Çerezleri

21
"not: Dize sıfır dizinli." - Uygulamaların, bu tür zorluklarda tutarlı bir endeksleme seçmesine izin vermek çok yaygındır (ancak elbette, size bağlıdır)
Jonathan Allan,

1
Bir karakter dizisi olarak girdi alabilir miyiz?
Shaggy

7
Bir bayt maliyeti ...
dylnan

Yanıtlar:


13

Brain-Flak Classic , 108 bayt

{((((((([][][]){}){}){}()){}){}{}[])()()){{}<>{}(<>)}{}((){[](<{}>)}{}){{}<>[({}<[{}]>)](<>)}{}<>(({}()))<>}

Çevrimiçi deneyin!

Her açıklığı [doğru yığında saklar ve bir çarptığımızda çıktı verir ].



5

JavaScript, 69 62 bayt

Trende hızlıca golf oynayabilirsin. Muhtemelen geliştirilebilir.

Girdileri karakter dizisi olarak alır ve tuşları [s'nin indeksleri ve değerleri de karşılık gelen ]s indeksleri olan bir nesne çıkarır .

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

Çevrimiçi deneyin


Cep telefonunda golf oynamak aklımı başımdan alıyor. : P
Oliver

2
@Oliver, ben dokunmatik ekranlarda (hemen hemen) tipi olabilir fikrimi darbeler hiç klavyeler geri getirmek -!
Shaggy

4

Haskell , 92 79 bayt

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

Çevrimiçi deneyin!

açıklama

g3 argüman alan bir fonksiyon yaratıyoruz .

  • atüm eşleşmemiş konumların bulunduğu [s.

  • n, işlenen karakter sayısıdır

  • x işlenmemiş karakterler.

İlk karakter ise ]biz kaldırmak uön kızımız gelen ave karşılığında (u,n)artı başka ne kalır.

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

İlk karakterimiz değilse ], o ya [da başka bir şeyse, artar nve [n|s=='[']önüne ekleriz a. [n|s=='[']olacak [n]eğer s=='['ve []aksi.

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

Karakterlerin dışındaysak, boş listeye döneriz.

g[]_[]=[]

1
vay, işte bu özyinelemeli fonksiyonların güzel bir parçası. Haskell'da acemiyim, bu beni çok etkiledi :)
Windmill Cookies

@ gnu-kimse Teşekkürler! Bu cevap muhtemelen en uygun değildir, bu yüzden sizi denemeyi ve yenmeyi ya da ciddi Haskell golfçüler gelene kadar beklemenizi öneririm.
Buğday Sihirbazı,

Ciddi Haskell golfçüler gelene kadar beklerim
Windmill Cookies

4

Java 10, 95 bayt

Giriş dizesini int[]Unicode kod noktalarından biri olarak alan bir boş lambda .

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

Çevrimiçi Deneyin

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

Teşekkür

  • Giriş dizesini yığın olarak kullanma fikri için Jonathan Frech'e teşekkürler ( burada )

Sen tanımlamanız gerekir rve wdeğil parametre olarak, kod parçası olarak: s->{int r=0,w=0;...}.
Olivier Grégoire

@ OlivierGrégoire Bir tür belirsiz, ancak bu , birden fazla boş girişi kapsayacak şekilde tasarlandı.
Jakob

1
Alıntı verdiğiniz cevap açık bir şekilde "Boş bir parametre alma iznimiz var, bunun yerine hiçbir yerde kullanmayacağız mı?" Sorusunu yanıtlıyor . Bu girdileri kullanıyorsunuz. Burada hiçbir belirsizlik görmüyorum.
Olivier Grégoire

Sorunun düzenleme kısmı, "kullanım dışı" değişkeni konusunda kesinlikle kesindir.
Olivier Grégoire

Doğru, peki neden üst cevap (1) girişlerin kullanılmadığını belirtmiyor, (2) fazladan girişlerin değerinin ne olduğunu belirtiyor ve (3) fazladan girişleri kullanma olasılığını belirtiyor? Ne olursa olsun, değişkenleri taşıyacağım.
Jakob

4

vim, 89 bayt

: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

Açıklamalı

: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.

Çevrimiçi deneyin!


4

QBasic (QB64), 137 127 112 bayt

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

Dört iki bayta ihtiyacımız var çünkü zorluk 0-indexing gerektiriyor. İlk QBasic yayınım, geri bildiriminiz takdir edildi.

  • Steenbergh sayesinde 10 bayt
  • Outgolfer Erik sayesinde 3 bayt
  • Unix dosya biçiminde ( \r\n-> \n) kaydederek 12 bayt

Yürütüldüğünde şöyle gözüküyor:

How it looks


Güzel bir. İşaretçiler çift: kullanım ?yerine print(derleyici bu otomatik genişler print) kullanarak, alıntılanan dizeler arasında boşluk gerekmez THENiçinde IFs ve bırakın isonra NEXT.
steenbergh

Huh @steenbergh, ben boşluğu kaldırmak için unuttum görünüyor ... ama aralarında bir tane kaldırıldı 0ve to? Kafam karıştı ...
israf 19

1
Emin değilim qb64 hakkında, ama sanırım if c$="["olabilir if"["=c$, elseif c$="]"olabilir elseif"]"=c$, end ifolabilir endif, ve, çıkışta hafif değişiklikle, ?b(n),iolabilir ?b(n)i(QBasic 1.1 Ben, senin durumun farklı olabilir kullanmak budur).
Outgolfer Erik

@EriktheOutgolfer hepsini ama ?b(n)i çalıştı
israf

3

Pyth, 26 bayt

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

Burada dene

açıklama

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.

Güzel! Saf yaklaşımım 36 byte idi C,x"[" MQ #.e*qb\[t+lhfSI/LT"[]"._>Q. Düzenleme: Ben de biraz golf oynamak başardı, şimdi 30 yaşın altındayım.
Bay Xcoder

3

R , 141 133 115 112 108 bayt

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

Çevrimiçi deneyin!

Özel birşey yok. 1 indeksli, çünkü öyle dedim. R Başlangıçta kullanılan böylece gerçekten, yığınlar yok c, headve tailaynı edebi etkiyi elde etmek. Ungolfed orjinal sürümü ( utf8ToIntbazı baytları kaldırmak için, vektörün başlangıcını yığının tepesi olarak kullanan Tve Fistifleri başlatmaktan kaçınmak ve kötüye kullanmak gibi güncellemeler .):

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


ve 1:nchar(y)daha kısa seq_along(x). Çok güzel bir çözüm btw :)
JayCe

Acaba gregexprgidilecek yol bu mu?
ngm

Başlangıçta bu yaklaşımdan yararlanmaya çalıştım ama bunun doğru yol olup olmadığından emin değilim.
JayCe

JayCe çözümü hatalı (sonucu kontrol et, 22 28 22yerine döner 22 28 21) muhtemelen T / F kullanımı gerçekten güvenli değildir: D. Bu daha kısa ve çalışıyor gibi görünüyor -> Çevrimiçi deneyin!
digEmAll

2

İleri (gforth) , 75 bayt

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

Çevrimiçi deneyin!

Kayan nokta yığınını kötüye kullanır, ancak do loop çünkü kod geri dönüş yığınına (el ile) dokunmaz.

açıklama

  1. Dize karakterleri arasında döngü
  2. Her karakteri kontrol et
    1. Eğer eşitse [ , kayan nokta yığın koymak
    2. ]kayan nokta kümesinden pop'a eşit ve geçerli konumdaki çıktı

Kod Açıklaması

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 bayt

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

Çevrimiçi deneyin! Açıklama:

L

Maç sonuçlarından bir liste oluşturun.

$

Eşleşmeler yerine listeyi oluşturmak için aşağıdaki değişikliği kullanın.

v`

Eşleşmelerin örtüşmesine izin ver.

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

Bu, .NET'in dengeleme gruplarının bir uygulamasıdır. [Anlamıyla eşleştirilir, mümkün olduğunca çok sayıda karakter tüketilir sonra da. Takip eden her bir [eşleşme eşleştiğinde, eşleştirme $2yığına eklenir . Bu yığın boş değilse ], eşleşmeyi yığından kaldırarak a eşleştirebiliriz. Aksi takdirde, var bir şey eşleşebilir değil ]( [zaten daha önce eşleşmiş oldu). Bu eşleştirme karşıladığında maç durur ]için [, çünkü $2yığın (şimdi) bu noktada boş.

$.`,$.>`

Sübvansiyon virgülle ayrılmış iki değişkenden oluşur. .Değişken uzunlukta, daha doğrusu onun değerinden kullanılabilir olduğunu gösterir. >Değişken sağ ayırıcı ziyade maçın açısından değerlendirilmelidir belirtir. $`Değişken aracı maç, önek belirtir $.`konumunu verir [; >eşleştirme konumunu verir eşlemenin doğru ayırıcı, ön ekine değiştirici değiştirir bu ].


2

Jelly ,  22 21 20  19 bayt

Hiç şüphe yok ki Jelly'te bu bayt sayısının yarısında mümkündür: p ...

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

Bir tamsayı listelerinin listesini döndüren bir karakter listesini kabul eden bir monadik bağlantı.
Tam bir program olarak bir dizgiyi kabul eder ve bahsedilen listenin bir temsilini basar.

Çevrimiçi deneyin!

Nasıl?

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

Kullanmaya çalışıyordum œ¿ve akrabaları, ancak bir çözüm bulamadı. Bu yaklaştığım en yakın şeydi.
dylnan

Evet, daha kısa olabilir, ancak baytların yarısını değil, yalnızca bir ölçü baytı yönetebildim . Hala çok uzun geliyor. :(
Outgolfer Erik

@EriktheOutgolfer burada da kolay bir 1-baytlık tasarruf sağladı
Jonathan Allan

2

SWI-Prolog 254 bayt

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

Örnek:

?- 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 bayt

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

Çevrimiçi deneyin!

açıklama

Açma braketinin dizgi indekslerini takip etmek için giriş dizgisinin üzerine yazılır ve yığın olarak kullanılır.

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

Çevrimiçi deneyin!


1

Jöle , 20 bayt

=©ⱮØ[_/aÄ$+®ŻĠḊẎ_2s2

Çevrimiçi deneyin!

Kayıt üzerinde yan etkisi var, umarım bir işlev görmesine izin verir.


Yeniden kullanılabilir, bu yüzden iyi olduğunu düşünüyorum. BF cevapları genellikle kaseti boş bırakmaz
dylnan

1

Japt v1.4.5, 23 bayt

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

Çevrimiçi deneyin!

Ambalajsız ve Nasıl Çalışır?

;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

Çıktı, düzleştirilmiş bir dizidir [closing index, opening index]. Tersine verilen sipariş istenmiyorsa, wsonunda ekleme işi yapar (+1 bayt).


1

Ortak Lisp, 95 bayt

(lambda(u &aux s)(dotimes(p(length u))(case(elt u p)(#\[(push p s))(#\](print`(,(pop s),p))))))
Uzun versiyon
(defun par (string &aux stack)
  (dotimes (pos (length string))
    (case (char string pos)
      (#\[ (push pos stack))
      (#\] (print (list (pop stack) pos))))))
Testler
((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][] ")

baskılar:

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

1

K (ngn / k) , 38 37 bayt

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

Çevrimiçi deneyin!

{ } argümanlı fonksiyon x

"[]"=\:xgeçtiği yerleri iki boolean listeleri "["ve"]"

a: atamak a

|/ iki listenin "veya" booleanı

& parantez nerede (hangi endekslerde)?

b: atamak b

-/her yerde 1 "[", -1 "]"ve 0 olan bir liste.

+\ kısmi miktarlar

|': çiftli maxima (her bir öğe bir öncekiyle en fazla değere sahipse, ilk öğe aynı kalır)

Bu, her karakter için dirsek derinliğini temsil eder. Biz onu bindeksleriz (yan yana dizini indeksleriz) ve sadece parantez için parantez derinliği elde ederiz.

= "grupla" - oluştukları endeksleri derinleyen bir sözlük

,/ Anahtarları yok sayarak, sözlükteki değerleri birleştirmek

0N 2# 2 sütunlu bir matriste yeniden şekillendirme (listeler listesi)

b@bmatrisin her elemanı ile indeks


1

Jöle , 20 18 bayt

@ User202729 1 bayt sayesinde Kaydedilen bildiren µ€bir)

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

Çevrimiçi deneyin!

Çalışması için birkaç saat boyunca bununla güreştikten sonra ... Dürüst olmak gerekirse, bu kadar kısa sürdüğü için şaşırdım :-)

açıklama

ẹⱮØ[µ³ḣċþØ[_/Ụị)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 bayt

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

Şaşırtıcı derecede rekabetçi - sadece Japt ve Jelly'e kaybeder [ Düzenle : ve Kömür ve Stax :(]

Çevrimiçi deneyin!

açıklama

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

Pyth ,  28  26 bayt

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

Test odası.

Şu an Mnemonic'in yaklaşımından daha uzun , ama bunu biraz daha golf oynayabileceğimi hissediyorum ve bu neyse ki Pythonically-zorunlu yapılarını kullanmıyorV . İlk sürüm 36 bayttır ve ayrıca birçok hataya sahiptir.

Nasıl çalışır

{I # .e, t + lhfSI / LT`Y + ._> Qk \] - Tam program. STDIN'den alıntı bir Q dizesini alır.
   .e - Numaralandırılmış harita. k = yineleme indeksi, b = geçerli eleman.
                     > Qk - Q öğelerini k'den büyük dizinlerde al.
                   ._ - Bunun öneklerini oluşturur.
                  + \] - Ve bir "]" ekleyin (bazı kenar durumları ele almak için).
          f - Bu listeye filtre uygulayın, T = akım elemanı ile.
              L `Y - str ([])," [] "içindeki her karakter için ...
             / T - ... T'deki oluşumlarını say.
           SI - Değerlerin artan şekilde sıralanıp sıralanmadığını kontrol edin.
         h - Baş. İlk elemanı al.
       + l - Bu + k uzunluğunu al.
      t - Azalış (1'e kadar).
     , - Ve bu değeri k ile eşleştirin. İ'nin olduğu yerde [i, k] döndürür
                             karşılık gelen] ve k'nin dizini [.
  # - Bu listeye göre filtrele:
{I - Parite tekilleştirme konusunda değişmez.

{I#.e,t+lhfSI/LT`Y._>Q aaalmost 22 bayt için çalışıyor ...
Bay

0

Perl 5, 53 bayt

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

Olarak çalıştır perl -nE '<above code snippet>'. Stdin ile girdi alır.

Her zamanki gibi, soruna en uygun Perl çözümü düzenli bir ifadedir. Aptal görünümlü bir karakter sınıfı ( s/\[[^][]*\]/.../) kullanarak içinde hiçbir çift içermeyen herhangi bir parantez çifti eşleştirmeye çalışırız . Eşleşme başarılı olursa, eşleşen metni 1yanlışlıkla tekrar eşleştirmememiz için tekrar tekrar rakamla değiştiririz ve eşleşmenin dizinlerini yazdırırız. Durulayın ve tekrarlayın.


0

Stax , 13 bayt

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

Koş ve hata ayıkla

Açık küme parantez çiftlerini izlemek için giriş yığınını kullanır. İşte program, paketlenmemiş, bağlanmamış ve yorumlanmış.

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

Bunu çalıştır


0

Kömür , 20 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

FLθ

Giriş dizesinin uzunluğunun örtülü aralığı üzerinde döngü.

≡§θι

Mevcut karakteri aç.

[⊞υι

Eğer öyleyse [, geçerli dizini önceden tanımlanmış dizi değişkenine itin.

]«I⊟υ,Iι⸿

Eğer öyleyse ], dizi değişkeninden en son dizini açın ve yazdırın ve mevcut dizini virgülle ayırarak yeni bir satır başlatın. Alternatif çıktı biçimleri kabul edilebilirse bazı baytları ]I⟦⊟υιωkaydeder : 2 bayt kaydeder, ancak her dizini ayrı bir satıra basar; ]I⟦⊟υιdizinleri ayrı satırlara basar ve ayırt etmeyi zorlaştırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.