Giải mã Void


25

Danh sách void là danh sách không có cấp nào chứa bất kỳ đối tượng không có trong danh sách. Hoặc nếu bạn thích một định nghĩa đệ quy

  • Danh sách trống là void

  • Một danh sách chỉ chứa các danh sách trống khác là void

Tất cả các danh sách void có độ sâu hữu hạn.

Dưới đây là một số ví dụ về danh sách void (sử dụng cú pháp python):

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

Dưới đây là một số ví dụ về những thứ không có danh sách trống:

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

Bài tập

Viết hai hàm riêng biệt (hoặc chương trình nếu bạn thích). Người ta phải lấy một số nguyên dương (bạn cũng có thể bao gồm 0 nếu bạn muốn) làm đối số và trả về một danh sách trống, cái còn lại sẽ lấy một danh sách trống và trả về cho nó một số nguyên. Hai chức năng này phải luôn luôn là nghịch đảo của nhau. Đó là nếu bạn vượt qua sản lượng fvào gbạn sẽ nhận được đầu vào gốc fnhư là kết quả của g. Điều này có nghĩa là ánh xạ phải là 1: 1, tức là với mỗi số nguyên, chỉ có thể tồn tại chính xác một danh sách khoảng trống gcung cấp số nguyên đó và cho mỗi danh sách khoảng trống sẽ có chính xác một số nguyên cho fdanh sách khoảng trống đó.

Về cơ bản, bạn đang tạo ra một bộ sưu tập

Bạn có thể chọn sử dụng biểu diễn chuỗi của danh sách trống (có hoặc không có dấu phẩy và dấu cách) thay vì loại danh sách gốc ngôn ngữ của bạn.

Chấm điểm

Điểm của bạn sẽ là độ dài của hai chức năng của bạn với nhau. Đây là vì vậy bạn nên cố gắng giảm thiểu số tiền này.



1
Câu hỏi này yêu cầu hai chức năng trong khi trùng lặp chỉ yêu cầu nửa đầu.
Ian Miller

3
Chuột Tôi gần như đã đăng câu trả lời hay nhất mà tôi đã viết và nó không đủ điều kiện cho thử thách khác.
Caleb Kleveter

2
@IanMiller Tôi muốn nói rằng thử thách kia có các hướng dẫn khác nhau để mã hóa thì cái này thì có.
Caleb Kleveter

1
Có lẽ nó sẽ có ý nghĩa hơn cho câu hỏi này chỉ là bộ giải mã? Bởi vì đã có một câu hỏi về bộ mã hóa.

Câu trả lời:


7

Pyth, 27 + 29 = 56 byte

f:

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

Bộ kiểm tra

g:

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

Bộ kiểm tra

Hệ thống này rất đơn giản: Tôi tạo ra tất cả các danh sách có thể có không quá một số lượng nhất định [. Sau đó, tôi sắp xếp chúng theo cách mà các danh sách tôi chưa tạo sẽ ở gần cuối. Tất cả điều này được thực hiện bởi chức năng y, giống hệt nhau trong cả hai chương trình. Nó được viết là

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

Sau đó, tôi lập chỉ mục vào danh sách này fvà tìm kiếm thông qua nó g.

Số lượng danh sách tôi tạo được chọn đủ lớn để tôi tạo tất cả các danh sách có thể xuất hiện tại hoặc trước vị trí mong muốn trong danh sách được sắp xếp vô hạn.

Các chương trình cho phép / trả về 0 dưới dạng tùy chọn.


5

Python 2 , 96 byte

Hãy thử trực tuyến! để kiểm tra các mệnh đề.

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

Đưa danh sách trống vào số nguyên không âm. 42 byte.

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

Đưa số nguyên không âm vào danh sách trống. 54 byte. Một nỗ lực đệ quy hơn cho cùng một chiều dài.

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

1

Java 7, 725 byte

f(int)( 325 byte ):

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 byte ):

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

