Bir diziyi otomatik olarak test etme


12

Herkes yuvalanmış listeleri sever! Bununla birlikte, bazen iç içe bir liste yapmak zordur. Daha derine yerleştirmek isteyip istemediğinize veya daha sığ yerleştirmeniz gerekip gerekmediğine karar vermelisiniz. Yani meydan okuma için bir liste "Autonest" gerekir. Bir listeyi otomatik olarak test etmek için listedeki her bir öğe çiftini karşılaştırın.

  • İkinci öğe daha küçükse, aralarına kapatma ve açma köşebentleri ekleyerek iki öğeyi ayırın, şöyle:

      } {
    {2 , 1}
    

    Örneğin, {2, 1}olur {2}, {1}ve {3, 2, 1}olur{3}, {2}, {1}

  • İkinci öğe aynıysa, hiçbir şeyi değiştirmeyin. Örneğin {1, 1, 1}, aynı kalır ve {2, 1, 1, 1}olur {2}, {1, 1, 1}.

  • İkinci öğe daha büyükse, aşağıdaki her öğeyi bir seviye daha derine yuvalayın. Örneğin, {1, 2}olur {1, {2}}ve {1, 2, 3}olur{1, {2, {3}}}

Meydan okuma

Bir sayı listesi alan ve otonestleştirildikten sonra aynı listeyi döndüren bir program veya işlev yazmalısınız. Bu girdiyi dilinizin yerel liste biçiminde (veya en yakın alternatif olarak) veya dize olarak alın. Örneklerimde yaptığım gibi kıvırcık parantez kullanmak zorunda değilsiniz. Tutarlı olduğu sürece, dilinizde en doğal olan parantez türlerini kullanabilirsiniz. Listenin yalnızca tamsayı içereceğini varsayabilirsiniz. Ayrıca listenin içinde en az 2 sayı olduğunu varsayabilirsiniz. İşte bazı örnek IO:

{1, 3, 2}                         -->   {1, {3}, {2}}
{1, 2, 3, 4, 5, 6}                -->   {1, {2, {3, {4, {5, {6}}}}}}
{6, 5, 4, 3, 2, 1}                -->   {6}, {5}, {4}, {3}, {2}, {1}
{7, 3, 3, 2, 6, 4}                -->   {7}, {3, 3}, {2, {6}, {4}}
{7, 3, 1, -8, 4, 8, 2, -9, 2, 8}  -->   {7}, {3}, {1}, {-8, {4, {8}, {2}, {-9, {2, {8}}}}}

Standart boşluklar uygulanır ve bayt cinsinden en kısa cevap kazanır!


2
Girişi dilimizin dize biçiminde alabilir miyiz?
Downgoat

Tamsayının maksimum boyutu nedir?
thepiercingarrow

@thepiercingarrow Çok fazla umursamıyorum. Saçma bir şey olmayacak. En azından idare edebilmelisin [-100, 100]ama devasa girdiler vermeyi düşünmüyorum.
James

"İkinci öğe küçükse, o zaman yuva bütün bir kapanış parantezi ekleyerek, bir seviye daha yüksek elemanlar aşağıdaki. Sonra bir açılış parantez insert, emin tüm braketleri eşleşti kalmak yapmak için. Örneğin, {2, 1}olur {2}, {1}" Nasıl olduğunu bir seviye daha yüksek ? Bir seviye daha yüksek olurdu {2}, 1. Sahip olduğunuz şey aynı seviyede.
msh210

@ msh210 Evet, bu kötü bir açıklamaydı. Mevcut kelime öbeği daha mı iyi?
James

Yanıtlar:


1

MATL , 48 43 bayt

YY_XKx"@K<?93]44@K-?91]@XKV]v93Gd0>sQY"h4L)

Bu, giriş ve çıkışta köşeli parantez kullanır. Çıktıda ayırıcı olarak boşluk içermeyen virgüller vardır.

Çıktının MATL'de iç içe bir liste olarak yorumlanmayacağını unutmayın. Diğer dillerde olurdu ve meydan okumadaki çıktı özelliklerini karşılar.

