Thử thách Thử thách


48

(dựa trên bài đăng nàycuộc thảo luận tiếp theo về trò chuyện - đồng thời, cảm ơn Dennis cho TIO!)

Các thách thức

Chọn một ngôn ngữ hiện có sẵn trên trang web TryItOnline , ví dụ PowerShell . Viết mã bằng ngôn ngữ đó trên trang đó, không lấy bất kỳ đầu vào nào, chẳng hạn như khi nhấp vào nút Run , đầu ra trên trang đó giống hệt như trong trường "URL thuần túy" khi Lưu / Lưu trữ nút được bấm thay thế.

Đối với một ví dụ hư cấu, giả sử đó aaalà mã cho một giải pháp cho vấn đề này trong PowerShell. Sau đó, kết quả của việc nhấp Chạy với aaamã trên https://tio.run/#powershellsẽ xuất ra https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA, đây cũng là trường "URL thuần túy" khi nhấp vào nút Lưu / Lưu trữ .

Chấm điểm

Các URL kết quả là trình của bạn để thách thức này. Người chiến thắng là URL ngắn nhất được đo bằng byte. Đối với ví dụ trên, URL https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAlà bài nộp cho thử thách, ở mức 44 byte . URL ngắn nhất đáp ứng phần còn lại của thử thách này sẽ chiến thắng thử thách và kiếm được điểm brownie (điểm không thể đổi được). Cho rằng có một độ dài tối thiểu khác biệt có thể, nếu hai lần gửi có độ dài ràng buộc, lần gửi trước đó sẽ thắng.

Tạo URL

Đây là sự khởi đầu của thuật toán tạo URL trong kho lưu trữ. Bạn có thể xem khu vực mã chính được lấy như thế nào, bất kỳ yếu tố bổ sung nào được thêm vào, chuỗi bị xì hơi và Base64 được chuyển đổi, sau đó được ##thêm vào, v.v. Tôi sẽ không đi vào chi tiết đầy đủ ở đây; một phần của thách thức là phân tích và hiểu cách các URL được tạo để khai thác bất kỳ quirks tiềm năng nào trong thuật toán nói trên.

Quy tắc / Làm rõ

  • Mã thực tế sẽ không nhận đầu vào và chỉ tạo ra quine-URL làm đầu ra.
    - Đây có nghĩa là các trường văn bản duy nhất mà nên được dân cư khi nhấp vào URL là Code, Header, Footerhoặc tương ứng với "biên dịch Cờ" lĩnh vực; các InputArgumentscác lĩnh vực cấm và phải còn trống / không sử dụng. Nhấp vào nút Run chỉ nên thay đổi Outputtrường. Đối với thử thách này, Debuglĩnh vực này bị bỏ qua trong tất cả các tình huống.
  • Các quy tắc quine thông thường áp dụng cho mã trong phạm vi có thể (ví dụ: mã không thể đọc mã nguồn của chính nó thông qua .code.tio).
  • Vui lòng bao gồm một mô tả về cách mã hoạt động trong trình của bạn.
  • Gửi một câu hỏi "gian lận" bằng cách gửi yêu cầu kéo Git đến kho lưu trữ TIO để tạo URL hoặc "phím tắt" hoặc tương tự không được phép.
  • Tương tự, việc gửi yêu cầu kéo để cập nhật một ngôn ngữ cụ thể để tạo URL "lừa" không được phép.
  • Xin hãy tử tế với các máy chủ của Dennis và đừng lạm dụng chúng hoặc cố gắng khai thác vì lợi ích của thử thách này.

14
Hãy nhớ rằng, quy tắc cuối cùng là quan trọng! Đã có một loạt các cuộc tấn công DDoS đang diễn ra.
Erik the Outgolfer 19/07/17

"PR" là gì?
Adám

1
Ví dụ hư cấu: nếu nội dung gửi của tôi https://tio.run/##a+aliên kết đến chương trình xuất ra https://tio.run/##a+a, thì nó có hợp lệ hay không, liên kết được tạo bởi saveStatesẽ làhttps://tio.run/##a@a
TwiNight

1
@TwiNight Câu hỏi hay. Đó sẽ là một tình huống thú vị, nhưng sẽ không phù hợp với các quy tắc ở đây và do đó sẽ không phải là một đệ trình hợp lệ.
admBorkBork

1
Bạn đã chờ đợi cho đến khi TIOv2 đăng bài này?
mbomb007

Câu trả lời:


15

Python 2 , độ dài URL = 170 byte

https://tio.run/##K6gsycjPM/r/v9hWqQDCjqlISwPhYlvVIuvM3IL8ohKFpMTiVDMT64KizLwS9YySkoJiK339ksx8vaLSPH1lZXVtiAK9JDOT1Lzk/JRUDY1iVdViTT0YT70qJzNJXVMz2shK1yRWE2aHEkUW4Db//38A
s="python2\xff\xffs=%r;import base64;print'https://tio.run/##'+base64.b64encode((s%%s).encode(('zlib'))[2:-4])\xff\xff";import base64;print'https://tio.run/##'+base64.b64encode((s%s).encode(('zlib'))[2:-4])

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

Điều này dựa trên ba sự trùng hợp:

  1. Zlib cấp 6 mặc định xảy ra để cho kết quả tương tự như zlib cấp 9 cho chuỗi này, điều chỉnh tiêu đề mà tôi tước.
  2. Độ dài nén chia hết cho 3, vì vậy base64 không tạo ra bất kỳ =ký tự đệm nào .
  3. Đầu ra base64 không chứa bất kỳ +ký tự nào .

