Dấu ngoặc đơn rõ ràng cho các chuyến tàu APL


19

Trong APL, bạn có thể viết các hàm ngầm, được gọi là tàu hỏa . Làm thế nào họ làm việc là không liên quan cho thách thức này. Dưới đây là các cách khác nhau mà chúng có thể được nhóm lại, sử dụng làm hàm:

⍴      -> ⍴
⍴⍴     -> ⍴⍴
⍴⍴⍴    -> ⍴⍴⍴
⍴⍴⍴⍴   -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴  -> ⍴⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴⍴))
...

Thứ tự vẫn như cũ. Thủ tục là miễn là có đúng hơn 3 chức năng, 3 chức năng cuối cùng được nhóm thành một chức năng. Nếu chúng ta gặp một chuyến tàu lồng nhau, chúng ta sẽ ngoặc đơn trước, trước khi tiếp tục. Đây là thủ tục áp dụng cho ⍴⍴⍴⍴⍴⍴:

Step 0: ⍴⍴⍴⍴⍴⍴
There are strictly more than 3 functions, repeat.
Step 1: ⍴⍴⍴(⍴⍴⍴)
There are strictly more than 3 functions, repeat.
Step 2: ⍴(⍴⍴(⍴⍴⍴))
There are 3 or less functions, we're done.

Đây là quy trình tương tự được áp dụng cho ⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴:

Step 0: ⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
  Step 0: ⍴⍴⍴⍴(⍴⍴⍴)
  There are strictly more than 3 functions, repeat.
  We have met a nested train, applying procedure to that first:
    Step 0: ⍴⍴⍴
    There are 3 or less functions, we're done.
  Step 1: ⍴⍴(⍴⍴(⍴⍴⍴))
  There are 3 or less functions, we're done.
Step 1: ⍴⍴⍴(⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
  Step 0: ⍴⍴
  There are 3 or less functions, we're done.
Step 2: ⍴⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴))
There are strictly more than 3 functions, repeat.
Step 3: ⍴(⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)))
There are 3 functions or less, we're done.

Đầu vào

Đối với thử thách này, đầu vào sẽ được đơn giản hóa. Điều này có nghĩa là bạn có thể chọn 2 ký tự khác nhau để mở và đóng ngoặc đơn và 1 char cho các hàm, khác với các ký tự được chọn cho dấu ngoặc đơn. Các ký tự bạn chọn phải nhất quán. Đầu vào sẽ không trống và sẽ không chứa dấu ngoặc đơn không có nội dung (nghĩa là ()).

Đầu ra

Một lần nữa, bạn có thể chọn 3 ký tự khác nhau, 2 cho dấu ngoặc đơn và 1 cho các hàm. Lưu ý rằng chúng không cần giống như cái được chọn cho đầu vào, nhưng chúng phải nhất quán.

Quy tắc

  • Nếu có dấu ngoặc đơn chỉ bao gồm một hàm bên trong chúng trong đầu vào, bạn phải loại bỏ chúng trong đầu ra. Đầu ra của bạn có thể không chứa các dấu ngoặc đơn không cần thiết (nghĩa là chỉ bao gồm một hàm hoặc bao quanh toàn bộ đầu ra).
  • Bạn không cần phải thực hiện thuật toán được sử dụng ở đây, miễn là giải pháp của bạn hợp lệ cho thử thách này.
  • Đầu vào và đầu ra là các chuỗi theo định dạng được giải thích trong phần Đầu vào và Đầu ra. Đầu vào sẽ có ít nhất một ký tự.
  • Sử dụng các sơ hở tiêu chuẩn bị nghiêm cấm.
  • Đây là , vì vậy câu trả lời ngắn nhất sẽ thắng. Tuy nhiên, sẽ không có câu trả lời được chấp nhận, vì đây là cuộc thi theo từng ngôn ngữ và để khuyến khích trả lời bằng các ngôn ngữ trong đó nhiệm vụ này sẽ dẫn đến mã dài hơn so với mã được viết bằng các ngôn ngữ khác.

Các trường hợp thử nghiệm

Các ký tự được sử dụng ở đây là ()⍴, bạn nên thay thế chúng bằng các ký tự đã chọn.

⍴                          -> ⍴
⍴                          -> ⍴
⍴⍴                         -> ⍴⍴
⍴⍴⍴                        -> ⍴⍴⍴
⍴⍴⍴⍴                       -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴            -> ⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴⍴))))))
⍴⍴⍴⍴⍴(⍴⍴⍴)⍴⍴(⍴(⍴⍴⍴)⍴⍴⍴)⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴((⍴⍴⍴)⍴(⍴(⍴(⍴⍴⍴)(⍴⍴⍴))(⍴⍴⍴)))))
(⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)            -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
(⍴⍴⍴)(⍴⍴⍴)⍴⍴⍴              -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
⍴⍴(⍴)⍴⍴                    -> ⍴⍴(⍴⍴⍴)
((⍴⍴))                     -> ⍴⍴
⍴⍴((⍴⍴))⍴⍴                 -> ⍴⍴((⍴⍴)⍴⍴)