Çevrimiçi deneyin!

açıklama

YY_XKx   % Push -inf. Copy to clipboard K (represents previous input entry). Delete
"        % Take numerical array implicitly. For each entry:
  @K<    %   Is current entry less than the previous one?
  ?93]   %   If so, push 93 (ASCII for ']')
  44     %   Push 44 (ASCII for comma)
  @K-    %   Is current entry different from the previous one?
  ?91]   %   If so, push 91 (ASCII for '[')
  @XKV   %   Push current entry, copy into clipboard K, convert to string
]        % End for each
v        % Concat vertically all stack contents, converting to char
93       % Push 93 (ASCII for ']') (to be repeated the appropriate number of times)
Gd0>sQ   % Determine how many times the input increases, plus 1
Y"       % Repeat 93 that many times
h        % Concat horizontally with previous string. Gives a row array, i.e. string
4L)      % Remove first char, which is an unwanted comma. Display implicitly

3

Haskell, 96 bayt

a#b|a<b=",{"|a>b="},{"|1<2=","
f(a:b:c)=show a++a#b++f(b:c)++['}'|a<b]
f[x]=show x++"}"
('{':).f

Kullanım örneği: ('{':).f $ [7,3,3,2,6,4]-> "{7},{3,3},{2,{6},{4}}".

Haskell'de iç içe listeler olmadığından, sonucu bir dize olarak döndürürüm. Yuvalama algoritması kolaydır: a) baskı numarası, b) sonraki sayı daha büyükse (daha az, eşit), yazdır ,{( },{, ,), c) listenin geri kalanıyla yinelemeli çağrı yapın, d) }sayı diğerinden daha az, e) her şeyi {ve içine alın }.


Üzgünüm, yanlış
sayıyorum

3

Python 3, 98 bayt

p,*i=eval(input())
c=[p]
a=b=[c]
for x in i:
 if x>p:b=c
 if x!=p:c=[];b+=[c]
 c+=[x];p=x
print(a)

Misal:

$ python3 autonest.py <<< "[7, 3, 1, -8, 4, 8, 2, -9, 2, 8]"
[[7], [3], [1], [-8, [4, [8], [2], [-9, [2, [8]]]]]]

2

Java 8 197 187 193 192 bayt


Bu canavarlıkla benimle birlikte çalışan tüm yorumculara teşekkürler. Pahalı bir hata bulana kadar 187 bayt aşağı golf. Ancak Black Magic'in gücü nedeniyle "operatör" -> "e gider, bayt sayısı sağlıklı 192 bayttadır.


String a(int[]b){int l=b.length,d=1,i=0;String c="{";for(;i<l-1;i++)if(b[i]>b[i+1])c+=b[i]+"},{";else if(b[i]<b[i+1]){d++;c+=b[i]+",{";}else c+=b[i]+",";c+=b[l-1];while(d-->0)c+="}";return c;}

Maalesef @Blue'da geliyor
Rohan Jhunjhunwala

Ayrıca, birkaç ipucu: 1. Girdiyi sıra yerine bir dizi olarak alabilirsiniz: (int [] b) 2. Virgül (int l = b.length, d = 1, ı) = 0. 3. Mümkün olduğunca beyaz boşlukları kaldırmalısınız (örneğin, değişken atamalar arasında). Bu yardımcı olur umarım!
Mavi

Merhaba, PPCG'ye hoş geldiniz! Parçacıklar, gönderimlere meydan okumak yerine tarayıcıda yürütülmesi amaçlanan javascript kodu içindir. Ayrıca, sonra bir boşluk unuttumlength,
Maltysen

Oh ok özür dilerim @Maltysen Ben tam bir java programa gömmek olacak. Ben sadece "döner" fonksiyon veya program "diyerek gidiyordu. Yani benim çıktı yazdırmak için bu refactor gerekir
Rohan Jhunjhunwala

