Boşluğu Çöz


25

Boşluk listesi, hiçbir düzeyde liste dışı nesne içeren bir listedir. Veya özyinelemeli bir tanım tercih ederseniz

  • Boş liste geçersiz

  • Yalnızca diğer geçersiz listeleri içeren bir liste geçersiz

Tüm boşluk listelerinin sınırlı bir derinliği var.

İşte bazı geçersiz liste örnekleri (python sözdizimini kullanarak):

[]
[[]]
[[],[]]
[[[]]]
[[[]],[]]
[[],[[]]]

İşte geçersiz listeler olmayan bazı örnekler :

["a"]
[[...]]
[1]
2
[[],([],[])]

Görev

İki ayrı işlev yazın (veya isterseniz programları). Biri argüman olarak pozitif bir tamsayı almalıdır (dilerseniz sıfırı da dahil edebilirsiniz) ve bir boşluk listesini döndürür, diğerinin bir boşluk listesini alması ve bir tamsayı döndürmesi gerekir. Bu iki işlev her zaman birbirlerinin tersi olmalıdır. Bu, çıktısını fiçine geçirirseniz , sonucunun gasıl girdisini almanız gerekir . Bu, eşlemenin 1: 1 olması gerektiği anlamına gelir, yani her tamsayı için , bu tamsayıyı veren yalnızca bir boşluk listesi olabilir ve her boş liste için, tam olarak o boş liste veren bir tamsayı olmalıdır .fggf

Aslında bir Bijection yaratıyorsunuz

Dillerin yerel liste türünün yerine boşluk listesinin (virgül ve boşluk olmadan veya olmadan) dize olarak gösterilmesini seçebilirsiniz.

puanlama

Puanınız iki fonksiyonun uzunluğu ile birlikte olacaktır. Bu olduğundan, bu toplamı en aza indirmeyi hedeflemelisiniz.



1
Bu soru iki fonksiyon isterken, kopya sadece ilk yarı için sorar.
Ian Miller

3
Sıçanlar. Neredeyse henüz yazdığım en iyi cevabı yayınladım ve bu diğer zorluk için uygun değil.
Caleb Kleveter

2
@IanMiller Ben diğer meydan okuma o kodlama için farklı kurallar olduğunu söylemek istiyorum.
Caleb Kleveter

1
Belki de bu sorunun sadece kod çözücü olması daha mantıklı olur mu? Çünkü kodlayıcı hakkında zaten bir soru var.

Yanıtlar:


7

Pyth, 27 + 29 = 56 bayt

f:

L?bol`NS{sm[d+d]Y]d)ytb]Y@y

Test odası

g:

L?bol`NS{sm[d+d]Y]d)ytb]Yxyl`

Test odası

Sistem çok basittir: Belli bir sayıdan fazla olmayan tüm olası listeleri oluşturuyorum [. Sonra onları, henüz oluşturmadığım listelerin sonuna yakın olacak şekilde sıralıyorum. Bu, her yiki programda da aynı şekilde işlevle yapılır . Olarak yazılmıştır

L?bol`NS{sm[d+d]Y]d)ytb]Y

Ardından, bu listeye indeksler fve onu ararım g.

Oluşturduğum liste sayısı, sonsuz sıralanmış listedeki istenen konumda veya öncesinde görünebilecek tüm olası listeleri oluşturduğum kadar büyük olacak şekilde seçildi.

Programlar seçenek olarak 0 verir / verir.


5

Python 2 , 96 bayt

Çevrimiçi deneyin! bijection'u test etmek için.

f=lambda l:len(l)and f(l[0])*2+1<<f(l[1:])

Negatif olmayan tamsayıların geçersiz listelerini alır. 42 bayt.

g=lambda n:n*[g]and[g(n/(n&-n)/2)]+g(len(bin(n&-n))-3)

Listeleri geçersiz kılmak için negatif olmayan tamsayılar alır. 54 bayt. Daha özyinelemeli bir girişim aynı uzunluğu verdi.