Vì phương thức gsử dụng phương thức fđể tính toán kết quả của nó bằng cách lặp qua danh sách void có thể cho đến khi tìm thấy một giá trị bằng với một lần nhập, các byte fđược tính hai lần (vì cả hai phương thức đều có thể chạy mà không có phương thức khác cho thử thách này).

Giải trình:

Nói chung, phương thức fchỉ đơn giản là các vòng lặp trên tất cả các biểu diễn Chuỗi số nguyên của các số nguyên và tăng bộ đếm mỗi khi tìm thấy một số hợp lệ. Chuỗi nhị phân hợp lệ cho thử thách này tuân thủ các quy tắc sau: Chúng bắt đầu bằng a 1và kết thúc bằng a 0; chúng có số lượng bằng 1 và 0 bằng nhau; và mỗi khi bạn loại bỏ đầu tiên 10và xác nhận những gì còn lại một lần nữa, hai quy tắc này vẫn được áp dụng. Sau khi bộ đếm bằng đầu vào, nó chuyển đổi chuỗi nhị phân đó thành danh sách void String, bằng cách thay thế tất cả 1bằng [và tất cả 0bằng ].

Đối với phương thức g: Chúng tôi bắt đầu bằng "[]"(đại diện cho void-list 0), sau đó tiếp tục sử dụng phương thức ftrong khi tăng số nguyên, cho đến khi nó khớp với Chuỗi đầu vào.

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`

Ví dụ trường hợp đầu vào và đầu ra:

Hãy thử nó ở đây. (LƯU Ý: Nó khá chậm trong vài trường hợp thử nghiệm gần đây. Sẽ mất khoảng 10-15 giây cho tất cả các trường hợp đó.)

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

1
Tôi không nghĩ đó [][]là một danh sách. Có lẽ tôi đang hiểu nhầm cách Java làm bất cứ điều gì. Thêm [...]xung quanh tất cả chúng và có 0 bản đồ để []thực hiện thủ thuật.
Phù thủy lúa mì

@WheatWizard Ah, gọi tốt. Sẽ cố gắng khắc phục điều này. Tôi vẫn chưa có đủ byte. ; P
Kevin Cruijssen

@WheatWizard Ok, nó nên được sửa ngay bây giờ. Thử thách khó khăn nhưng thú vị btw. Phải mất một thời gian trước khi tôi hiểu ý của bạn, và thậm chí lâu hơn để viết câu trả lời này, nhưng nó rất vui. :)
Kevin Cruijssen



0

Python 3 - dấu / abs, 73 byte

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

Hãy thử trực tuyến!

Thực hiện thẳng về phía trước, hỗ trợ số âm.

Số nguyên iđược mã hóa [sign(i), abs(i)], trong đó sign(i)=[] if i > 0 else [[]]abs(i)=[[]] * i, tức là một danh sách các danh sách trống có độ dài abs (i).

Python 3 - nhị phân, 126 byte

Đây là một phiên bản phức tạp hơn (và dài hơn nhiều ...), trong đó giá trị tuyệt đối được mã hóa trong biểu diễn danh sách nhị phân.

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)

Hãy thử trực tuyến!


1
Không hoạt động cho các danh sách trống phức tạp hơn: Hãy thử trực tuyến!
Jitse

À, tôi bằng cách nào đó đã bỏ lỡ, rằng nên có một bản đồ cho mọi danh sách trống ... bạn đúng.
Movatica

0

Stax , tổng số 33 byte

Các chương trình này là nghịch đảo của nhau. Chúng chuyển đổi sang và từ tất cả các danh sách trống và tất cả các số nguyên không âm, do đó bao gồm 0. Đây có vẻ như đó có thể là một hàm nổi tiếng từ một số loại đại số mà tôi không biết. Để quấn đầu xung quanh nó, trước tiên tôi thực hiện các chương trình như các chức năng trong python.

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

Các chương trình stax có hành vi tương tự.

Số nguyên không âm → Danh sách trống, 15 byte

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

Chạy và gỡ lỗi nó

Danh sách trống → số nguyên không âm, 18 byte

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

Chạy và gỡ lỗi nó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.