Tantangan TryItOnquine

48

(berdasarkan posting ini dan diskusi selanjutnya tentang obrolan - juga, terima kasih banyak kepada Dennis untuk TIO!)

Tantangan

Pilih bahasa yang saat ini tersedia di situs TryItOnline , misalnya PowerShell . Tulis kode dalam bahasa itu pada halaman itu, yang tidak mengambil input apa pun, sehingga ketika tombol Run diklik, output pada halaman itu sama persis dengan apa yang ada di bidang "URL Biasa" ketika Simpan / Simpan tombol diklik sebagai gantinya.

Sebagai contoh fiktif, anggap itu aaaadalah kode untuk solusi ini di PowerShell. Kemudian, hasil mengklik Jalankan dengan aaasebagai kode aktif https://tio.run/#powershellakan ditampilkan https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA, yang juga merupakan bidang "URL Biasa" ketika tombol Simpan / Simpan diklik.

Mencetak gol

The URL yang dihasilkan adalah kiriman Anda untuk tantangan ini. Pemenangnya adalah URL terpendek yang diukur dalam byte. Untuk contoh di atas, URL https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAadalah pengajuan tantangan, sebesar 44 byte . URL terpendek yang memenuhi sisa tantangan ini memenangkan tantangan dan mendapatkan poin brownies (poin tidak dapat ditukarkan). Mengingat bahwa ada panjang minimum yang mungkin yang berbeda, jika dua pengajuan panjang, pengajuan sebelumnya menang.

Pembuatan URL

Ini adalah awal dari algoritma pembuatan URL di repositori. Anda dapat melihat bagaimana area kode utama diambil, setiap elemen tambahan ditambahkan, string dikempiskan dan Base64 dikonversi, dan kemudian ##ditambahkan, dll. Saya tidak akan membahas detail selengkapnya di sini; bagian dari tantangannya adalah mem-parsing dan memahami bagaimana URL dihasilkan untuk mengeksploitasi setiap quirks potensial dalam algoritma tersebut.

Aturan / Klarifikasi

  • Kode aktual tidak boleh mengambil input dan hanya menghasilkan URL-quine sebagai output.
    - Ini berarti satu-satunya bidang teks yang harus diisi ketika mengklik ke URL adalah Code, Header, Footeratau sesuai "Compiler Flag" ladang; yang Inputdan Argumentsbidang dilarang dan harus tetap kosong / tidak terpakai. Mengklik tombol Run seharusnya hanya mengubah Outputbidang. Untuk tantangan ini, Debugbidang ini diabaikan dalam semua situasi.
  • Aturan quine biasa berlaku untuk kode sejauh mungkin (misalnya, kode tidak dapat membaca kode sumbernya sendiri melalui .code.tio).
  • Harap sertakan deskripsi tentang bagaimana kode bekerja dalam kiriman Anda.
  • Mengirimkan quine "curang" dengan mengirimkan permintaan tarik Git ke repositori TIO untuk membuat URL "trik" atau pintasan atau sejenisnya tidak diizinkan.
  • Demikian pula, mengirimkan permintaan tarik untuk memperbarui bahasa tertentu untuk menghasilkan URL "trik" tidak diizinkan.
  • Harap bersikap baik pada server Dennis dan jangan menyalahgunakannya atau mencoba eksploitasi demi tantangan ini.
AdmBorkBork
sumber
14
Ingat, aturan terakhir itu penting! Sudah ada banyak serangan DDoS yang terjadi.
Erik the Outgolfer
Apa itu "PR"?
Adám
1
Contoh fiktif: jika kiriman saya adalah https://tio.run/##a+atautan ke program yang menghasilkan https://tio.run/##a+a, apakah valid meskipun tautan yang dihasilkan saveStateadalahhttps://tio.run/##a@a
TwiNight
1
@ Janwi Pertanyaan bagus. Itu akan menjadi situasi yang menarik, tetapi tidak akan sesuai dengan aturan di sini dan karenanya tidak akan menjadi pengajuan yang valid.
AdmBorkBork
1
Apakah Anda menunggu hingga TIOv2 memposting ini?
mbomb007

Jawaban:

15

Python 2 , panjang 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])

Cobalah online!

Ini bergantung pada tiga kebetulan:

  1. Zlib level 6 default terjadi untuk memberikan hasil yang sama seperti zlib level 9 untuk string ini, modulo header yang saya strip.
  2. Panjang terkompresi dapat dibagi 3, jadi base64 tidak menghasilkan =karakter padding.
  3. Output base64 tidak mengandung +karakter apa pun .
Anders Kaseorg
sumber
15

Bash , 174 166 165 157 byte

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

Ini mengkodekan program Bash berikut.

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

Cobalah online!

Terima kasih kepada @ jimmy23013 untuk bermain golf 8 byte dari pendekatan awal saya, untuk pendekatan yang menghemat byte lain, dan untuk bermain golf 8 byte lainnya dari pendekatan itu!

Dennis
sumber
1
@ jimmy23013 Saya tidak bisa menghitung berapa kali saya mengetik di base64 | tr -d \\nterminal ... Terima kasih!
Dennis
tio.run/##S0oszvj/... Sayangnya ia memiliki tanda + yang saya tidak tahu cara menghapusnya.
jimmy23013
@ jimmy23013 Berhasil menyingkirkannya, tetapi harganya tiga byte. Mengganggu, tio.run/##S0oszvj/… menyingkirkan itu + tetapi memperkenalkan yang lain di tempat lain.
Dennis
3
@ SveveBennett Saya pikir saya punya alasan yang bagus. Saya tidak begitu ingat itu.
Dennis
12

Pyth , panjang URL = 134 byte

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

Kode:

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

Cobalah online!

Menggunakan zlib builtin ( .Z), dan implementasi inline dari base64.

Bagaimana itu bekerja

Tahap luar:

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

Tahap dalam, diperoleh dengan mengganti spasi putih dalam string Jdengan tanda kutip ganda:

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

(Sayang sekali bidang "Input" tidak diizinkan, atau saya akan memiliki solusi 118 byte .)

Anders Kaseorg
sumber
1
Apakah ... Apakah Anda baru saja mengalahkan Dennis pada tantangan yang dibangun di sekitar TIO‽
Engineer Toast
4

PowerShell, 274 byte

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

Ini semua berkat cuplikan berikut:

&($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})

Cobalah online!

Andrei Odegov
sumber
Astaga, bisakah Anda menjelaskan bagaimana Anda mendapatkan jawaban ini? Jika saya mencoba di Jawa atau sesuatu itu akan murni trial and error.
Magic Octopus Mm
4

JavaScript (Node.js) , 214 byte

v=()=>console.log('https://tio.run/##'+require(`zlib`).deflateRawSync(Buffer.from(`javascript-node\xff\xffv=`+v+`;v()\xff\xff`,`ascii`)).toString("base64"));v()

Cobalah online!

pengguna202729
sumber