Lời khuyên cho việc chơi golf trong Jelly


46

Jelly là một ngôn ngữ lập trình định hướng golf ngầm của Dennis của chúng ta . Nó xuất hiện trong các câu trả lời ở đây ngày càng thường xuyên hơn, đánh bại các ngôn ngữ golf-y khác như Pyth và CJam, bằng cách sử dụng trang mã riêng và hệ thống chuỗi mạnh mẽ của nó để thể hiện các chương trình ngắn gọn.

Hãy thu thập một số lời khuyên hữu ích để chơi gôn trong Jelly. (Như mọi khi, một mẹo cho mỗi câu trả lời, xin vui lòng!)


13
Làm cho tôi tự hỏi nếu Jelly vẫn còn quá nhiều cho việc này để tạo ra nội dung sẽ hữu ích trong thời gian dài, nhưng người tốt nhất để trả lời đó có lẽ là Dennis.
Martin Ender

2
Tôi nghĩ rằng đã có rất nhiều lời khuyên nên có ý nghĩa cho dù có thay đổi gì trong ngôn ngữ. Lời khuyên cho việc chơi golf ở Pyth có cùng một vấn đề, tôi cho rằng, nhưng nó đã vượt qua bài kiểm tra về thời gian một cách hợp lý cho đến nay; câu trả lời thường được cập nhật bất cứ khi nào chúng không còn được áp dụng do thay đổi ngôn ngữ, mặc dù có một số chậm trễ.
Lynn

3
Đây là một mẹo hay: trở thành người học việc của @ Dennis. Sau đó, bạn sẽ thực sự giỏi chơi golf.
Conor O'Brien

12
@Lynn Tôi thích cách bạn nói Dennis của chúng ta. Giống như tất cả chúng ta là một gia đình lớn: D.

Chủ đề này trong các vấn đề về GitHub của Jelly về cách thực sự nhập các ký tự trang mã Jelly có thể đáng giá một hoặc hai mẹo: github.com/DennisMitchell/jelly/issues/6 Tuy nhiên, tôi không có quyền truy cập vào máy Windows Tôi cảm thấy tự tin khi viết lên những bit đó.
Jordan

Câu trả lời:


25

Nén chuỗi

Nếu bạn đang tìm kiếm một máy nén chuỗi tối ưu hóa / tự động hơn, hãy thử cái này .

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

Một chuỗi nén trông giống như “...», trong đó các dấu chấm là một đoạn dữ liệu được mã hóa cơ sở 250. Thuật toán giải nén hơi phức tạp: đoạn được hiểu là một số nguyên cơ sở hỗn hợp cơ sở dữ liệu, với divmodviệc phá vỡ các phần khác nhau của số nguyên này và xây dựng một chuỗi từ chúng.

Tôi đã tạo một giao diện Python 3 nhỏ để nén chuỗi Jelly:

import dictionary
code_page = '''¡¢£¤¥¦©¬®µ½¿€ÆÇÐÑ×ØŒÞßæçðıȷñ÷øœþ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¶°¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ƁƇƊƑƓƘⱮƝƤƬƲȤɓƈɗƒɠɦƙɱɲƥʠɼʂƭʋȥẠḄḌẸḤỊḲḶṂṆỌṚṢṬỤṾẈỴẒȦḂĊḊĖḞĠḢİĿṀṄȮṖṘṠṪẆẊẎŻạḅḍẹḥịḳḷṃṇọṛṣṭụṿẉỵẓȧḃċḋėḟġḣŀṁṅȯṗṙṡṫẇẋẏż«»‘’“”'''

class Compress(list):
    def character(self, c):
        if c in '\n\x7f¶':
            o = 95
        elif ' ' <= c <= '~':
            o = ord(c)-32
        else:
            raise ValueError(c + " is neither printable ASCII nor a linefeed.")
        self += [lambda z: 3*z+0, lambda z: 96*z+o]; return self
    def string(self, s):
        for c in s: self.character(c)
        return self
    def dictionary(self, w):
        ts = bool(self)
        if w[:1] == ' ': w = w[1:]; ts = not ts
        dct = dictionary.short if len(w) < 6 else dictionary.long
        W, sc = (w, 0) if w in dct else (w[:1].swapcase() + w[1:], 1)
        if W not in dct: raise ValueError(w + " isn't in the dictionary.")
        f = ts or sc; j = (2 if sc else 1) if ts else 0; i = dct.index(W)
        self += [lambda z: 3*z+2, lambda z: 3*z+j] if f else [lambda z: 3*z+1]
        self += [lambda z: 2*z+int(len(w) < 6), lambda z: len(dct)*z+i]
        return self
    def go(self):
        compressed = []; z = 0
        for f in self[::-1]: z = f(z)
        while z:
            c = z % 250
            if c == 0: c = 250
            z = (z - c) // 250
            compressed.append(code_page[c - 1])
        return '“{0}»'.format(''.join(compressed[::-1]))

Sử dụng máy nén như sau.

print(Compress()
      .dictionary('public')
      .dictionary(' static')
      .dictionary(' boolean')
      .string(' is')
      .dictionary('Power')
      .string('Of')
      .dictionary('Ten')
      .string('(')
      .dictionary('long')
      .dictionary(' input')
      .string(') {\n ')
      .dictionary(' return')
      .string('\n   ')
      .dictionary(' input')
      .string(' ==')
      .go())

Compress là một trình xây dựng chuỗi:

  • .string(s) sẽ chèn các ký tự ASCII thô, có thể in vào chuỗi.

    (Mỗi ký tự có giá khoảng 0,827 byte được nén.)

  • .dictionary(w)sẽ tìm kiếm một chuỗi trong từ điển tích hợp của Jelly. Bạn có thể bắt đầu chuỗi với một khoảng trắng, nếu bạn muốn một chuỗi. Nếu điều này cần đi chệch khỏi hành vi thêm chuỗi thông thường hoặc lật viết hoa của một từ trong từ điển, nó sẽ thêm các cờ tương ứng.

    (Chi phí khoảng 1.997 byte cho các từ ngắn, 2.433 byte cho các từ dài; nếu có cờ, hãy thêm 0.199 byte.)


15
Điều đó thật hữu ích! Tôi đã hơi mệt mỏi khi phải nén chúng bằng tay ...
Dennis

1
@Dennis Điều này có thể được bao gồm trong chính Jelly, vì vậy chúng tôi sẽ không phải sao chép nó từ đây mỗi lần?
PurkkaKoodari

@ Pietu1998 Là một nguyên tử hay cái gì khác?
Dennis

@Dennis Là một tập lệnh tiện ích trong kho lưu trữ.
PurkkaKoodari

1
Có lẽ đòi hỏi một cái gì đó trong Jelly.
Máy

19

Đây là một phần của những gì đã trở thành hướng dẫn của Jelly wiki .

Chuỗi