1
@RohanJhunjhunwala üzgünüm, daha açık olmalıydı. "Snippet" dediğimde, kodunuz hakkında değil, biçimlendirmeniz hakkında konuşuyordum. Bir gönderiye kod koymaya çalışırken, "snippet" düğmesini tıklamayın, bunun yerine bir kod bloğuna (4 boşluk veya ctrl-k)
koyun

2

C 145 138 bayt

Giacomo'ya 7 bayt için teşekkürler!

#define P printf(
n;main(c,v,p,t)char**v;{p=-101;for(v++;*v;v++){t=atoi(*v);if(t<p)P"}{");if(t>p)P"{",n++);P"%d ",p=t);}for(;n--;)P"}");}

Girdi komut satırı argümanları aracılığıyla alınır ve çıktı stdout üzerinden verilir.

örnek çalışma:

$ ./autonest 7 3 1 -8 4 8 2 -9 2 8
{7 }{3 }{1 }{-8 {4 {8 }{2 }{-9 {2 {8 }}}}}

1
Sourcet=atoi(*v); yerine kullanmayı deneyinsscanf(*v,"%d",&t);
Giacomo Garabello

for(;*++v;)İlk 4'ü kaydetmek için kullanın ve daha sonra 10 tane daha if(t<p)P"}{");if(t>p)P"{",n++);kullanın t>p?P"}{"):P"{",n++);.
Giacomo Garabello

1

CJam, 51 49 48 46 bayt

Son parantez sayısının, dizide artan bitişik çift sayısından bir fazla olması gerçeğini açıklar.

Ve daha ewönce yeniden tanımlamak zorunda olduğum için operatörü bilmiyorum .

Girdi, köşeli parantezler ile ayrılmış boşlukla ayrılmış listedir.

'[q~_W=\2ew_{~\_@-g)["["S"]["]=}%@@{~>M']?}%']

açıklama

'[q~_W=\2ew_{~\_@-g)["["S"]["]=}%@@{~>M']?}%']
'[                                             e# Opening bracket
  q~                                           e# Read the input
    _W=\2ew                                    e# Save the last item and turn array into array of pair of next item and the item itself.
            _                                  e# We need two copies of that item                                       
             {~\_@-g)["["S"]["]=}%             e# Build the "body" that consist of the item and the suitable delimiter, space if equal, opening brace if the first item is the smallest, otherwise, closing bracket and opening bracket.
                                  @@           e# Put in the last item. (It was omitted in previous phase)
                                    {~<']""?}% e# Create the closing bracket as many as the number of increasing adjacent pair
                                               '] e# And one more bracket.

Bunu prettyprinting'e güvenmek yerine gerçek iç içe dizi ile nasıl yapacağımı öğreneceğim.

Son olarak, dövülmüş MATL'nin cevabı ile aynı seviyede .


Son olarak, MATL'nin cevabını yendi Şimdi değil :-P
Luis Mendo

@LuisMendo Ugh.
Akangka

1

Retina, 71 70 bayt

Listeler uzay kıvırcık parantez ile ayrılır: {1 2 3}. Negatif sayılar desteklenmez, bu nedenle bu bir sorun olursa cevabımı silerim. Retina + negatif sayılar = buna değmez.

\d+
$*
+`\b(1+) (1+\1\b.*)
$1 {$2}
+`\b(1(1+)1*) (\2)\b
$1} {$2
1+
$.0

Çevrimiçi deneyin


0

JavaScript (ES6), 73 bayt

a=>a.map(r=>l-r?(n=l<r?m:n).push(m=[l=r]):m.push(l),l=a[0],o=n=[m=[]])&&o

Açıklama: Birbirini izleyen eşit kalemler olması kolaydır; öğe sadece en içteki diziye eklenir (burada mdeğişken tarafından temsil edilir ; çıktı , son öğesi olarak niçeren dizidir ). Farklı öğeler için, öğe her zaman yeni bir en içteki diziye gider, tek fark bu dizinin bir kardeş mi yoksa önceki en içteki dizinin bir alt öğesi mi olmasıdır. Ekstra golf için, dizileri ilk öğe ardışık eşit öğe olarak sayacak şekilde ayarladım.mo

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.