Thử thách này đã được đăng trong Sandbox. Nếu bạn có đặc quyền cần thiết, bạn có thể xem bài đăng hộp cát ở đây .


2
Tôi nghĩ đầy đủ là một tiêu đề tốt hơn rõ ràng .
Adám


@ Adám Tôi thực sự mong đợi câu trả lời tham khảo đó, tuy nhiên nó sẽ không nhận được nhiều
sự ủng hộ

@ Adám Phần rõ ràng trong tiêu đề đề cập đến thực tế là bạn phải loại bỏ dấu ngoặc đơn không cần thiết. Hoàn toàn là điều bạn phải làm khi bạn trả lời một thử thách; p
Erik the Outgolfer 11/12/17

Có đúng là chức năng này sẽ luôn luôn là idempotent?
Esolanging Fruit 12/12/17

Câu trả lời:


7

APL (Dyalog Classic) , 71 68 65 63 byte

0{⍵≡⍕⍵:⍵⋄⍬≡⍵:'⍬'1=≢⍵:⍺∇⊃⍵⋄3≥≢⍵:⍺⌽')(',⍣⍺∊1∇¨⍵⋄⍺∇¯3(↓,∘⊂1∇↑)⍵}⍎

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

Các nhân vật tôi đã chọn cho I / O là '(', ')', và '⍬'.

Giải pháp này tự nó là một tàu APL.

phân tích cú pháp đầu vào như thể đó là một mảng lồng nhau - một cây có các vectơ số trống ( ) dưới dạng lá.

Dfn (tức là lambda - { }) đi ngang qua cây theo cách đệ quy và chuyển đổi nó thành một chuỗi được ngoặc đơn đúng. Đối số bên trái kiểm soát xem có nên thêm dấu ngoặc đơn vào mức hiện tại hay không nếu cần.

Dfn xử lý các trường hợp sau dựa trên đối số đúng:

  • nếu nó đã là một chuỗi ( ⍵≡⍕⍵), hãy trả lại nó

  • nếu nó , trả lại char'⍬'

  • nếu đó là một singleton, chỉ cần đào sâu hơn ( là biểu tượng cho một cuộc gọi đệ quy)

  • nếu chiều dài của nó là ≤3, hãy lặp lại cho từng vật phẩm và bao quanh ()nếu cần thiết

  • mặt khác, lặp lại cho 3 đuôi, trả trước tất cả trừ 3 đuôi và lặp lại lần nữa


Trông giống như 63 ký tự, hầu hết là Unicode. Mã hóa ký tự nào tạo ra 63 byte cho điều này? Tôi làm cho nó 141 byte trong UTF8.
Corey



@ Adám Cảm ơn vì điều đó. Tôi đã tìm nhưng không biết phải tìm gì để có câu trả lời đó.
Corey

3

Python 2 , 224 208 204 byte

-16 byte nhờ ông Xcoder -4 byte nhờ vào ovs

r=str.replace
p='p'
def c(l):
 while len(l)>3:l=l[:-3]+(l[-3:],)
 return l and map(c,l)or l
print r(r(r(r(r(`c(eval(r(r(r(input(),'(p)',p),p,'[],'),')','),')))`,'[]',p),*'[('),*'])'),' ',''),',','')[1:-1]

Hãy thử trực tuyến! hoặc Thử tất cả các trường hợp thử nghiệm

Mã có thể được chia thành 3 bước chính:
Chuyển đổi đầu vào thành một danh sách lồng nhau và thay thế (p)->p. Các chức năng duy nhất psẽ được thay thế bằng một danh sách trống.

eval(r(r(r(input(),'(p)',p),p,'[],'),')','),'))

Hàm đệ quy để áp dụng quy tắc "3 hoặc ít hơn" trong danh sách hiện tại và tự gọi nó trên tất cả các danh sách phụ.

def c(l):
 while len(l)>3:l=l[:-3]+(l[-3:],)
 return l and map(c,l)or l

Rất nhiều thay thế để định dạng sang định dạng đầu ra mong muốn

r(r(r(r(r(`c(...)`,'[]',p),*'[('),*'])'),' ',''),',','')[1:-1]


1
Điều này không đơn giản hóa ((pp))(hoặc p((pp))p).
Martin Ender

2

CJam , 56 byte

Đánh bại APL!

