TryItOnquine Mücadelesi


48

( bu gönderiye ve ardından yapılan sohbet tartışmalarına dayanarak - ayrıca, TIO için Dennis'e çok teşekkürler!)

Meydan okuma

TryItOnline sitesinde mevcut olan bir dili seçin , örneğin PowerShell . Çalıştır düğmesine tıklandığında, o sayfadaki çıktının , Kaydet / Mağazada "Düz URL" alanındakiyle aynı olduğu gibi , o sayfaya herhangi bir giriş yapmayan bir kod yazın. bunun yerine düğmesine tıklanır.

Hayali bir örnek için, bunun aaaPowerShell'deki bir çözümün kodu olduğunu varsayalım . Ardından tıklayarak sonucu Çalıştır ile aaailgili kod olarak https://tio.run/#powershellgereken çıkış https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAyaparken de "Düz URL" alanına ise, Kaydet / Mağaza düğmesine tıklanır.

puanlama

Ortaya çıkan URL bu zorluğa senin teslimiyettir. Kazanan, bayt cinsinden ölçülen en kısa URL'dir. Yukarıdaki örnekte, URL https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA, 44 baytta mücadeleye gönderilen gönderimdir . Bu zorluğun gerisini yerine getiren en kısa URL, zoru kazanır ve kek puanları kazanır (puanlar ödenmez). Mümkün olan ayrı bir asgari uzunluk olduğu göz önüne alındığında, eğer iki başvuru uzunluğu birbirine bağlanırsa, önceki başvuru kazanır.

URL Üretimi

Bu , depodaki URL oluşturma algoritmasının başlangıcıdır. Ana kod alanının nasıl alındığını, herhangi bir fazladan elemanın eklendiğini, dizgenin söndüğünü ve Base64'ün nasıl dönüştürüldüğünü ve daha sonra hazırlandığını ##vb. Görebilirsiniz. Burada tam olarak ayrıntıya girmeyeceğim; Zorluğun bir kısmı, söz konusu algoritmadaki potansiyel tuhaflıklardan yararlanmak için URL'lerin nasıl üretildiğini çözümlemek ve anlamaktır.

Kurallar / Açıklamalar

  • Gerçek kod giriş yapmamalı ve çıktı olarak yalnızca quine-URL'yi üretmelidir.
    - doldurulması gereken tek metin alanları URL içine tıklayarak bu araçlardır Code, Header, Footerveya karşılık gelen "Derleyici Bayrak" alanları; Inputve Argumentsalanlar yasaktır ve boş / kullanılmayan kalmalıdır. Çalıştır düğmesine tıklamak sadece Outputalanı değiştirmelidir . Bu zorluk için, Debugalan tüm durumlarda göz ardı edilir.
  • Her zamanki quine kuralları, kod için mümkün olduğu kadar geçerlidir (örneğin, kod kendi kaynak kodunu üzerinden okuyamaz .code.tio).
  • Lütfen gönderiminizde kodun nasıl çalıştığına dair bir açıklama ekleyin.
  • Bir "hile" URL'si veya kısayol veya benzeri bir şey oluşturmak için TIO deposuna Git çekme isteği göndererek "hileli" bir quine gönderme yapılmasına izin verilmez.
  • Benzer şekilde, bir "numara" URL üretmek için belirli bir dili güncellemek için bir çekme isteği gönderilmesine izin verilmez.
  • Lütfen Dennis'in sunucularına nazik davranın ve onları kötüye kullanmayın ya da bu zorluğun uğruna istismarlar yapmayın.

14
Unutma, son kural önemlidir! Halen bir sürü DDoS saldırısı yaşanıyor.
Outgolfer Erik

"PR" nedir?
Adám

1
Hayali bir örnek: benim teslimiyettir eğer https://tio.run/##a+ao çıkışları bir programa hangi bağlantılara https://tio.run/##a+a, hatta tarafından oluşturulan bağlantıyı sert geçerlidir saveStateolurduhttps://tio.run/##a@a
TwiNight

1
@TwiNight İyi bir soru. Bu ilginç bir durum olacak, ancak buradaki kurallara uymayacak ve geçerli bir sunum olmayacaktı.
AdmBorkBork

1
Bunu göndermek için TIOv2'ya kadar mı bekliyordun?
mbomb007

Yanıtlar:


15

Python 2 , URL uzunluğu = 170 bayt

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])

Çevrimiçi deneyin!

Bu üç tesadüf esasına dayanır:

  1. Varsayılan zlib seviye 6, bu dize için zlib seviye 9 ile aynı sonuçları verir, bu da çıkardığım başlığı modulo olarak verir.
  2. Sıkıştırılmış uzunluk 3 ile bölünebilir, bu nedenle base64 herhangi bir =dolgu karakteri oluşturmaz .
  3. Base64 çıkışı hiç +karakter içermiyor .

15

Bash , 174 166 165 157 bayt

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

Bu, aşağıdaki Bash programını kodlar.

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

Çevrimiçi deneyin!

@ Jimmy23013'e, orijinal yaklaşımımdan 8 byte golf attığım, başka bir byte'ı kurtardığı bir yaklaşım için ve bu yaklaşımdan 8 byte daha attığım için teşekkürler!



1
@ jimmy23013 Terminalime yazdığım sayıyı sayamıyorum base64 | tr -d \\n... Teşekkürler!
Dennis,

tio.run/##S0oszvj/… Maalesef nasıl çıkaracağımı bilmediğim bir + değeri var.
jimmy23013

@ jimmy23013 Ondan kurtulmayı başardı, ancak üç bayta mal oldu. Sinir bozucu bir şekilde, tio.run/##S0oszvj/… o + 'dan kurtulur, ancak başka bir tanesini tanıtır.
Dennis,

3
@ SteveBennett İyi bir nedenim olduğunu düşünüyorum. Yine de tam olarak hatırlamıyorum.
Dennis,

12

Pyth , URL uzunluğu = 134 bayt

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

Kod:

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

Çevrimiçi deneyin!

Pyth'in zlib builtin ( .Z) işlevini ve base64 satır içi uygulamasını kullanır.

Nasıl çalışır

Dış sahne:

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

Dize içindeki boşlukların Jçift ​​tırnak işaretleri ile değiştirilmesiyle elde edilen iç aşama :

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

(“Giriş” alanının izin vermemesi çok kötü, yoksa 118 baytlık bir çözüme sahip olabilirim .)


1
TIO‽ etrafında inşa edilmiş bir meydan okuma sadece Dennis outgolf sen ... mı
Tost Mühendis

4

PowerShell, 274 bayt

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

Hepsi aşağıdaki snippet sayesinde:

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

Çevrimiçi deneyin!


Tanrım, bu cevaba nasıl ulaştığını açıklayabilir misin? Java'da veya başka bir şeyde denesem bile deneme yanılmadı.
Magic Octopus Urn

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.