g=lambda n,i=0:n*[g]and[g(n/2,i+1),[g(n/2)]+g(i)][n%2]

1

Java 7, 725 bayt

f(int)( 325 bayt ):

String f(int i){String s="";for(int j=0,e=0;e<i;e+=v(s))s=Integer.toBinaryString(j++);return"["+s.replace("1","[").replace("0","]")+"]";}int v(String s){for(;!s.isEmpty();s=s.replaceFirst("1","").replaceFirst("0",""))if(s.replace("1","").length()!=s.replace("0","").length()|s.charAt(0)<49|s.endsWith("1"))return 0;return 1;}

g(String)( 75 + 325 bayt ):

int g(String s){int r=0;for(String i="10";!i.equals(s);i=f(++r));return r;}

Yöntem g, fsonucunu hesaplamak için, girilene eşit olanı buluncaya kadar olası boşluk listesinin üzerinden geçerek sonucunu kullandığı için, bayt fiki kez sayılır (çünkü her iki yöntemin de bu zorluk için diğeri olmadan çalışabilmesi gerekir).

Açıklama:

Genel olarak, yöntem fsadece tamsayıların tüm ikili String gösterimleri üzerinde döngü yapar ve geçerli bir sayı bulunduğunda bir sayacı artırır. Bu zorluk için geçerli binary-Strings aşağıdaki kurallara uyar: a ile başlar ve a 1ile biter 0; eşit sayıda 1 ve 0'a sahiptirler; ve ilk çıkardığınızda 1ve 0tekrar kalanları doğruladığınızda, bu iki kural yine de geçerlidir. Sayaç girişi eşittir sonra, tüm değiştirerek, bir dize boşluk-listeye bu ikili-String dönüştürür 1ile [ve tüm 0ile ].

Yönteme gelince g: "[]"(boşluk listesini temsil eden 0) ile başlıyoruz ve daha sonra fbir tamsayıyı arttırırken, giriş-Stringiyle eşleşene kadar yöntemi kullanmaya devam ediyoruz.

String f(int i){         // Method `f` with integer parameter and String return-type
  String s="";           //  Start with an empty String
  for(int j=0,e=0;e<i;   //  Loop as long as `e` does not equal the input
      e+=v(s))           //    And append increase integer `e` if String `s` is valid
    s=Integer.toBinaryString(j++);
                         //   Change `s` to the next byte-String of integer `j`
                         //  End of loop (implicit / single-line body)
  return"["+             //  Return the result String encapsulated in "[" and "]"
    s.replace("1","[").replace("0","]")+"]";
                         //  after we've replaced all 1s with "[" and all 0s with "]"
}                        // End of method `f`

int v(String s){         // Separate method with String parameter and integer return-type
  for(;!s.isEmpty();     //  Loop as long as String `s` isn't empty
      s=s.replaceFirst("1","").replaceFirst("0",""))
                         //    After each iteration: Remove the first "1" and "0"
    if(s.replace("1","").length()!=s.replace("0","").length()
                         //   If there isn't an equal amount of 1s and 0s
       |s.charAt(0)<49   //   or the String doesn't start with a 1
       |s.endsWith("1")) //   or the String doesn't end with a 0
      return 0;          //    Return 0 (String is not valid)
                         //  End of loop (implicit / single-line body)
  return 1;              //  Return 1 (String is valid)
}                        // End of separate method

int g(String s){         // Method `g` with String parameter and integer return-type
  int r=0;               // Result integer
  for(String i="[]";!i.equals(s);
                         //  Loop as long as `i` does not equal the input String
      i=f(++r));         //   After each iteration: Set `i` to the next String in line
  return r;              //  Return the result integer
}                        // End of method `g`

Örnek giriş ve çıkış durumları:

Burada dene. (NOT: Son birkaç test durumu için oldukça yavaş. Hepsi için 10-15 saniye sürecek.)