15

Bash , 174 166 165 157 byte

https://tio.run/##S0oszvj/v6QosUBBV1dBvaAoM68kTSGjpKSg2EpfvyQzP0avqDRPX1lZRQMqp6RaHFORlgbCSgpJQO0KSgkg/QlKNelVmQU1JYmZOQq6ydqGhjVA2VQzEwXdckNjS011BdcIz5D//wE

Điều này mã hóa chương trình Bash sau đây.

trap -- 'printf https://tio\.run/##$(printf "%s\xff\xff" bash "`trap`"|gzip|tail -c+11|base64 -w139)' EXIT

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

Cảm ơn @ jimmy23013 vì đã đánh golf 8 byte khỏi cách tiếp cận ban đầu của tôi, vì một cách tiếp cận đã lưu một byte khác và để đánh gôn thêm 8 byte theo cách tiếp cận đó!



1
@ jimmy23013 Tôi không thể đếm số lần tôi đã nhập base64 | tr -d \\nvào thiết bị đầu cuối của mình ... Cảm ơn!
Dennis

tio.run/##S0oszvj/ không may là nó có + mà tôi không biết cách xóa.
jimmy23013

@ jimmy23013 Được quản lý để loại bỏ nó, nhưng nó có giá ba byte. Khó chịu , tio.run/##S0oszvj/ từ bỏ điều đó + nhưng giới thiệu một cái khác ở nơi khác.
Dennis

3
@SteveBennett Tôi nghĩ rằng tôi đã có một lý do tốt. Tôi không nhớ nó lắm.
Dennis

12

Pyth , độ dài URL = 134 byte

https://tio.run/##K6gsyfj/X68syy/ZS6lYmyujpKSg2EpfvyQzX6@oNE9fWZnLwae4OLrI3dA9NITLQZ9LM8vZxqSkRC@qOJqrAKiby9vZyNTUmwtiBpefl7e3ppnJ//8A

Mã số:

.vjNcJ"s+
https://tio.run/##
@Lss[rG1GUT
@/
)jC<4tt.Zs[
pyth
KC255K
.vjNcJ
NJKK)64

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

Sử dụng zlib dựng sẵn của Pyth ( .Z) và triển khai nội tuyến của base64.

Làm thế nào nó hoạt động

Giai đoạn bên ngoài:

.vjNcJ"…
      "…    take this 75-byte string
     J      assign it to J
    c       split on whitespace
  jN        join on N = '"'
.v          evaluate as Pyth code

Giai đoạn bên trong, thu được bằng cách thay thế khoảng trắng trong chuỗi Jbằng dấu ngoặc kép:

s+"https://tio.run/##"@Lss[rG1GUT"@/")jC<4tt.Zs["pyth"KC255K".vjNcJ"NJKK)64
                                               [                             begin a list:
                                                "pyth"                         string,
                                                       C255                    character 255
                                                      K                        assign that to K,
                                                           K                   K again,
                                                            ".vjNcJ"           string,
                                                                    N          '"',
                                                                     J         J (the 75-byte string),
                                                                      K        K again,
                                                                       K       K again
                                                                        )    end list
                                              s  concatenate
                                            .Z   compress with zlib
                                           t     remove first character
                                          t      remove first character
                                        <4       remove last 4 characters
                                       C         convert from base 256
                                      j                                  64
                                                 convert to base 64 digits
                      @L                         map d ↦ the following indexed at d:
                          [                        begin a list:
                            G                        alphabet ("abcdefghijklmnopqrstuvwxyz")
                           r 1                       uppercase,
                              G                      alphabet again,
                               UT                    unary range of length T = 10: [0, …, 9],
                                 "@/"                string,
                                     )             end list
                         s                         concatenate
                        s                          concatenate (we now have the base64 alphabet)
 +"https://tio.run/##"                           prepend string
s                                                concatenate

(Thật tệ khi trường Nhập dữ liệu đầu vào không được phép hoặc tôi có giải pháp 118 byte .)


1
Có phải ... Bạn vừa vượt qua Dennis trong một thử thách được xây dựng xung quanh TIO‽
Kỹ sư Toast

4

PowerShell, 274 byte

https://tio.run/##TY/rCsIwDIVfZaiYFV2HooIbgu8xBrYzboXSljYq3p59VkHZjxAOJydf4uwVfehQ676fphO5e1TK8pPSWBfF1StCobW8EYYUJMyrphO@qmtw/xzMluv1t37maJoePpsm8sVGP5eV7V25JDslsozmgOJRHAcQ3t6BldARuVDkOcVBfzb5eAwRYM0FPcUQWSkCblaBvDJtPLxaLDmPnTf2bCjbsppxj06LBlPYwRxgoGdR74E9vw9mnQ2UZObF@v4N

Tất cả là nhờ đoạn trích sau:

&($b={[io.file]::writeallbytes('b',[char[]]'powershell'+255+255+[char[]]"&(`$b={$b})"+255+255);gzip -f b;$b=[io.file]::readallbytes('b.gz');'https://tio.run/##'+[convert]::tobase64string($b[12..($b.count-9)]).replace('=','').replace('+','@')|write-host -n})

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


Chúa ơi, bạn có thể giải thích làm thế nào bạn có câu trả lời này? Nếu tôi thậm chí đã thử trong Java hoặc một cái gì đó thì đó là bản dùng thử và lỗi thuần túy.
Bạch tuộc ma thuật Urn

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.