(Đây là phần tiếp theo để lập trình Tacit .)

Làm thế nào để Jelly đánh giá một chuỗi? Như đã giải thích trước đây, có ba trường hợp cần xem xét: liệu chuỗi này được gọi là vô nghĩa , đơn trị hay nhuộm .


1. Chuỗi Niladic

Đây là dễ nhất của bó. Để đánh giá một chuỗi niladic bắt đầu bằng một nilad, giống như α f g h, đánh giá chuỗi đơn sắc f g htại nilad đó α. (Hãy cẩn thận: nếu toàn bộ chuỗi trống, thay vào đó 0 được trả về. Nếu α không phải là nilad, hãy thay thế sử dụng α=0thay thế.)

Ví dụ, chỉ được ½đánh giá tại 4, đó là 2.


2. Chuỗi đơn nguyên

Chuỗi monadic được chia nhỏ từ trái sang phải, cho đến khi không có liên kết trái để xem xét. Ngoài ra, chúng tôi đã thông qua một số đối số ωở đây. Có hai câu hỏi để trả lời:

Giá trị khởi đầu cho đánh giá từ trái sang phải này là gì?

  • Nếu chuỗi của chúng tôi bắt đầu bằng một nilad αvà được theo sau bởi 0 hoặc nhiều đơn vị (như ½), các cặp dyad-nilad (như +2) và cặp nilad-dyad (như 4*): chúng tôi bắt đầu bằng cách đánh giá α, sau đó xem xét phần còn lại của chuỗi .

  • Mặt khác, chúng tôi bắt đầu từ đối số được truyền cho chuỗi này ωvà xem xét toàn bộ chuỗi.

Làm thế nào để chúng ta đi xuống chuỗi?

Hãy gọi Vgiá trị hiện tại - ban đầu, đó là giá trị được mô tả ở trên, nhưng nó được cập nhật khi chúng ta đi qua chuỗi - và biểu thị

  • nilads sử dụng chữ số,
  • đơn nguyên sử dụng chữ thường,
  • những cặp sử dụng những biểu tượng khai thác +, ×, ÷.

Sau đó, các mẫu sau được khớp với, từ trên xuống dưới:

                                 ┌───────────┬─────────┐
                                 │ old chain │ new V   │
                                 ╞═══════════╪═════════╡
                                 │ + × 1 ... │ (V+ω)×1 │ *
                                 │ + f ...   │ V+f(ω)  │
                                 │ + 1 ...   │ V+1     │
                                 │ 1 + ...   │ 1+V     │
                                 │ + ...     │ V+ω     │
                                 │ f ...     │ f(V)    │
                                 └───────────┴─────────┘
      (* Only if `...` consists of monads, dyad-nilad pairs, and nilad-dyad pairs.)

Hãy thử điều này trên chuỗi +²×.

  • +không phải là một con số không, vì vậy chúng tôi bắt đầu tại V = ω.
  • Sau đó, chúng tôi cắt ra , khớp với mẫu thứ hai và lấy V = ω+ω².
  • Sau đó, chúng tôi cắt ra ×, khớp với mẫu thứ năm, và nhận được V = (ω+ω²)×ω.
  • Chuỗi hiện đang trống, (ω+ω²)×ωkết quả cuối cùng của chúng tôi cũng vậy.

3. Chuỗi Dyadic

Về cơ bản, chúng giống như các chuỗi đơn âm, nhưng lần này, có hai đối số, λ(trái) và ρ(phải).

Giá trị khởi đầu là gì?

  • Nếu chuỗi bắt đầu với ba đê như thế + × %, chúng ta bắt đầu λ+ρvà xem xét chuỗi × % ...tiếp theo.

  • Mặt khác, chúng tôi bắt đầu từ λvà xem xét toàn bộ chuỗi.

Làm thế nào để chúng ta đi xuống chuỗi?

Lần này, các mẫu

                                 ┌───────────┬─────────┐
                                 │ old chain │ new V   │
                                 ╞═══════════╪═════════╡
                                 │ + × 1 ... │ (V+ρ)×1 │ *
                                 │ + × ...   │ V+(λ×ρ) │
                                 │ + 1 ...   │ V+1     │
                                 │ 1 + ...   │ 1+V     │
                                 │ + ...     │ V+ρ     │
                                 │ f ...     │ f(V)    │
                                 └───────────┴─────────┘
      (* Only if `...` consists of monads, dyad-nilad pairs, and nilad-dyad pairs.)

Hãy thử điều này trên chuỗi +×÷½.

  • Chuỗi bắt đầu với ba đê, vì vậy chúng tôi bắt đầu V = λ+ρvà ném đi +.
  • Sau đó, chúng tôi cắt ra ×÷, khớp với mẫu thứ hai và lấy V = (λ+ρ)×(λ÷ρ).
  • Sau đó, chúng tôi cắt ra ½, phù hợp với mô hình thứ sáu, và nhận được V = sqrt((λ+ρ)×(λ÷ρ)).
  • Chuỗi hiện đang trống, vì vậy chúng tôi đã hoàn thành.

2
Vì vậy, điều này trở thành một hướng dẫn Jelly hơn là lời khuyên cho việc chơi golf trong đó? ;)
Martin Ender

5
Tôi cho là như vậy. Nếu ngôn ngữ này rất khó hiểu, tôi nghĩ rằng làm thế nào để bất kỳ thứ gì trong số này thậm chí hoạt động?!. Đây là một mẹo hay ^^ Tôi dự định cuối cùng sẽ chuyển sang các thủ thuật và cách thức không rõ ràng để lưu byte. Nếu điều này không đúng chỗ ở đây, tôi có thể chuyển nó sang GitHub hoặc (nếu Dennis thích nó) repo Jelly.
Lynn

16

Các giá trị số đặc biệt

Dưới đây là một số trường hợp đặc biệt cho trình phân tích cú pháp số của Jelly:

  • - đánh giá -1
  • . đánh giá 0.5
  • ȷđánh giá 1000( ȷlà cho ký hiệu khoa học, ví dụ 2ȷ62000000)
  • ıđánh giá lại 1j( ıdành cho số phức, vd 2ı32+3j)

Cũng đáng lưu ý rằng một cái gì đó giống như thực sự 4+1j, hơn là 4.

Bạn có thể trộn và kết hợp những thứ này, ví dụ:

  • -.đang -0.5-1000
  • -1+1j, ı--1j-ı--1-1j
  • 500.0
  • 0.5+1j, ı.0.5j.ı.0.5+0.5j
  • ȷı1000+1j, ıȷ1000jȷıȷ1000+1000j