0   <-> []
1   <-> [[]]
2   <-> [[][]]
3   <-> [[[]]]
4   <-> [[][][]]
5   <-> [[][[]]]
6   <-> [[[]][]]
7   <-> [[[][]]]
8   <-> [[[[]]]]
9   <-> [[][][][]]
10  <-> [[][][[]]]
11  <-> [[][[]][]]
12  <-> [[][[][]]]
13  <-> [[][[[]]]]
14  <-> [[[]][][]]
50  <-> [[[][[[]]]]]
383 <-> [[[][]][[[][]]]]

1
Bunun [][]bir liste olduğunu sanmıyorum . Belki de Java’nın ne şekilde yaptığını yanlış anlıyorum. [...]Bunların etrafına ekleme []ve hile yapmak için 0 harita olması.
Buğday Sihirbazı

@WheatWizard Ah, iyi görüşme. Bunu düzeltmeye çalışacağım. Zaten yeterince bayt yoktu. P
Kevin Cruijssen

@WheatWizard Tamam, şimdi düzeltilmesi gerekiyor. Sert ama eğlenceli bir meydan okuma btw. Ne demek istediğinizi anlamadan biraz zaman aldı ve bu cevabı yazmak daha da uzun sürdü, ama eğlenceliydi. :)
Kevin Cruijssen



0

Python 3 - işaret / abs, 73 bayt

f=lambda n:[[[]]*(n<0),[[]]*abs(n)]
g=lambda l:[-1,1][not l[0]]*len(l[1])

Çevrimiçi deneyin!

Düz ileri uygulama, negatif sayıları destekler.

Tamsayı ikodlanmış [sign(i), abs(i)], burada sign(i)=[] if i > 0 else [[]]ve abs(i)=[[]] * i, yani uzunluğu abs (i) olan boş listelerin bir listesi.

Python 3 - ikili, 126 bayt

Bu, mutlak değerin ikili liste sunumunda kodlandığı daha ayrıntılı bir versiyondur (ve çok daha uzun ...).

f=lambda n:[[[]]*(n<0),[[[]]*int(i)for i in f"{n:+b}"[1:]]]
g=lambda l:[-1,1][not l[0]]*int(''.join(map(str,map(len,l[1]))),2)

Çevrimiçi deneyin!


1
Daha karmaşık geçersiz listeler için çalışmıyor: Çevrimiçi deneyin!
Jitse

Ah, her nasılsa özlüyorum, her geçersiz liste için bir eşleme olması gerektiğini ... haklısın.
movatica

0

Stax , 33 toplam bayt

Bu programlar birbirlerinin tersidir. Tüm boşluk listelerine ve negatif olmayan tam sayılara dönüşüyorlar. Bu, 0 içeriyor. Bu, belki de bilmediğim bir tür cebirden ünlü bir fonksiyon gibi görünüyor. Başımı etrafına sarmak için önce programları python'da işlevler olarak uyguladım.

def convert_to_void(n):
    lst = []
    while n > 0:
        n -= 1
        choices = len(lst) + 1
        choice = n % choices
        cutpoint = len(lst) - choice
        n //= choices
        newgroup = lst[cutpoint:]
        del lst[cutpoint:]
        lst.append(newgroup)
    return lst

def convert_from_void(lst):
    n = 0
    while lst != []:
        newgroup = lst.pop()
        n *= len(lst) + len(newgroup) + 1
        n += len(newgroup) + 1
        lst.extend(newgroup)
    return n

Stax programları aynı davranışa sahiptir.

Negatif olmayan tam sayı → Boş liste, 15 bayt

ƒâ₧~└3BI─¿-rÅ;ì

Koş ve hata ayıkla

Geçersiz liste → Negatif olmayan tam sayı, 18 bayt

Çäê[!σ`c↑Ö§░NR╥ç=Æ

Koş ve hata ayıkla

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.