TryItOnquine 챌린지


48

( 게시물과 채팅에 대한 다음 토론 을 바탕으로 -TIO를위한 Dennis에게도 감사드립니다!)

도전

TryItOnline 사이트 에서 현재 사용 가능한 언어 ( 예 : PowerShell)를 선택하십시오 . 실행 버튼을 클릭 할 때 해당 페이지의 출력 이 저장 / 저장 시 "일반 URL"필드의 내용 과 정확히 동일 하도록 해당 페이지 에 해당 언어로 해당 언어로 코드를 작성 하십시오. 대신 버튼을 클릭하십시오.

가상의 예를 들어, aaa이것이 PowerShell의 솔루션에 대한 코드 라고 가정하십시오 . 그런 다음, 클릭의 결과 실행aaa의 코드로 https://tio.run/#powershell출력합니다 https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA때 또한 "일반 URL"필드, 저장 / 저장 버튼을 클릭.

채점

결과 URL은 이 문제에 제출합니다. 승자는 바이트 단위로 측정 된 가장 짧은 URL입니다. 위의 예에서 URL https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AA은 챌린지에 대한 44 바이트 의 제출 입니다. 이 챌린지의 나머지를 수행하는 가장 짧은 URL은 챌린지에서 이기고 브라우니 포인트를 얻습니다 (사용할 수없는 포인트). 가능한 최소 길이가 있다고 가정 할 때 두 개의 제출 길이가 긴 경우 이전 제출이 우선합니다.

URL 생성

이것이 저장소에서 URL 생성 알고리즘의 시작입니다. 메인 코드 영역이 어떻게 취해지고, 추가 요소가 추가되고, 문자열이 수축되고 Base64로 변환 된 다음 ##앞에 붙는 방법 등을 볼 수 있습니다. 여기서는 자세히 설명하지 않습니다. 문제의 일부는 상기 알고리즘에서 잠재적 인 단점을 이용하기 위해 URL이 어떻게 생성되는지 분석하고 이해하는 것이다.

규칙 / 설명

  • 실제 코드는 입력을받지 않고 quine-URL 만 출력으로 생성해야합니다.
    - 이것은 URL로 클릭하면됩니다 채워야하는 유일한 텍스트 필드를 의미 Code, Header, Footer또는 "컴파일러 신고"필드에 대응 InputArguments필드는 금지하고 사용하지 않는 / 빈 유지해야합니다. 실행 버튼을 클릭하면 Output필드 만 변경 됩니다. 이 문제의 경우 Debug모든 상황에서 필드가 무시됩니다.
  • 일반적인 quine 규칙은 가능한 한 코드에 적용됩니다 (예를 들어, 코드는을 통해 자체 소스 코드를 읽을 수 없음 .code.tio).
  • 제출시 코드 작동 방식에 대한 설명을 포함하십시오.
  • "트릭"URL 또는 바로 가기 등을 생성하기 위해 GIO 풀 요청을 TIO 저장소에 제출하여 "치과"퀴니를 제출하는 것은 허용되지 않습니다.
  • 마찬가지로 "트릭"URL을 생성하기 위해 특정 언어를 업데이트하기 위해 풀 요청을 제출할 수 없습니다.
  • Dennis의 서버에 친절하고이 서버를 남용하거나이 문제를 악용하려는 시도를하지 마십시오.

14
마지막 규칙이 중요하다는 것을 기억하십시오! 이미 많은 DDoS 공격이 진행되고 있습니다.
Outgolfer Erik

"PR"은 무엇입니까?
Adám

1
가상의 예 : 내 제출물이 https://tio.run/##a+a출력하는 프로그램으로 연결되는 링크 인 경우 https://tio.run/##a+a, 생성 된 링크가 너무 힘들 saveState수도 있습니다.https://tio.run/##a@a
TwiNight

1
@TwiNight 좋은 질문입니다. 흥미로운 상황이지만 여기의 규칙에 맞지 않으므로 올바른 제출이 아닐 것입니다.
AdmBorkBork

1
TIOv2가 이것을 게시 할 때까지 기다리고 있었습니까?
mbomb007

답변:


15

Python 2 , URL 길이 = 170 바이트

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

온라인으로 사용해보십시오!

이것은 세 가지 우연의 일치에 의존합니다 :

  1. 기본 zlib 레벨 6은이 문자열에 대해 zlib 레벨 9와 동일한 결과를 제공하며, 내가 제거하는 헤더를 모듈로합니다.
  2. 압축 길이는 3으로 나눌 수 있으므로 base64는 =패딩 문자를 생성하지 않습니다 .
  3. base64 출력에는 +문자 가 없습니다 .

15

배시 , 174 166 165 157 바이트

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

다음 Bash 프로그램을 인코딩합니다.

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

온라인으로 사용해보십시오!

내 원래 접근 방식에서 8 바이트를 골프로 치는 것에 대한 @ jimmy23013, 다른 바이트를 절약 한 접근 방식으로, 그리고 그 접근에서 다른 8 바이트를 골프로 줘서 감사합니다!



1
@ jimmy23013 base64 | tr -d \\n터미널에 입력 한 횟수를 셀 수 없습니다 ... 감사합니다!
Dennis

tio.run/##S0oszvj/… 불행히도 제거 방법을 모르는 +가 있습니다.
jimmy23013

@ jimmy23013 그것을 제거하기 위해 관리되었지만 3 바이트가 들었습니다. 짜증나게 , tio.run/##S0oszvj/… 는 그 +를 제거하지만 다른 곳을 소개합니다.
Dennis

3
@SteveBennett 나는 좋은 이유가 있다고 생각합니다. 그래도 기억이 나지 않습니다.
Dennis

12

Pyth , URL 길이 = 134 바이트

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

암호:

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

온라인으로 사용해보십시오!

Pyth의 zlib 내장 ( .Z)과 base64의 인라인 구현을 사용합니다.

작동 원리

외부 무대 :

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

문자열의 공백 J을 큰 따옴표 로 바꾸어 얻은 내부 단계 :

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

(“입력”필드가 허용되지 않거나 118 바이트 솔루션 이 너무 나쁩니다 .)


1
... 그냥 TIO‽ 중심으로 도전에 데니스 outgolf나요나요
토스트 엔지니어

4

PowerShell, 274 바이트

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

다음 스 니펫 덕분입니다.

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

온라인으로 사용해보십시오!


거룩한 그리스도, 이 대답에 어떻게 도달 했는지 설명해 주 시겠습니까? Java 또는 다른 것을 시도해도 순수한 시행 착오 일 것입니다.
매직 문어 Urn

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.