Lưu ý rằng ȷ-0.1, nhưng điều đó không làm tiết kiệm bất kỳ byte trên .1. Sau đó, cũng có những điều sau đây, có thể được thực hiện với số byte tương ứng bằng cách sử dụng biến dựng sẵn cho 10 ( ), nhưng có thể hữu ích trong trường hợp hiếm hoi mà nội dung không có sẵn hoặc để tiết kiệm khi cần sử dụng ¤:

  • ȷ.sqrt(10) ~ 3.162277, .ȷ.sqrt(10)/2 ~ 1.5811ȷ-.1/sqrt(10) ~ 0.31162

13

Tối ưu hóa máy nén chuỗi

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

Bài đăng của Lynn chi tiết chính xác các chuỗi nén là gì, cùng với việc có một máy nén sẽ tạo ra các chuỗi nén này. Tuy nhiên, trong khi tìm hiểu một chương trình trong Jelly, tôi thấy thật mệt mỏi khi phải kết hợp .dictionary.stringcùng với các vị trí không gian chính xác, v.v., để đạt được chuỗi ngắn nhất có thể.

Do đó, tôi quyết định tạo một phần mở rộng cho tập lệnh của Lynn để lấy đầu vào của người dùng và tìm cách nén ngắn nhất mà không cần người dùng phải thực hiện bất kỳ công việc nào. Kịch bản khá dài và vì vậy tôi đã thêm vào một liên kết TIO, thay vì chính mã.

Cách chương trình hoạt động là bằng cách nén bằng 3 phương pháp khác nhau và xác định phương pháp nào ngắn nhất:

  1. Phương pháp 1 chỉ đơn giản mã hóa từng byte của đầu vào tại một thời điểm, có xu hướng tạo ra kết quả dài nhất, so với các đầu vào khác. Ngay cả khi đầu vào rất ngắn, nó vẫn quản lý để tạo ra các lựa chọn thay thế khá dài. Ví dụ, cách ngắn nhất testcó thể được nén là “¡ḌY», trong khi phương thức này trả về “¡⁷ƑKʂ»(dài hơn 2 byte). Theo nguyên tắc chung, điều này chỉ hoạt động nếu chuỗi dài dưới 4 ký tự

  2. Phương thức thứ hai ngắt chuỗi thành các từ và dấu chấm câu, vì cả hai được thêm vào máy nén theo các cách khác nhau. Các từ là một phần của từ điển được thêm vào bằng .dictionaryphương pháp mã của Lynn, nó nén chúng nhiều hơn nếu chúng được thêm đơn giản bởi các điểm mã. Tuy nhiên, dấu câu phải được thêm bởi điểm mã vì thật không may, chúng không phải là một phần của từ điển.

    Dấu câu bao gồm khoảng trắng, là cách mà phương thức số 3 phát huy tác dụng, nhưng trước tiên và đánh giá phương pháp 2: hãy so sánh các phương thức một và hai nén chuỗi Hello, World!(chứa các từ, dấu câu và dấu cách, vì vậy là hoàn hảo). Nén ký tự theo ký tự dẫn đến chuỗi cuối cùng “ŒCdẉa÷¹ṂȤƓ(Ẋ)»(dài 15 byte), mà, khi nó bật ra, dài hơn cách dễ dàng hơn để xuất Hello, World!: “Hello, World!. Bây giờ hãy xem phương pháp hai. Điều này tạo ra chuỗi nén “Ọƥ⁷Ƭė3⁶»có trọng lượng 9 byte, một cải tiến lớn so với chuỗi cũ. Tuy nhiên, xin chào ngắn nhất, Thế giới! chương trình trong Jelly là 8 byte , vì vậy một cái gì đó có thể được cải thiện

  3. Ở đây có phương pháp 3, làm cho nó thậm chí còn ngắn hơn. Như mong đợi, đầu ra cho Hello, World, tất nhiên, “3ḅaė;œ»là chương trình ngắn nhất có thể. Vậy phương pháp 3 làm gì, phương pháp 2 đó không? Phương pháp 3 kết hợp các không gian đơn độc vào các không gian hàng đầu, mà bộ giải nén Jelly có cờ. Trong mã cho cả máy nén và bộ giải nén, bạn có thể thấy mã như thế nào if flag_space: word = ' ' + word, cho thấy các không gian hàng đầu là a) được hỗ trợ và b) tiết kiệm byte. Do đó, bộ tách chuỗi từ phương thức hai được điều chỉnh sao cho các khoảng trắng được kết hợp trực tiếp vào chuỗi sau đó để tạo các chuỗi hàng đầu. Điều này có nghĩa Hello, World!là được phân tích cú pháp dưới dạng ["Hello", ",", " World", "!"], khi nén chỉ có 6 byte (8 khi bao gồm các dấu phân cách). Đây hầu như luôn là phương pháp nén ngắn nhất, ngoại trừ "phần mở rộng" mà tôi đã thêm,

Đây là phần lớn của chương trình, nhưng có một vài tùy chọn khác giúp nó nén dữ liệu hơn nữa.

  • Chương trình kiểm tra xem mỗi phiên bản nén có chính xác hay không, bằng cách sử dụng bộ giải nén sss của Dennis mà Jelly sử dụng (đi thẳng vào nguồn)
  • Bạn có thể thấy tất cả các chuỗi được nén khác nhau bằng cách tạo đối số dòng lệnh đầu tiên --debug, thay vì chỉ hiển thị chuỗi nén ngắn nhất, hiển thị cả 3 cùng với bản sao "Đây là bản sao ngắn nhất"
  • Chương trình xử lý "không lời"

Không lời

Tôi bắt đầu làm việc với máy nén của Lynn sau khi thấy tin nhắn này , bẻ khóa nó và cảm thấy thất vọng vì thực tế là tôi không thể tìm ra cách ngắn nhất để nén nó (đó là 29 hoặc 32 byte cho bản ghi). Tuy nhiên, trong khi thử nghiệm các cải tiến của mình, tôi thấy rằng các từ như knownskhông có trong từ điển của Jelly. Do đó, tôi bắt đầu tìm cách nén những "từ không" này trong mã Jelly ngắn nhất có thể.

Tôi đã tạo một hàm ( trim) phân tách chuỗi thành một điểm trong đó ít nhất một trong các phần của chuỗi là các từ. Ví dụ, knownssẽ được chia thành ["known", "s"]và yêu cầu chương trình thêm từ đầu tiên thông qua từ điển add ( .dictionary) và phần thứ hai của từ thông qua một .stringcuộc gọi. Nhưng điều này vẫn để lại hai trường hợp cạnh: các chuỗi không có từ nào trong đó (chẳng hạn như ajdl) và các từ không có từ ở cuối, chẳng hạn như abctest, sẽ không bị chia tách bởi trimhàm.

Vì không có cách tìm từ trong chuỗi không có từ trong đó, cách đơn giản nhất và ngắn nhất để xử lý chúng là bằng cách thêm chúng vào từng ký tự thông qua một .stringcuộc gọi. Vì vậy, ajdlsẽ được thêm bởi .string('ajdl'). Trong khi các từ không kết thúc bằng các từ được công nhận, về cơ bản sẽ thực hiện tông đơ nhưng ngược lại, và áp dụng .dictionaryvà ngược lại .stringvới các tông đơ chuyển tiếp.