lW%~]]]{{_,{K_,({~}|}&}%{_,3>}{3/(aa\+:~}w}:K~~`1>W<W%S/

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

Điều này hoạt động (tôi nghĩ) và tôi không biết tại sao ...

Các ký tự đầu vào là ][Tcho ()⍴và các ký tự đầu ra là ][0cho ()⍴(vâng, điều này có nghĩa là chúng được đảo ngược với những gì bạn mong đợi; ví dụ: bạn có thể chuyển vàoTTT]TT[T]TTTT]TTT[[TT ).

Tổng quan cấp cao

Chương trình hoạt động với đầu vào ngược, vì nó thuận tiện hơn. Để phân tích cú pháp đầu vào, chúng tôi tận dụng trình phân tích cú pháp của CJam - đảo ngược và thực thi đầu vào cung cấp dạng phân tích cú pháp ngược (ngược) của đầu vào.

Sau đó chúng tôi xác định một thủ tục K. Kthực hiện hầu hết các công việc cho trình của chúng tôi và nó hoạt động như sau:

  • Mảng đầu vào sẽ là sự pha trộn của các số 0 và các mảng con không trống. Xác định các mảng con và áp dụng đệ quy Kcho chúng. Kết quả phải là một mảng khác và nếu mảng này chỉ bao gồm một phần tử duy nhất, hãy giải nén nó (điều này sẽ loại bỏ các dấu ngoặc thừa).
  • Miễn là kết quả có nhiều hơn ba yếu tố, hãy nhóm ba yếu tố đầu tiên (không phải ba yếu tố cuối cùng của nó; nhớ lại rằng đầu vào đang được xử lý ngược) vào một danh sách.
  • Trả lại kết quả.

Bằng cách áp dụng Kcho đầu vào, chúng ta có được hình thức được ngoặc đơn của đầu vào (điều duy nhất cần lưu ý là chúng ta thực sự bọc đầu vào trong một danh sách đơn và mở ra sau đó; lý do là vì chúng ta muốn đoạn trích giải nén các singletons để áp dụng cho chương trình cấp cao nhất, và không chỉ các mảng con của nó). Sau đó, chúng tôi chỉ cần áp dụng một số định dạng tối thiểu để có được kết quả của chúng tôi.

Một số lời giải thích cho các bit golf

Môn golf mà tôi tự hào nhất là sử dụng ,để thực hiện kiểm tra giữa các số nguyên và mảng.

  • Nếu ngăn xếp trên cùng là số nguyên n , ,tạo phạm vi [0..n) . Vì số nguyên duy nhất chúng ta sẽ gặp là 0, điều này luôn cung cấp cho chúng ta danh sách trống [], đó là falsey.
  • Nếu chồng trên cùng là một mảng, ,lấy chiều dài của nó. Vì tất cả các mảng chúng ta gặp sẽ không trống, điều này luôn mang lại cho chúng ta một số nguyên dương, đó là sự thật.

Một môn đánh gôn khác có thể được quan tâm là phương pháp tôi sử dụng để nhóm ba yếu tố đầu tiên của mảng; nó hơi giống với bài nộp "Turing hoàn thành trình thông dịch ngôn ngữ mã" . CJam không có cách ngắn để chia một mảng thành hai phần (bạn có thể cố gắng cắt phần đầu tiên và sau đó phần khác trong khi giữ mảng và chỉ mục ban đầu trên ngăn xếp, nhưng điều đó không hoạt động tốt) , vì vậy, những gì tôi làm thay vào đó là sử dụng 3/, nhóm một mảng thành các khối 3. Sau đó tôi có thể bật ra phần tử đầu tiên (, bọc trong mảng hai lần aa, sau đó nối lại vào đầu danh sách \+. Lý do chúng ta gói trong mảng hai lần là vì chúng ta phải loại bỏ một lớp :~, vì chúng ta cũng chỉ nhóm phần còn lại của mảng thành các phần.


Nitpick: điều này đánh bại APL mà không cần nội dung .
Erik the Outgolfer 12/12/17

@EriktheOutgolfer Đủ công bằng.
Esolanging Fruit 12/12/17

0

JavaScript (ES6), 149 146 byte

i='a';f=s=>s==(s=s[R='replace'](/\((\w+)\)/,(q,t)=>(f[q=i+=0]=f(t),q)))&&s==(s=s[R](/(?!^)((a0+|p){3})$/,"($1)"))?s[R](/a0+/g,t=>`(${f[t]})`):f(s)
<textarea cols=80 id=I>ppp(pp)p(pppp(ppp))pp</textarea><br>
<button onclick=O.innerText=f(I.value)>Run</button><br>
<pre id=O></pre>

Sử dụng ()p, mặc dù bạn sử dụng một chữ cái khác, bạn chỉ có thể thay đổi pvề cuối.

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.