Mẹo chơi gôn ở J


33

GolfScript có cách riêng của mình quá thường xuyên và tôi cảm thấy rằng một kho lưu trữ các gợi ý hữu ích cho việc chơi golf trong J có thể giúp đỡ trong cuộc chiến chống lại đế chế tà ác. Bạn có lời khuyên nào để làm cho ngôn ngữ vốn đã ngắn gọn này?

Đối với những người muốn học J, nơi rõ ràng để bắt đầu là trang web jsoftware và đặc biệt là từ vựng , hướng dẫn Learning J và hướng dẫn lập trình viên J for C.


1
Có một điều thú vị về việc đọc GolfScript gets its own way far too oftenvào năm 2019.
Chuỗi không liên quan

Câu trả lời:


14

Có một số sự tinh tế để vắt kiệt một vài ký tự cuối cùng trong J. Đối với phần sau, giả sử rằng mỗi chữ cái viết hoa là một động từ nguyên thủy (nghĩa là tôi đang loại bỏ các khoảng trắng sẽ được yêu cầu để phân định tên).

  • Khi bạn có một chuyến tàu đang đi, và bạn cần áp dụng một chức năng trên một phần khác, ([:FLGR)(LF@:GR)có cùng số lượng ký tự, nhưng (LF@GR)lưu một. Nếu khung của G lớn hơn hoặc bằng thứ hạng đơn nguyên của F, thì đây là một phép biến đổi hợp lệ. Đáng chú ý, tất cả các chuyến tàu có thứ hạng vô hạn, cũng như , ,. ,: ~. /: \: [ ]và hầu hết sử dụng #|..

  • Nếu bạn phải chọn các chuỗi trong danh sách và các chuỗi này không có khoảng trắng, hãy sử dụng >i{ab`cd`ef. Nó bẩn, nhưng nó lưu các ký tự cho mỗi chuỗi mới mà bạn phải xử lý, trừ khi bạn chỉ kéo các ký tự đơn và thậm chí sau đó, danh sách phải có độ dài 4 để ngắn hơn. Điều đang xảy ra là các tên không xác định được coi là các tham chiếu đến các động từ và khi bạn lấy các gerunds của các động từ đó, bạn sẽ nhận được một chuỗi tên của hộp. Bất kỳ tên nào đã được xác định là có danh từ loại, trạng từ hoặc kết hợp không thể được sử dụng theo cách này, bởi vì những tên đó được giải quyết trước đó `có thể có tại chúng.

  • Nếu bạn đủ may mắn để có một biểu thức để làm việc và không chỉ là một động từ ngầm, thì hầu như luôn luôn đáng để gán bất kỳ bit nào bạn sử dụng lại cho các biến, có thể là danh từ, động từ hoặc trạng từ. Các parens đôi khi sẽ tự trả lại bằng cách khớp ngay vào nơi bạn có không gian trước đó và hầu hết các định nghĩa như vậy đều đáng giá nếu chúng được sử dụng lại một lần nữa.

  • Các kết hợp như (FGH)^:(u`v`w)có thể được viết lại u`v`w(FGH^:). Điều này hoạt động cho bất kỳ chiều dài của tàu, thậm chí là 1, mặc dù bạn chỉ lưu bất cứ điều gì nếu thủ thuật này loại bỏ parens khỏi đối số đúng. Thủ thuật này chỉ hoạt động khi bạn tải trước toán hạng bên trái. (Bạn không biết chuyện gì vừa xảy ra phải không? Tra cứu 'trạng từ ngầm' và nghiên cứu phần Phân tích cú pháp và Thực thi của Từ điển J.)

  • Đừng sử dụng a.&i., sử dụng u:! {&a.3&u:tương đương về độ dài, tuy nhiên, và cái trước có thể hữu ích hơn trong một kết hợp (tùy thuộc vào kết hợp).

  • Những thứ như (2%~F)(F%2:)tương đương về chiều dài. Điều này rất hữu ích vì đôi khi, tùy thuộc vào phần còn lại của tàu bạn trông như thế nào, bạn có thể cấu trúc lại nó bằng các @thủ thuật như được viết ở điểm đầu tiên, để cứu một số nhân vật tuyệt vọng. (Và tất nhiên, nếu F]và tàu là một đơn nguyên, sử dụng %&2tiết kiệm char, duh.)

  • Các chuyến tàu giống như móc có ]hoặc [như động từ ngoài cùng bên trái, vd (]FGH).

    • ]cho phép bạn chia nhỏ một ứng dụng dyadic và chỉ sử dụng đúng đối số. (Hoán đổi sang trái với (]FGH)~, với hình phạt ít nhất 1 ký tự, có thể nhiều hơn.) Lưu một char hơn (FGH)@], và rất tiện dụng trong các gerunds!
    • [trong một hook được áp dụng một cách đơn điệu cho phép bạn làm một cái gì đó cho các tác dụng phụ ở phía bên phải, sau đó trả lại đối số. Sử dụng phổ biến nhất là với 1!:2, có thể với định dạng rác.
  • I / O hút. Tăng tốc quá trình bằng cách tạo ra các vòng lặp từ mọi thứ bạn có thể. 1!:1có thứ hạng 0, và cả hai đều 1!:2 3có thứ hạng _ 0, ví dụ, vì vậy hãy sử dụng điều này bằng cách tạo các mảng 1 và chạy 1!:1trực tiếp lên chúng. Lưu ý rằng ".cũng có thứ hạng 1, vì vậy bạn thường chỉ có thể đặt nó trực tiếp sau 1!:1đó, và không phải đính kèm thông qua @hoặc xếp hạng shenanigans.

  • Không dễ để tìm những nơi để đặt cái này, nhưng ::có thể hữu ích.

    • ::]^:_là một sự kết hợp đặc biệt mạnh mẽ, ví dụ, cho phép bạn làm điều gì đó nguy hiểm cho đến khi bạn không thể làm điều đó nữa. (Theo các thông báo ^:_-as-a-loop thông thường .)

    • Điều này cũng cho phép bạn sử dụng {trên các danh sách không có chỉ mục mong muốn, vì nó sẽ gây ra lỗi tên miền khi điều đó xảy ra. Hữu ích để lấy ví dụ chỉ đứng đầu danh sách nếu nó tồn tại (thử sử dụng ::]để trả về danh sách trống hoặc ::_1:trả về mã lỗi, v.v.).

  • ]`($:@u)@.vthường có thể được thực hiện ngắn hơn u^:v^:_, đặc biệt là về các định nghĩa uvcó thể được chơi xung quanh với. Một trường hợp tương tự giữ cho giống như có điều kiện u^:(1-v)so với ]`u@.v. Xem xét các lựa chọn của bạn, đặc biệt là khi bạn có rất nhiều động từ được đặt tên nổi. Nó cũng linh hoạt hơn một chút, nhưng hãy nhớ, nếu sử dụng $:, có một độ sâu đệ quy dễ bị va chạm. (Thông thường một cái gì đó như 1800 lần lặp?)


Các thủ thuật bất lợi là thực sự mát mẻ.
FUZxxl

"cứu một số nhân vật tuyệt vọng" Khi bạn đang học sáng, mọi thứ trông giống như một văn bia được chuyển! :)
Soham Chowdhury

1
"sử dụng %&2tiết kiệm một char, duh." -:tiết kiệm khác!
Lynn

11

Điều quan trọng nhất khi chơi golf trong J là không chỉ hiểu vấn đề, mà còn giảm vấn đề xuống một loạt các biến đổi mảng. Bạn cần hiểu cách suy nghĩ này để có bất kỳ thành công nào với mã J.

Ví dụ, một thách thức gần đây được yêu cầu để giải quyết vấn đề phân khúc lớn nhất . Thuật toán chứng khoán để giải quyết vấn đề này là thuật toán của Kadane có mô tả không chính thức sau:

Đi qua mảng và tại mỗi vị trí và tìm tổng của phân đoạn lớn nhất kết thúc ở đây, giá trị tối đa là 0 hoặc giá trị tại chỉ mục hiện tại cộng với tổng của phân đoạn lớn nhất kết thúc tại vị trí trước đó. Tính toán tối đa của các phân đoạn này khi bạn đi để tìm phân đoạn lớn nhất trong toàn bộ mảng.

Một bản dịch sang mã mệnh lệnh rất đơn giản:

  1. Đặt A là mảng đầu vào.
  2. hmi ← 0.
  3. nếu tôi ≥ len (A) trả về m .
  4. h ← tối đa (0, h + A [ i ]).
  5. m ← tối đa ( m , h ).
  6. ii + 1.
  7. goto 3.

Thuật toán này có vẻ phức tạp đối với J trong nháy mắt vì có một vòng lặp rõ ràng không giống như một sự giảm bớt lúc đầu. Nếu bạn nhận ra thuật toán đang làm gì, bạn có thể gỡ các bước riêng lẻ và thấy rằng nó thực sự thực hiện hai thao tác mảng đơn giản:

  1. Quét qua mảng để tính độ dài của các tập hợp con lớn nhất kết thúc tại mỗi chỉ mục.
  2. Giảm các độ dài này với hàm max để tìm cực đại.

Bây giờ hai bước này rất dễ thực hiện trong J. Đây là một bản dịch:

  1. (0 >. +)/\. y , 0- Bước này hoạt động từ đầu kia của mảng để phù hợp hơn với mô hình của J. 0 >. +là ngầm cho 0 >. x + y.
  2. >./ y

Kết hợp lại, chúng ta có một triển khai thuật toán rất ngắn gọn:

>./ (0 >. +)/\. y , 0

Nếu bạn học theo cách này để tiếp cận việc thực hiện các thuật toán, các giải pháp của bạn sẽ ngắn gọn như mã này.

Dưới đây là một số thủ thuật tôi tích lũy theo thời gian. Danh sách này sẽ được mở rộng khi tôi có thêm kiến ​​thức về J golfing.

  • Học từ điển. Nó chứa rất nhiều động từ thực sự tối nghĩa không có ý nghĩa gì cho đến khi bạn thấy chúng hữu ích như thế nào. Ví dụ, monadic =ban đầu rất lạ nhưng rất hữu ích trong các thử thách nghệ thuật ASCII.
  • Sử dụng dyadic &trong bối cảnh ngầm khi bạn muốn kết hợp sức mạnh. Các từ vựng gợi ý u@[&0như một sự thay thế ngầm 4 : 'u^:x yvà tôi cũng vậy.
  • Trong nhiều trường hợp, bạn có thể tránh một [:hoặc @:theo trình tự như u@vbằng cách chọn một biến thể ucó đối số trái. Ví dụ, để loại bỏ mục đầu tiên của kết quả v, hãy sử dụng 1}.vthay vì [:}.vnếu }.@vkhông thể vì một số lý do.
  • ] vthường ngắn hơn so với v@]nếu bạn muốn sử dụng monadic vtrong bối cảnh dyadic. Điều này có ích đặc biệt là khi vmột động từ dài.
  • Đôi khi bạn có thể viết m (n v w) ythay vì (n v m&w) y. Điều này có thể làm cho nó có thể tránh không gian và dấu ngoặc đơn.
  • #\thay vì >:@i.@#.
  • u &. vlà hữu ích khi vcó một mặt. Khi không, bạn có thể muốn sử dụng [: vinv u & vhoặc u & (v :. vinv)thay vào đó.
  • Hiểu thứ hạng và cách sử dụng nó. Cố gắng nghịch ngợm với sự kết hợp xếp hạng cho đến khi bạn nhận được một cái gì đó phù hợp. Nó giúp hiểu cách thứ hạng ảnh hưởng đến mã của bạn.
  • ^:_ là cực kỳ hữu ích cho các thuật toán mà bạn muốn đạt được sự hội tụ, như lấp đầy hoặc mô phỏng.
  • Biết thư viện tiêu chuẩn của bạn. Nó chứa các chức năng rất hữu ích giúp bạn tiết kiệm hàng tấn ký tự.
  • Các copulæ =.=:có thể được nhúng bất cứ nơi nào trong một cụm từ. Sử dụng công cụ này để tạo một lớp lót trong đó ký hiệu ngầm là không đủ.
  • Sử dụng đơn âm ,thay vì giảm nhiều khi giảm mảng đa chiều.
  • Hiểu những cụm từ được hỗ trợ bởi mã đặc biệt khi thử thách áp đặt các ranh giới thời gian chạy. Một số điều hữu ích hoạt động trong O ( n ) thay vì O ( n 2 ) theo trực giác.
  • Hộp rất hữu ích cho cây.

J có đủ thông minh để chạy giải pháp phân đoạn tối đa của bạn trong O (n) bằng cách lưu trữ các tính toán được sử dụng lại không, hoặc nó sẽ thực hiện điều đơn giản và chạy nó trong O (n ^ 2)?
Giô-na

@Jonah Tôi nghĩ rằng nó chạy trong thời gian bậc hai.
FUZxxl

10

Hãy cảnh giác với việc sử dụng các vòng lặp.

Trong khi J đã lặp cấu trúc ( for. do. end., while. do. end.và các biến thể), nếu bạn thấy mình sử dụng chúng có một khả năng rằng thuật toán của bạn không được khai thác thế mạnh chơi golf J và rằng có những tiết kiệm nhân vật được thực hiện.

^:sự kết hợp sức mạnh là bạn của bạn. Để thực hiện một động từ xlần:

verb^:x

Nếu bạn cần kết quả của mỗi lần lặp trong một danh sách:

verb^:(i.x)

Bạn cũng có thể sử dụng ^:để thực hiện một động từ có điều kiện:

  +:^:(3<])"0[ 1 2 3 4 5 6
1 2 3 8 10 12

Nhân đôi +:nếu ^:mục lớn hơn 3 3<]( "0thay đổi thứ hạng của động từ để nó hoạt động một mục tại một thời điểm).


Các giá trị đóng hộp hoạt động như (i.x)ví dụ, nghĩa f^:(<x)là tương đương với f^:(i.x).
FireFly

9

Đầu vào

1!:1[1 sẽ lấy một dòng đầu vào kết thúc bằng cách nhấn phím enter.

1!:1[3 sẽ lấy một số dòng đầu vào (được kết thúc bằng Ctrl-D trên máy Mac, Ctrl-C trên Windows).

Nếu bạn đang cố nhập số, sử dụng ".sẽ đánh giá chuỗi và trả về danh sách các số sẵn sàng để thao tác. Nếu bạn đang sử dụng một số nhưng cần thao tác trên các chữ số riêng lẻ ".,.(nhờ nhận xét của Jan Dvorak cho việc này) hoặc "."0sẽ chia chuỗi thành các chữ số riêng biệt:

   "."0[1!:1[1
12345
1 2 3 4 5

   ".,.1!:1[1
12345
1 2 3 4 5

Nếu bạn đang đọc theo chuỗi, cách ngắn nhất để có danh sách các chuỗi riêng biệt được đóng hộp là sử dụng ;:. Điều này hoạt động tốt nhất cho các chuỗi phân tách không gian:

   ;:1!:1[1
hello world
┌─────┬─────┐
│hello│world│
└─────┴─────┘

Vì tò mò, (tôi chỉ chơi với J một chút) điều gì sẽ 1!:1[2diễn ra như (nếu có gì)?
Gaffi

Từ những gì tôi có thể thu thập trên 1!:trang (Tôi không phải là chuyên gia J) 2 là màn hình, vì vậy, đầu vào từ màn hình không có nhiều ý nghĩa.
Gareth

Cảm ơn các liên kết. Từ đó, có vẻ như 2không hợp lệ? Tôi không có máy tính J bên mình để dùng thử vào lúc này. Nơi tôi nhìn thấy 2, ngay bên dưới các ghi chú về 1!:1, nó là dành cho 1!:2.
Gaffi

@Gaffi Số tập tin cho đầu vào và đầu ra dường như là tuần tự, vì vậy tôi đoán rằng các số đó là cố định và 2, 4 và 5 chỉ xuất hiện dưới đầu ra vì nó không có ý nghĩa gì để thử và nhập từ chúng. Tương tự đi ngược lại cho 1 và 3.
Gareth

".là hạng 1-xx và ,.luôn tạo ra một mảng 2D, ".,' ',.(khâu với khoảng trắng, ravel và đánh giá; 8 ký tự) có thể được thay thế bằng chỉ ".,.(các mục ravel và đánh giá; 4 ký tự).
John Dvorak

6

Sử dụng phép lặp để tính toán trình tự

Thông thường, giải quyết một thách thức trình tự OEIS sẽ yêu cầu sử dụng một trong các công thức được đưa ra trên trang của nó. Một số trong số này thích nghi tốt với J, và một số khác thì không nhiều. Các công thức đệ quy là đơn giản, tuy nhiên, việc lặp lại có thể không đơn giản. Một mẫu tôi đã bắt đầu sử dụng là

(s(]f)^:[~]) n
          ]  Gets n
 s           The first value in the sequence
         ~   Commute the argument order, n is LHS and s is RHS
        [    Gets n
      ^:     Nest n times with an initial argument s
  (]f)         Compute f s
             Returns (f^n) s

trong đó slà giá trị đầu tiên trong chuỗi, flà một động từ sẽ tính toán thuật ngữ tiếp theo cho thuật ngữ trước đó và nlà chỉ số dựa trên số không của thuật ngữ bạn muốn tính toán. Phương pháp này dựa trên thực tế là khi tính toán sức mạnh của một con đê, LHS bị ràng buộc với con đê để tạo thành một đơn nguyên mới, và đơn nguyên đó được lồng vào giá trị ban đầu. Các dyad được trao cho trạng từ sức mạnh là một cái móc trong đó (]f)được đưa ra chỉ số ntrên LHS và giá trị của một thuật ngữ trong chuỗi s. Móc sẽ được áp dụng ftrên smột đơn nguyên, và sau đó bỏ qua nđể trả lại kết quả của f s.

Thư viện chuẩn

Đôi khi, bạn có thể thấy rằng J sẽ có hỗ trợ cho một động từ trong thư viện chuẩn của nó . Ví dụ, hầu hết các hoạt động số nguyên bit được liên kết với các tên ngắn hơn so với sử dụng lệnh gọi nguyên thủy.

AND =: (17 b.) NB. it is actually '$:/ :(17 b.)'

Ngày và thời gian xây dựng cũng có sẵn.

Các dãy

Nếu bạn có một tập hợp các giá trị [a, b, c]và bạn muốn tạo một phạm vi dựa trên sản phẩm của họ như thế nào [0, 1, 2, ..., a*b*c-1], cách tiếp cận thông thường sẽ là tìm sản phẩm của họ và sau đó tạo thành một phạm vi có thể [:i.*/có giá 6 byte. Một cách ngắn hơn là ,@i.cho 4 byte vì i.có thể tạo thành các mảng nhiều chiều trong khi vẫn đang đếm và làm phẳng nó sẽ tạo ra một phạm vi tương đương.

In liên tục

Một cách ngầm để in một giá trị và tiếp tục sử dụng nó mà không có một vòng lặp rõ ràng là ([echo)cho một trường hợp đơn trị. echolà một động từ trong thư viện chuẩn in nội dung của nó sang stdoutcùng định dạng được sử dụng trong trình thông dịch. Hook sau đó chuyển cùng giá trị đầu vào ra bằng cách sử dụng [động từ bên trái .

10 chữ số cơ bản

Cách tiêu chuẩn để có được 10 chữ số cơ bản của một số nguyên là 10#.inv]chi phí 8 byte, quá nhiều! Một cách khác là chuyển đổi nó thành một chuỗi và phân tích nó ở cấp 0 "."0@":để tiết kiệm một byte, nhưng cách tốt hơn nữa là ,.&.":tiết kiệm một byte khác làm cho chi phí cuối cùng là 6 byte thay vì 8.


5

Xem xét sử dụng định nghĩa rõ ràng thay vì viết một động từ ngầm; chắc chắn 3 :''chi phí 5 byte, nhưng bạn có thể tiết kiệm rất nhiều @, @:[:theo cách đó.


5

Một số (khá) thủ thuật phổ biến tôi đã thấy

Tôi đang chia sẻ một vài điều có ích cho tôi. Về cơ bản tất cả những điều này là những lời khuyên tôi đã nhận được cho mình, nhưng tôi không có tín dụng cho hầu hết.

Tổng của một mảng một hạng

Thay vì sử +/@:(FGH)dụng (1#.FGH). Điều này có nghĩa là gỡ lỗi cho cơ sở 1, có nghĩa là tổng hợp một mảng. Mặc dù nó dài hơn +/, nhưng nó không yêu cầu nắp hoặc thành phần, điều này thường làm cho nó ngắn hơn nhiều so với sử dụng +/.

Đếm sự thật

Nếu bạn có một danh sách boolean và bạn muốn đếm số lượng sự thật kéo dài, hãy sử dụng #.~. Xem tại đây . Các câu trả lời APL cung cấp một lời giải thích tốt cho cách làm việc này. Cấp, điều này chỉ hữu ích cho tôi hai lần nhưng tôi nghĩ rằng dù sao tôi cũng chia sẻ nó.

Dưới (&.)

Không phải là một mẹo cụ thể, mà chỉ là một gợi ý chung: trạng từ &.-under thường dẫn đến các giải pháp ngắn gọn và quan trọng hơn. Hãy ghi nhớ điều đó khi bạn chơi gôn.

Thông thường, nó rất hữu ích cho các thách thức chuyển đổi và cơ sở khác, ví dụ mã này loại bỏ bit quan trọng nhất khỏi một số: }.&.#:(chuyển đổi sang danh sách các chữ số nhị phân, xóa chữ số đầu tiên, sau đó hoàn tác chuyển đổi sang danh sách các chữ số nhị phân và chuyển đổi trở lại số thập phân). Giải pháp đơn giản là hai byte nữa : #.@}.@#:.

Under cũng hữu ích cho những thách thức mà bạn cần phải làm việc với các chữ số thập phân, vì bạn có thể sử dụng u&.":. Ví dụ, những dặm đường ngắn cho chia cho chữ số thập phân sử dụng dưới: ,.&.":.

Một ví dụ cuối cùng là tìm độ lớn của một vectơ : +/&.:*:, lưu ý rằng bạn cần thu thập tất cả các kết quả từ *:-số với &.:-under vì *:-sapes là thứ hạng 0.


4

Những cách ngắn hơn để gây rối với hàng ngũ

Đôi khi, bạn sẽ có mã như <"0 i.3 3, nơi bạn muốn áp dụng một động từ vở cấp bậc r. Tuy nhiên, nếu bạn sử dụng một danh từ (như 0), bạn thường sẽ phải bao gồm một khoảng trắng. Để tránh điều này, bạn có thể sử dụng một động từ khác ucó thứ hạng tương đương và sử dụng u"vthay thế. Ví dụ, vì +có thứ hạng 0 0 0, chúng ta có thể sử dụng <"+thay vì <"0.

Dưới đây là bảng gồm tất cả các động từ và thứ hạng của chúng (có thể đạt được bằng cách sử dụng v b. 0):

0 0 0     > + * - % ^ | ! ? <. <: >. >: +. +: *. *: %: ^. j. o. q: r.
0 _ _     -. -: E. i: p:
1 0 1     p..
1 0 _     { A.
1 1 0     p.
1 1 1     #.
1 1 _     C.
1 _ _     ;: ". i. I.
2 _ 2     %.
_ 0 0     = < ~. ~: {: }: ?. L.
_ 1 0     #:
_ 1 _     $ # |. |: {. }. ": {::
_ _ _     , ; [ ] _: $. $: ,. ,: /: \: [: e. s: u: x: 0:

Để sử dụng bảng này, hãy tìm thứ hạng mong muốn rở phía bên tay trái, sau đó chọn một động từ thích hợp vtừ phía bên tay phải. Ví dụ, nếu tôi cần vector hóa một động từ vở độ sâu 2 _ 2, thì tôi tìm thứ hạng đó ở bên trái và chọn %.từ bên phải. Sau đó, tôi sử dụng v"%.thay vì v"2 _ 2.


3

strings thư viện: mẹo chơi golf

Thư viện chuỗi rất hữu ích để làm bất cứ điều gì với thao tác chuỗi. Chắc chắn, phải mất include'strings'(rất tốn kém, xem xét J), nhưng đôi khi bạn có thể gặt hái những lợi ích.

stringreplace

Tìm mình sử dụng chuỗi thay thế? Quan sát đó A stringreplace Blà giống như B rplc A.

Trong thực tế, đây là cách rplcthực hiện:

   rplc
 stringreplace~

cuts

Động từ cutscung cấp như vậy:

cắt y tại x (kết hợp)
chuỗi (động từ cắt n) văn bản
  n = _1 lên đến nhưng không bao gồm chuỗi
  n = 1 lên đến và bao gồm chuỗi
  n = _2 sau nhưng không bao gồm chuỗi
  n = 2 sau và bao gồm chuỗi

Vì vậy, nó thực sự cắt một chuỗi.


3

Lấy số từ 0 đến 4

Nếu có hạn chế sử dụng số trong mã của bạn:

0 %_ : một chia cho vô cùng.
1 #_ : có bao nhiêu vô số?
2 #_ _ : hai vô cực.
3 verb : có tích hợp sẵn.
4 dyad : tích hợp khác.

Lấy số từ 10 đến 35

Chữ vô nghĩa cơ sở: 11 : _bb, 26 : _bqv.v.


3

Lập trình ngầm

Khái niệm cơ bản

Động từ Dyadic

x (F G H) y == (x F y) G (x H y)
x (F G) y == x F (G y)
x ([: G H) y == G (x H y)  NB. G is called monadically

NB. Verbs are grouped from the right by units of 3.
NB. For the following, think like G, I, K are replaced by the results of (x G y) etc.
NB. and then the sentence is run as usual.
x (F G H I J K) y == x (F (G H (I J K))) y
                  == x F ((x G y) H ((x I y) J (x K y)))

NB. Using conjunctions for dyadic verb
x F@G y == F (x G y)  NB. Atop; Same as x ([: F G) y; Consider as golfing alternatives
x F&G y == (G x) F (G y)  NB. Compose; G is applied monadically to both arguments

Động từ đơn âm

(F G H) y == (F y) G (H y)
(G H) y == y G (H y)  NB. Note that this is different from APL
([: G H) y == G (H y)
(F G H I J K) y == (F (G H (I J K))) y
                == y F ((G y) H ((I y) J (K y)))
F@G y == F (G y)

Linh tinh

x&F y == x F y
F&y x == x F y
y F~ x == x F y
F~ y == y F y

Thủ thuật

(F x) G (H y)

Giải pháp ngầm : (G~F)~H; tùy thuộc vào các động từ thực tế, xem xét sắp xếp lại các đối số trái và phải để loại bỏ ~.

x ((G~F)~H) y
x (G~F)~ (H y)
(H y) (G~F) x
(H y) G~ (F x)
(F x) G (H y)

Thay thế Monadic-Dyadic

>:y == 1+y
<:y == 1-~y or _1+y
+:y == 2*y
-.y == 1-y
-:y == 2%~y
*:y == 2^~y
#.y == 2#.y
#.inv y == 2#.inv y  NB. #: doesn't work this way
{.y == 0{y
{:y == _1{y
}.y == 1}.y
+/y == 1#.y

1
(G~F)~Hlà lòng tốt bong bóng tinh khiết!
Giô-na

2

& là bạn của bạn, sử dụng nó một cách khôn ngoan

vlà một động từ, nlà một danh từ xylần lượt là các đối số trái và phải.

Monad &: Giới thiệu ~bên trong trạng từ / chuỗi kết hợp

Một trạng từ / chuỗi kết hợp đánh giá từ bên trái. Vì vậy, một cái gì đó như _2&+/\&.>sẽ không hoạt động bởi vì nó phân tích cú pháp như (_2&+)/\&.>trong khi chúng ta muốn _2&(+/\)&.>. Trong trường hợp này, hoán đổi bên trái / bên phải +/\có thể lưu một byte, vì trong trường hợp +/\~&_2&.>này phân tích cú pháp như ((+/\)~)&_2&.>. Để xem tại sao điều này hoạt động:

+/\~&_2 y
is equivalent to
y +/\~ _2
is equivalent to
_2 +/\ y
is equivalent to
_2&(+/\) y

Dyad &: Lặp lại xnhiều lần

Bạn có biết rằng nếu bạn đưa ra một lập luận trái xvới &, chức năng áp dụng nó xlần đểy ? Khá nhiều thử thách yêu cầu bạn thực hiện một số xlần thao tác nhất định . Nó chủ yếu có thể đạt được theo hai cách:

  • Sử dụng toán tử nguồn ^:mà không có toán hạng đúng

Nếu hoạt động là v, sau đó v^:trở thành một trạng từ, khi được đưa ra một toán hạng bên trái, sẽ trở thành một động từ đơn âm. Vì vậy, vđược áp dụng cho y, xlần.

x(v^:)y
is equivalent to
(v^:x)y
  • Sử dụng dyadic &như sự kết hợp ngoài cùng

Để sử dụng điều này, bạn cần xác định một nđộng từ hằng và dyadic u, sao cho n u yhoặc y u ntương đương với v. Sau đó, bạn có thể viết n&uhoặc u&nđể giải quyết toàn bộ nhiệm vụ. Hình thức này có hiệu quả nhất khi sự lựa chọn của hằng số là rõ ràng, ví dụ 3 in 3 u:(chuyển đổi ký tự thành giá trị ASCII).

Ngoài ra, u&nđược ưu tiên hơn một chút n&ukhi cấu trúc ngoài cùng ulà kết hợp hoặc trạng từ (trong trường hợp n&unày là n&(u); bạn có thể làm u~&nthay thế).

Lưu ý rằng bạn có thể đặt dyadic &ở bất cứ đâu trong một chuyến tàu để đạt được chức năng lặp lại tùy ý thành đối số tùy ý, theo nghĩa tương tự như động ^:.

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.