Khi nó quay ra, cắt tỉa chuỗi, hoặc ngay từ đầu hoặc cuối cùng là, tất nhiên, ngắn hơn vì thêm mỗi nhân vật để nén, như chứng minh bởi một đầu vào của abctest this string, trong đó sản xuất một sản lượng debug của

Original        : abctest this string

Optimised       : “¡J+v(p⁸ụƘ$,»
Seperate spaces : “Ç⁴ṭḍµḄ7oeṂdḷp»
No trimmer      : “¤ɦ?Ɓ¢#fḲOạ⁾¶ɼȥƬ»
All characters  : “µẓþ"Y7_ḣṗḢ))9Þ⁴⁺Ẉ²)ɱ»
Non-compressed  : “abctest this string
Shortest        : “¡J+v(p⁸ụƘ$,»
=====

Sự khác nhau giữa đầu ra tối ưu (sử dụng tông đơ) và đầu ra không phải là con số khổng lồ (cho Jelly) 4 byte. Cuối cùng, có những trường hợp bản thân chuỗi ngắn hơn bất kỳ phiên bản nén nào, hiện đã được đưa vào.

Tất nhiên, rất nhiều tín dụng cho việc này đã dành cho Lynn để tạo ra máy nén ban đầu


Điều này có nên được xóa ngay bây giờ khi chúng ta có codegolf.stackexchange.com/a/151721/39328 ?
lirtosiast

@lirtosiast Bằng cách lập luận tương tự, bạn có thể nói rằng bài đăng này nên bị xóa. Nó không có hại, và là một câu trả lời hoàn toàn hợp lệ, không có lý do gì để xóa nó, đơn giản vì có một câu trả lời tốt hơn.
caird coinheringaahing

10

Bạn có thể sử dụng siêu ký tự ba đến chín ( ³⁴⁵⁶⁷⁸⁹) để chơi một số giá trị thường được sử dụng, nhưng điều này phụ thuộc vào số lượng đối số dòng lệnh và trong trường hợp liên kết, vào các đối số của các liên kết.

  • ³ trả về 100 và chỉ hoạt động nếu không có đầu vào.
  • trả về 16 và chỉ hoạt động nếu có nhiều nhất một đầu vào.
  • trả về 10 và chỉ hoạt động nếu có nhiều nhất hai đầu vào.
  • trả về một khoảng trắng nếu có nhiều nhất ba đầu vào.
  • trả về một dòng mới nếu có nhiều nhất bốn đầu vào.

Tuy nhiên, nếu có năm đầu vào, bạn sẽ không gặp may.

Gần đây, một phiên bản mới của ngôn ngữ đã hạ giá trị ³xuống 100 và giới thiệu một số nguyên tử mới trả về giá trị hoặc (cho các liên kết) các đối số của chúng.

  • trả về một danh sách trống ở mọi nơi trừ các liên kết có đối số bên trái được truyền cho chúng.
  • trả về 256 ở mọi nơi trừ các liên kết có đối số đúng được truyền cho chúng.

Tuy nhiên, nếu bạn đang ở trong một liên kết và có các đối số từ cả hai phía được chuyển đến liên kết đó, tuy nhiên, bạn đã hết may mắn.


1
Trên thực tế, đầu vào không sử dụng được lấp đầy với các giá trị mặc định! Thật tiện lợi!
Máy

9

Lạm dụng chuỗi lỗi

Tín dụng đến Adnan để tận dụng lợi thế này đầu tiên trong Viết chương trình để co giãn chuỗi .

Jelly được cho là sẽ có được số học ký tự một ngày, nhưng cho đến khi điều đó xảy ra, chúng ta có thể tận dụng thực tế là Python làm quá tải hầu hết các toán tử số học và Jelly không kiểm tra kiểu.

Ví dụ

“abcd”Ḥ

không phải làm bất cứ điều gì hữu ích ngay bây giờ, nhưng vì (chưa được thực hiện) được thực hiện như

lambda z: z * 2

và các nguyên tử số học vector hóa ở độ sâu 0 (nghĩa là chúng hoạt động trên các số hoặc ký tự), mã Jelly ở trên mang lại

['aa', 'bb', 'cc', 'dd']

Cẩn thận rằng điều này tạo ra các chuỗi Python thực sự (một loại Jelly không cần phải có), vì vậy điều này sẽ không thể sử dụng được trong mọi tình huống.

Tương tự như vậy, +/có thể hữu ích để nối các chuỗi, với cùng một cảnh báo.


Vì vậy, nếu trong tương lai khi số học ký tự được thêm vào, bạn sẽ thêm quá tải kiểu cho chuỗi và các loại không phải số khác cho các nguyên tử đó chứ?
dặm

1
Nhiều hơn hoặc ít hơn. Tôi dự định tạo một kiểu số bên trong một số nhưng có cờ ký tự. Lá cờ đó sẽ chỉ ảnh hưởng đến việc in ấn; các ký tự có thể được sử dụng thay cho số nguyên ở mọi nơi.
Dennis

1
Skhông bao giờ có thể hữu ích để nối chuỗi, nó sẽ cố gắng thêm 0vào chúng.
Erik the Outgolfer

@EriktheOutgolfer Đúng, trường hợp cơ sở pesky. +/hoạt động mặc dù.
Dennis

@Dennis Vâng, bây giờ tôi đã chiến thắng một thử thách khá nhiều +/.
Erik the Outgolfer

8

Máy nén chuỗi tối ưu

Gần đây tôi đã yêu cầu Erik Outgolfer thêm trình nén chuỗi được tối ưu hóa vào trang tham chiếu JHT , nhưng họ nói rằng

xin lỗi, nhưng máy nén đó dường như không được thực hiện đầy đủ,
nó nói “ugtestslug”là ngắn nhất có thể ugtestslug, trong khi “#ṀȮụḄPƇ»cũng thực hiện công việc

Vì vậy, tôi quyết định thực hiện các máy nén chuỗi tối ưu.

Cách tiếp cận đơn giản, nhưng đảm bảo tìm được giá trị nhỏ nhất có thể (và do đó đếm byte)

Lấy đầu vào từ stdin, đầu ra đến stdout. Giống như máy nén ban đầu, hoặc (ký tự dòng mới) có thể được nhập dưới dạng dòng mới.

Cố gắng chạy nó với nhiều dấu chấm câu (ví dụ: đầu vào ¶-----¶) sẽ xuất ra chuỗi không nén.

Tất nhiên, rất nhiều tín dụng cho việc này đã dành cho Lynn để tạo ra máy nén ban đầu .


7

Đây là một phần của những gì đã trở thành hướng dẫn của Jelly wiki .

Lập trình ngầm

Jelly là một ngôn ngữ lập trình ngầm. Điều này có nghĩa là bạn xác định các liên kết (hàm) bằng cách kết hợp các liên kết hiện có thành một chuỗi , mà không nói rõ ràng về các đối số liên quan. Bằng cách nào, các đối số trong dòng chảy qua các thành phần này được xác định bởi mẫu mà các liên kết được sắp xếp. Một ví dụ về điều này sẽ được đưa ra sớm, nhưng trước tiên chúng ta sẽ cần giới thiệu một số khái niệm.

Các arity của một liên kết là một khái niệm rất quan trọng. Tất cả các nguyên tử - được xây dựng, thích +½- có các thành phần cố định. Liên kết được sắp xếp thành ba loại, tùy thuộc vào mức độ của chúng:

  • Nilads không có đối số (arity 0); khác với một số lệnh I / O và trạng thái, chúng chủ yếu đại diện cho các giá trị không đổi. Ví dụ, nghĩa đen 3là một con số không.

  • Monads lấy một đối số (arity 1). (Không có kết nối với các đơn vị lập trình chức năng ở đây.) Ví dụ: ½(căn bậc hai) là một đơn nguyên.

  • Dyads có hai đối số (arity 2): một đối số trái và phải. Ví dụ, +là một dyad.

(Sử dụng tính từ, chúng tôi nói rằng một liên kết là niladic , monadic hoặc dyadic .)

Vì vậy, sự liên kết mà chúng ta xác định khi viết chương trình là gì? Theo mặc định, chúng là matrixdic - nghĩa là tùy thuộc vào người gọi để chỉ định số lượng đối số sẽ sử dụng và trong trường hợp liên kết chính , nó phụ thuộc vào số lượng đối số mà chương trình được truyền.

Ví dụ, là một chuỗi +(bổ sung) và ½(căn bậc hai). Vì các yếu tố tương ứng của các yếu tố của chuỗi này là 2 và 1, chúng tôi gọi nó là chuỗi 2.1 . Trình thông dịch có các quy tắc cụ thể để phá vỡ các chuỗi, dựa trên các giá trị của chúng: các quy tắc đó ra lệnh rằng, được cung cấp một đầu vào n, liên kết mới này sẽ tính toán n + sqrt(n). (Bạn có thể đọc như “... cộng với căn bậc hai của nó.” )

Do đó, lập trình Jelly về cơ bản là nghệ thuật học tốt các quy tắc này và sáng tác các chuỗi thông minh giúp hoàn thành công việc một cách ngầm định .


Có bộ ba?
Conor O'Brien

Không! Tôi tò mò muốn xem Dennis sẽ thực hiện như thế nào, giả sử, thay thế chuỗi, vốn là một bộ ba ( replace(str, old, new)).
Lynn

Tôi không biết Jelly, nhưng tôi biết một chút về J. Có lẽ nó có thể là, nói, string (operator) (list)nơi (list)đây là danh sách nhị phân old, new. Điều đó sẽ có ý nghĩa, thạch có một pairtoán tử tích hợp. Tuy nhiên, theo sơ đồ đó, nó sẽ là hai byte cho toán tử.
Conor O'Brien

5
Đợi ... ½là căn bậc hai? Tại sao không ½, ừm ... một nửa? Tại sao không cho căn bậc hai? :(
Cyoce

@Cyoce vì Hđã là một nửa, rõ ràng: P
Ven

6

Đây là một phần của những gì đã trở thành hướng dẫn của Jelly wiki .

Cấu trúc chương trình

Mỗi dòng trong một chương trình Jelly là một định nghĩa liên kết . Liên kết về cơ bản là các chức năng. Dòng dưới cùng đại diện cho mainđỉnh điểm: đó là liên kết được đánh giá bằng cách sử dụng các đối số được truyền trên dòng lệnh.

Tất cả các liên kết, nhưng cuối cùng, sau đó, là các định nghĩa hàm: bạn có thể tham khảo chúng bằng cách sử dụng các tác nhân . Ví dụ, çmột liên kết trên mạng này, với tư cách là một toán tử nhị phân (dyad) . Xem xét chương trình ví dụ này , tính toán bình phương tổng của các đối số của nó:

+
ç²

Đây là loại giống như mã giả:

define f:
    the built-in link +
define main:
    apply the dyad f
    square the result

6

Đây là một phần của những gì đã trở thành hướng dẫn của Jelly wiki .

Liên kết đa chuỗi

Hãy nhớ khi tôi viết rằng bạn xác định một liên kết bằng cách tạo một chuỗi các liên kết khác? Tôi đã không nói toàn bộ sự thật: trong thực tế, đó là một quá trình hai lớp. Liên kết là một chuỗi các chuỗi và theo mặc định, chuỗi bên ngoài đơn giản có độ dài đơn vị.

Hãy xem xét chương trình này:

C+H

Đó là bổ sung cộng một nửa . Nó nhận một giá trị đầu vào nvà tính toán (1-n)+(n/2). Không quá thú vị, tôi biết. Nhưng cấu trúc thực sự là như thế này:

                                                    cấu trúc 1

Liên kết chúng tôi đã viết là, chính nó, thực sự là một chuỗi chứa một chuỗi duy nhất.

Giả sử rằng chúng ta muốn tính toán (1-n)+(1-n)(n/2)thay thế. Chuỗi dyadic sẽ hoạt động: theo quy tắc chuỗi , nó tính toán λ+(λ×ρ), trông rất giống với những gì chúng ta cần. Tuy nhiên, chỉ cần thay thế +bằng trong chương trình của chúng tôi sẽ không làm: C+×Hlà chuỗi 1,2,2,1 - bổ sung, sau đó thêm (đối số), sau đó nhân với một nửa tính toán ((1-n)+n)×(n/2).

Chúng tôi muốn Jelly để điều trị như một đơn vị, và thực hiện một 1,2,1-chuỗi của tiểu chuỗi C, H. Liên kết đa chuỗi cho phép chúng tôi làm điều đó! Để xây dựng chúng, chúng tôi sử dụng các dấu tách chuỗi øµð : trong hình trên, chúng sẽ giới thiệu một hình chữ nhật màu xanh mới, có độ tương ứng là 0, 1 và 2. Trong trường hợp của chúng tôi, chúng tôi có thể nhóm các chuỗi theo cách chúng tôi muốn bằng cách viết Cð+×µH:

                            nhập mô tả hình ảnh ở đây

Không có cách nào để lồng những thứ này hơn nữa. Thay vào đó, bạn sẽ phải xác định nhiều liên kết.


Làm thế nào bạn thực hiện những biểu đồ, vì tò mò?
Conor O'Brien

4
Tôi đã vẽ chúng bằng tay trong Paint.NET :)
Lynn

4
Ồ Ấn tượng! Điều này sẽ rất tuyệt cho các chương trình Jelly cứng, giống như một công cụ thực hiện điều này. (Akin đến HexagonyColorer hoặc bất cứ thứ gì nó được gọi)
Conor O'Brien

5

Nếu TMTOWTDI, hãy chọn chuỗi phù hợp với chuỗi của bạn.

Một trong những lợi thế của ngôn ngữ ngầm là bạn thường có thể thoát khỏi mà không cần sử dụng các tham chiếu biến. Tuy nhiên, điều này chỉ hoạt động nếu các liên kết trong chuỗi của bạn có mùi thơm phù hợp.

Ví dụ, cách đơn giản để lấy tổng của tất cả các mảng trong một mảng 2D là

S€

trong đó ánh xạ nguyên tử tổng trên tất cả các phần tử của mảng.

Bây giờ hãy nói rằng bạn có một chuỗi đơn nguyên bao gồm nguyên tử

*

ánh xạ mỗi x của một mảng 2D thành x x . Ví dụ: với A = [[1, 2], [3, 1], [2, 3]] , gọi chuỗi sẽ mang lại [[1, 4], [27, 1], [4, 27]] .

Bây giờ, chúng tôi muốn lấy tổng của từng cặp. Không may,

*S€

không hoạt động vì *không hoạt động như một cái móc nữa (sử dụng chính A làm đối số đúng), nhưng là một ngã ba , có nghĩa là S€được áp dụng cho A trước và kết quả là đối số đúng *.

Sửa lỗi này là đủ dễ dàng:

*¹S€
*⁸S€

Cả hai đều tạo ra kết quả mong muốn: là một ngã ba trong đó ¹là hàm nhận dạng và *⁸là một đỉnh , trong đó tham chiếu đến đối số bên trái của chuỗi ( A ).

Tuy nhiên, có một cách để tiết kiệm một byte! Đỉnh ḅ1(chuyển đổi từ đơn nguyên sang số nguyên) cũng tính tổng của từng mảng trong A A , nhưng không giống như S€, là một liên kết dyadic .

Chuôi

*ḅ1

trả về [5, 28, 31] (như mong muốn); vì là dyadic, *móc thay vì rèn


"Trên đỉnh ḅ1"?
Máy

Trên đỉnh là thuật ngữ J. Trong Jelly, nó là một loại chuỗi hoạt động trực tiếp trên giá trị trả về cuối cùng, do đó, nó được thực hiện trên đầu liên kết trước đó của chuỗi.
Dennis

Một lý do khác để không bao giờ cố gắng học ngôn ngữ này ...: P
CalculatorFeline

1
Tôi cũng cảm thấy như vậy về J / APL, nhưng sau một thời gian, nó cảm thấy tự nhiên như mọi ngôn ngữ khác.
Dennis

4

Nén số nguyên

Nén chuỗi rất hữu ích khi tạo văn bản bằng tiếng Anh, nhưng nếu bạn cần nén các loại dữ liệu khác, nó khá không hiệu quả. Như vậy, hầu hết thời gian bạn muốn lưu trữ một hằng số cố định lớn trong chương trình của mình, tốt nhất là lưu trữ dưới dạng một số nguyên.

Bây giờ Jelly có trang mã riêng là một hằng số, thuật toán nén cho các số nguyên được biểu thị đơn giản nhất trong chính Jelly:

ḃ250ịØJ”“;;”’ṄV

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

(Chương trình trên cũng có một kiểm tra để hiển thị giá trị mà số nguyên giải nén thành.)

Ngoài việc chỉ sử dụng một số nguyên làm số nguyên, bạn cũng có thể sử dụng nó để tạo một chuỗi thông qua thực hiện chuyển đổi cơ sở trên nó, sau đó lập chỉ mục thành một bảng chữ cái của các ký tự. Nguyên tử tự động hóa quá trình này và khá hữu ích vì nó có thể mô tả toàn bộ quá trình giải nén (trừ bảng chữ cái được giải nén thành) trong một byte đơn.


4

Sử dụng các sản phẩm bên ngoài để tạo ma trận nguyên hữu ích

Đây là một ý chính tôi đã tạo ra của bài đăng này với định dạng bảng HTML đẹp hơn một chút.

Sản phẩm bên ngoài nhanh chóng þcó thể được gắn vào đê và làm cho đê tác động lên từng cặp phần tử trong các đối số bên trái và bên phải của nó. Nó là tốc ký cho €Ð€. Ví dụ: nếu chúng ta có mã, [1,2]+€Ð€[0,10]chúng ta có thể rút ngắn nó [1,2]+þ[0,10] và cả hai sẽ mang lại [[1,2],[11,12]]. Tôi sẽ đề cập đến một dyad với þứng dụng (như ) như một dyad sản phẩm bên ngoài.

Khi một số nguyên là một trong các đối số của một sản phẩm bên ngoài, Jelly lấy phạm vi của số đó trước sau đó sử dụng kết quả làm đối số. Biết điều này, ví dụ trên có thể được rút ngắn hơn nữa 2+þ[0,10]. Điều này đúng cho cả đối số bên trái và bên phải của một sản phẩm bên ngoài.

Một số nhuộm sản phẩm bên ngoài khi hoạt động đơn lẻ trên một số nguyên mang lại ma trận số nguyên nhất định có thể hữu ích trong việc chơi gôn (đặc biệt là các thử thách nghệ thuật ASCII) nhưng sẽ mất nhiều byte để xây dựng. Ví dụ: khi áp dụng cho một số nguyên nmang lại một n×nma trận danh tính. Hãy thử trực tuyến!

Dưới đây là bảng các dyads và loại ma trận mà chúng mang lại khi biến thành các dyad sản phẩm bên ngoài và hoạt động đơn lẻ trên một số nguyên. Dyads được liệt kê trong cùng một hàng sẽ mang lại ma trận giống nhau. Có những cặp tôi đã không được đưa vào bảng như &, |, %, w, đó cũng sản xuất nguyên ma trận nhưng mô hình của họ không phải là đơn giản và có khả năng sẽ có ích trong những tình huống ít. Hãy thử trực tuyến!

+ ------------------------------------------------- ---- +
| Dyad | Ma trận kết quả | Ví dụ |
+ ------------------------------------------------- ---- +
| = ⁼ | | 1 0 0 |
| ċ | Ma trận danh tính | 0 1 0 |
| | | 0 0 1 |
+ ------------------------------------------------- ---- +
| | Các phần tử trên đường chéo là 1, | 0 1 1 |
| <| tất cả các yếu tố khác là 0 | 0 0 1 |
| | | 0 0 0 |
+ ------------------------------------------------- ---- +
| | Các phần tử bên dưới đường chéo là 1, | 0 0 0 |
| > | tất cả các yếu tố khác là 0 | 1 0 0 |
| | | 1 1 0 |
+ ------------------------------------------------- ---- +
| | Các phần tử đường chéo là 0, | 0 1 1 |
| n ⁻ | yếu tố đường chéo là 1 | 1 0 1 |
| | | 1 1 0 |
+ ------------------------------------------------- ---- +
| một ȧ | | 1 1 1 |
| ṛ ị | Chỉ số hàng của từng yếu tố | 2 2 2 |
| | | 3 3 3 |
+ ------------------------------------------------- ---- +
| o | | 1 2 3 |
| ȯ | Chỉ số cột của từng yếu tố | 1 2 3 |
| | | 1 2 3 |
+ ------------------------------------------------- ---- +
| | Đường chéo chính là 0, trên | 0 1 2 |
| _ | đường chéo là 1, 2 ..., thấp hơn | -1 0 1 |
| | các đường chéo là -1, -2 ... | -2 -1 0 |
+ ------------------------------------------------- ---- +
| | Đường chéo chính là 0, thấp hơn | 0 -1 -2 |
| _ @ | đường chéo là 1, 2 ..., trên | 1 0 -1 |
| | các đường chéo là -1, -2 ... | 2 1 0 |
+ ------------------------------------------------- ---- +
| | Đường chéo chính là 0, trên | 0 1 2 |
| ạ | và các đường chéo thấp hơn là 1, | 1 0 1 |
| | 2, 3 ... | 2 1 0 |
+ ------------------------------------------------- ---- +
| | | 2 3 4 |
| + | Chỉ số hàng cộng với chỉ số cột | 3 4 5 |
| | | 4 5 6 |
+ ------------------------------------------------- ---- +
| | Tối thiểu của hàng | 1 1 1 |
| «| và chỉ số cột | 1 2 2 |
| | | 1 2 3 |
+ ------------------------------------------------- ---- +
| | Tối đa của hàng | 1 2 3 |
| »| và chỉ số cột | 2 2 3 |
| | | 3 3 3 |
+ ------------------------------------------------- ---- +

2

Liệt kê các lệnh và nghĩa đen

Nếu bạn cố gắng sử dụng nhiều lệnh danh sách không vector hóa trên một chữ n hoặc một danh sách bằng chữ z , trước tiên, lệnh danh sách sẽ chuyển đổi thành một danh sách sắp xếp nào đó và sau đó thực hiện lệnh trong danh sách đó.

Các lệnh này xuất hiện sử dụng các lệnh gọi đến iterablehàm trong thạch .

def iterable(argument, make_copy = False, make_digits = False, make_range = False):
    the_type = type(argument)
    if the_type == list:
        return copy.deepcopy(argument) if make_copy else argument
    if the_type != str and make_digits:
        return to_base(argument, 10)
    if the_type != str and make_range:
        return list(range(1, int(argument) + 1))
    return [argument]

Dưới đây là một số danh sách không đầy đủ về những gì các lệnh danh sách sẽ làm.

Kết thúc tốt đẹp trong một danh sách

Việc trả về đơn giản nhất từ iterableđể bọc đối số trong một danh sách và trả về điều đó được xử lý bởi hàm. Điều này xảy ra nếu đối số chưa phải là danh sách, là một chuỗi và iterablecác đối số không gọi cho các phương thức khác.

-------------------------------------------------------------------------------
| Command | Description     | Process                       | Effect          |
-------------------------------------------------------------------------------
| F       | Flattens a list | 4953F -> [4953]F -> [4953]    | Same as W       |
-------------------------------------------------------------------------------
| G       | Format a list   | 4953G -> [4953]G -> [4953]    | Same as W       |
|         | as a grid       |                               |                 |
-------------------------------------------------------------------------------
| I       | Increments      | 4953I -> [4953]I -> <nothing> | Empty list      |
-------------------------------------------------------------------------------
| S       | Sums a list     | 4953S -> [4953]S -> 4953      | Same as ¹       |
-------------------------------------------------------------------------------
| Ṭ       | Boolean array,  | 4Ṭ -> [4]Ṭ -> [0, 0, 0, 1]    | n-1 zeroes,     |
|         | 1s at indices   |                               | 1 at end        |
-------------------------------------------------------------------------------
| Ụ       | Sort indices by | 4Ụ -> [4]Ụ -> [1]             | Yields [1]      |
|         | by their values |                               |                 |
-------------------------------------------------------------------------------
| Ė       | Enumerate list  | 4Ė -> [4]Ė -> [[1, 4]]        | Yields [[1, n]] |
-------------------------------------------------------------------------------
| Ġ       | Group indices   | 4Ġ -> [4]Ġ -> [[1]]           | Yields [[1]]    |
|         | by values       |                               |                 |
-------------------------------------------------------------------------------
| Œr      | Run-length      | 4Œr -> [4]Œr -> [[4, 1]]      | Yields [[n, 1]] |
|         | encode a list   |                               |                 |
-------------------------------------------------------------------------------

Chuyển đổi sang cơ sở 10

Các hàm ở đây gọi iterableđể chuyển đổi thành một số thành một danh sách các chữ số của nó D, và sau đó chạy trên các chữ số đó.

-------------------------------------------------------------------------
| Command | Description     | Process                      | Effect     |
-------------------------------------------------------------------------
| Q       | Unique elements | 299Q -> [2, 9, 9]Q -> [2, 9] | Unique     |
|         | ordered by      |                              | digits     |
|         | appearance      |                              | of n       |
-------------------------------------------------------------------------
| Ṛ       | Non-vectorized  | 4953Ṣ -> [4, 9, 5, 3]Ṛ       | Reverses D |
|         | reverse         | -> [3, 5, 4, 9]              |            |
-------------------------------------------------------------------------
| Ṣ       | Sort a list     | 4953Ṣ -> [4, 9, 5, 3]Ṣ       | Sorts D    |
|         |                 | -> [3, 4, 5, 9]              |            |
-------------------------------------------------------------------------

Chuyển đổi sang danh sách với phạm vi

Các hàm ở đây chuyển đổi một số thành phạm vi R = [1 ... n], và sau đó chạy trên phạm vi đó.

-----------------------------------------------------------------------------------------
| Command | Description       | Process                             | Effect            |
-----------------------------------------------------------------------------------------
| X       | Random element    | 4R -> [1 ... 4]X -> 2               | Random element    |
|         |                   |                                     |  of R             |
|         |                   |                                     |                   |
-----------------------------------------------------------------------------------------
| Ḋ       | Dequeue from list | 4R -> [1 ... 4]Ḋ -> [2, 3, 4]       | Range [2 ... n]   |
-----------------------------------------------------------------------------------------
| Ṗ       | Pop from list     | 4Ṗ -> [1 ... 4]Ṗ -> [1, 2, 3]       | Range [1 ... n-1] |
-----------------------------------------------------------------------------------------
| Ẇ       | Sublists of list  | 4Ẇ -> [1 ... 4]Ẇ                    | All sublists of R |
|         |                   | -> [[1], [2], [3], [4], [1, 2],     |                   |
|         |                   |     [2, 3], [3, 4], [1, 2, 3],      |                   |
|         |                   |     [2, 3, 4], [1, 2, 3, 4]]        |                   |
-----------------------------------------------------------------------------------------
| Ẋ       | Shuffle list      | 4Ẋ -> [1 ... 4]Ẋ -> [2, 1, 3, 4]    | Shuffles R        |
-----------------------------------------------------------------------------------------
| Œ!      | All permutations  | 3Œ! -> [1, 2, 3]Œ!                  | All permutations  |
|         | of a list         | -> [[1, 2, 3], [1, 3, 2],           | of R              |
|         |                   |     [2, 1, 3], [2, 3, 1],           |                   |
|         |                   |     [3, 1, 2], [3, 2, 1]]           |                   |
-----------------------------------------------------------------------------------------
| ŒḄ      | Non-vectorized    | 4ŒḄ -> [1 ... 4]ŒḄ                  | Bounces R         |
|         | bounce,           | -> [1, 2, 3, 4, 3, 2, 1]            |                   |
|         | z[:-1] + z[::-1]  |                                     |                   |
-----------------------------------------------------------------------------------------
| Œc      | Unordered pairs   | 4Œc -> [1 ... 4]Œc                  | Unordered pairs   |
|         | of a list         | -> [[1, 2], [1, 3], [1, 4], [2, 3], | of R              |
|         |                   |     [2, 4], [3, 4]]                 |                   |
-----------------------------------------------------------------------------------------
| Œċ      | Unordered pairs   | 4Œċ -> [1 ... 4]Œċ                  | Unordered pairs   |
|         | with replacement  | -> [[1, 1], [1, 2], [1, 3], [1, 4], | with replacement  |
|         | of a list         |     [2, 2], [2, 3], [2, 4], [3, 3], | of R              |
|         |                   |     [3, 4], [4, 4]]                 |                   |
-----------------------------------------------------------------------------------------
| ŒP      | Powerset of       | 3ŒP -> [1 ... 3]                    | Powerset of R     |
|         | a list            | -> ['', [1], [2], [3], [1, 2],      |                   |
|         |                   |     [1, 3], [2, 3], [1, 2, 3]]      |                   |
-----------------------------------------------------------------------------------------
| Œp      | Cartesian         | 4,2Œp -> [[1 ... 4], [1 ... 2]]Œp   | Cartesian product |
|         | product of z's    | -> [[1, 1], [1, 2], [2, 1], [2, 2], | of [1 ... z[i]]   |
|         | items             |     [3, 1], [3, 2], [4, 1], [4, 2]] | for i in z        |
-----------------------------------------------------------------------------------------

Điều đó không hoàn toàn chính xác. Có, sản phẩm dequeueCartesian làm điều này, nhưng tổng kết thay vì tạo một phạm vi, sắp xếp và chuyển đổi ngược lại thành cơ sở 10 trước.
Dennis

2

Đôi khi đáng để đọc từ đầu vào tiêu chuẩn khi có chính xác hai đầu vào

Jelly được tối ưu hóa để lấy đầu vào từ các đối số dòng lệnh. Tuy nhiên, nó cũng được tối ưu hóa để viết các đơn nguyên hơn là các bản sao; với các dyads có rất nhiều ý nghĩa có thể có cho mỗi nội dung mà bạn thường cần dành các ký tự để định hướng, trong khi với các đơn vị thường có nhiều cách để nói điều tương tự.

Như vậy, nếu bạn sử dụng một trong hai đầu vào chỉ một lần, và vấn đề là như vậy mà nó không thể dễ dàng được đọc ngầm từ (ví dụ: bạn có cần phải làm cho rõ ràng, nếu không dành một nhân vật trên }, @hoặc các loại tương tự) , xem xét việc đọc nó từ đầu vào tiêu chuẩn Ɠthay vì đặt nó trên dòng lệnh; cho phép bạn đặt chính xác đầu vào ngay tại nơi bạn cần thông qua vị trí của bạn Ɠ, đồng thời đảm bảo rằng mọi đầu vào ngầm định khác sẽ được lấy từ đầu vào khác của bạn. Chi phí một byte và tiết kiệm một byte, và tùy thuộc vào vấn đề, cũng có thể lưu một byte thứ hai bằng cách cung cấp cho bạn nhiều phạm vi hơn để sắp xếp lại mã.


2

Có một số cách không rõ ràng để kiểm tra các thuộc tính của một đối số bằng cách sử dụng Ƒ. Dưới đây là một vài. Tôi bỏ qua rất nhiều công dụng của nhanh chóng này (Ví dụ , ŒuƑ, ) vì họ đã được các phương pháp đơn giản nhất để đạt được hành vi của họ.

OƑ  Is number?
ỌƑ  Is character? (errors on negative numeric input)
ḂƑ  Between 0 and 2? 0<=x<2 (python). <2aAƑƊ or of course ⁼Ḃ$ in Jelly.
ḞƑ  Is integer?
UƑ  Like `ŒḂ`, but checks if all sublists of depth 1 are palindromes.
ṠƑ  Is one of -1, 0, 1? (e-r1¤$)

Hãy chỉnh sửa nó để thêm các trường hợp thú vị hơn.


2

Bạn có thể muốn thử một trình soạn thảo trực tuyến Jelly Balls được thiết kế để dễ dàng xây dựng mã trong Jelly Language .

Các tính năng bao gồm:

  • Bảng lệnh với tất cả các nguyên tử và ký tự cú pháp được sắp xếp theo loại
  • Trình phân tích cú pháp trực tuyến nhận dạng chữ và các nguyên tử 2 byte trong mã
  • Trình thông dịch Jelly trong trình duyệt được đơn giản hóa để chạy mã Jelly của bạn trên trang web bằng javascript
  • Liên kết trực tiếp để chuyển mã vào TIO hoặc một phiên Jelly Balls khác
  • Gợi ý tự động
  • Tối ưu hóa cho thiết bị di động

Hãy dùng thử: https://jellyballs.github.io

Thạch bóng

  • Báo cáo theo dõi chi tiết cho thấy các đối số và kết quả của mỗi bước thực hiện

Thạch bóng

  • Mã báo cáo hiển thị mô tả của từng bước

Thạch bóng

  • Trang Bí quyết với các ví dụ Jelly

Thạch bóng

  • Trang mã tương tác của 256 ký tự Jelly

Thạch bóng



3
Tôi nghĩ rằng một liên kết đến một IDE cho phép bạn viết Jelly mà không cần bố trí bàn phím tùy chỉnh là một mẹo khá hữu ích. Nhiều người mới bắt đầu Jelly đã phải vật lộn với điều đó.
Dennis
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.