결함이있는 XKCD 브라우저 구축


75

도전

XKCD 만화의 수를 고려하면 해당 만화의 제목 텍스트 (마우스 오버 텍스트)를 출력하십시오.

숫자를 주어진 때, 프로그램 오류가 발생한다 859404.

규칙

주어진 숫자는 항상 기존 만화입니다 (제외 404).

프로그램은 859또는 이외의 다른 숫자에 대해 오류를 발생시키지 않아야합니다 404.

참고로 만화 404는 존재하지 않으며 다음과 859같습니다.

Brains aside, I wonder how many poorly-written xkcd.com-parsing scripts will break on this title (or ;;"''{<<[' this mouseover text."

URL 단축기는 허용되지 않습니다. 인터넷을 사용하여 제목 텍스트를 얻을 수 있습니다.

Input > Output
1642 > "That last LinkedIn request set a new record for the most energetic physical event ever observed. Maybe we should respond." "Nah."
1385 > ::PLOOOOSH:: Looks like you won't be making it to Vinland today, Leaf Erikson.
1275 > If replacing all the '3's doesn't fix your code, remove the 4s, too, with 'ceiling(pi) / floor(pi) * pi * r^floor(pi)'. Mmm, floor pie.
1706 > Plus, now I know that I have risk factors for elbow dysplasia, heartworm, parvo, and mange.

하사품

나는 숫자 8을 확인하는 대신 잘못 작성 되었기 때문에 comic 859에서 실패한 가장 짧은 답변에 현상금을 수여 할 것입니다.

괄호, 인용 부호 등이 일치하지 않으면 다른 대체 텍스트 (예 : 744)에서 프로그램이 중단 될 수 있습니다.

승리

바이트 단위의 최단 코드가 이깁니다.


2
스크립트를 대체하는 대체 텍스트가있는 다른 만화가 있기 때문에 ( 744 참조 ), 프로그램이 그러한 텍스트를 깨뜨려 도 괜찮습니까?
완전히 인간적인

8
@totallyhuman 당신은 그것에 약간의 NSFW 경고를 추가해야합니다 : P
HyperNeutrino

11
도전의 모순 : " 859또는 404" 이외의 다른 숫자에 대해서는 오류를 발생시키지 말아야 하며 "다른 대체 텍스트에서는 깨질 수 있습니다".
aschepler 2016 년

3
@aschepler 후자는 현상금에만 해당됩니다
Beta Decay

4
@ Kzqai 좋은 질문이지만 DDOS에 포함 된 트래픽 양과 xkcd.com의 트래픽 양을 약간 과소 평가하고 있다고 생각합니다. 여기에서 답변을 통해 생성 된 트래픽이 둘 중 어느 것에 비해 중요하지 않을 것입니다.
trichoplax

답변:


107

파이썬 2.7 + xkcd , 55 바이트

xkcd 는 타사 Python 패키지입니다. 파이썬에는 모든 것을 위한 패키지가 있습니다 !

lambda n:[xkcd.getComic(n).altText][n==859]
import xkcd

의 경우 404 : urllib2.HTTPError: HTTP Error 404: Not Found

의 경우 859 : IndexError: list index out of range


89
패키지는이 도전하기 전에 작성되었습니다 구체적으로 작성되지 않은 위해 이 문제, 그냥 될 수있을 테니까요 매우 적합합니다.
Draco18s 2016 년

4
와우, 파이썬이 더 매력적으로되었습니다!
Nat


6
우연히도, 파이썬은 실제로 import'ing을 지원 합니다 antigravity.
또 다른 사용자

39
파이썬은 Mathematica에게 이런 도전을 했습니까?
Arcturus

22

파이썬 2 + 요청 , 104 (102) 95 94 바이트

Outgolfer 에릭 덕분에 -2 바이트. Jonathan Allan 덕분에 -1 바이트.

lambda n:[get('http://xkcd.com/%d/info.0.json'%n).json()['alt']][n==859]
from requests import*

의무 사항 :

import antigravity

잘못 작성된 스크립트, 98 바이트

따라서 좋지 않은 스크립트를 작성하는 것은 실제로 의도적으로 수행하기가 어렵습니다. 다른 만화에는 인용 부호가 포함되어 있기 때문에 다른 만화에도 적용되지 않습니다.

from requests import*
exec'print "%s"'%get('http://xkcd.com/%d/info.0.json'%input()).json()['alt']

4
나는 당신이 제거 할 수 있다고 생각합니다 ,a.
Outgolfer 에릭

1
당신은 변경할 수 있습니다 n in[404,859]n==859json으로 디코더가 실패하기 때문에, 404어쨌든.
musicman523

7
... http://여기에서도 사용할 수 있다고 생각합니다.
Jonathan Allan

1
실제로 이것을 매개 변수로 어떻게 실행합니까? 이름없는 람다를 어떻게 운영합니까?
MrZander

1
@MrZander 첫 번째 줄은 실행할 변수에 할당 할 수있는 익명의 람다입니다. 예를 들어, 둘 다 f = lambda n: n * 2; print f(2)또는 (lambda n: n * 2)(2)4를 인쇄합니다.
완전히 인간적인

18

파이썬 2 + xkcd, 82 바이트

잘못 작성된 스크립트

lambda n:eval("'''%s'''"%xkcd.getComic(n).altText.replace(';;',"'''"))
import xkcd

'''텍스트 에을 포함하지 않는 한 '''다른 따옴표에도 불구 하고 추가 하지 않고 추가 합니다. 즉, 텍스트에가 포함되어있는 경우를 제외하고 ;;'''(제거 re) 로 바뀝니다 . 이 경우에만 적용 859되므로이 코드는 계속 작동 859합니다. :피

또한, 하나는 결코해야 eval하는 경우 때문에 임의의 인터넷 컨텐츠, xkcd.getComic(n).altText어떻게 든되었고 '''+__import__('os').system('rm -rf / --no-preserve-root')+''', 많은 나쁜 일이 일어날 발생할 것입니다. 즉, sudo에서 codegolf 프로그램을 실행하지 않는 한 컴퓨터에서 sudo 이외의 사용자가 액세스 할 수있는 모든 항목을 삭제합니다 (권장하지 않음) : P


1
해당 테스트 사례에 대해 잘못 작성되고 실패합니다 859. 누군가가 현상금을받을 거라고 생각합니다.
Mr. Xcoder

12
아 인터넷에서 임의의 콘텐츠를 피하기위한 비난-브라보! : P
Luke Briggs

@LukeBriggs 이론적으로 안전해야합니다 ... 내 컴퓨터는 아직 폭발하지 않았 으므로 괜찮을까요? : P 그러나 당신이 정말로 원한다면 __import__('ast').literal_eval대신에 대신 사용할 수 있습니다 eval: P
HyperNeutrino

744에서 깨지나요?
Draco18s

@ Draco18s 삼중 따옴표는 불일치 따옴표를 신경 쓰지 않으므로해서는 안됩니다 ;;.
HyperNeutrino

11

볼프람 언어 / 티카, 118 117 바이트

numbermanic 덕분에 바이트를 저장했습니다.

If[ImportString[#,"HTML"]===#,#,$Failed]&@Import[StringTemplate["http://xkcd.com/``/info.0.json"]@#,"RawJSON"]@"alt"&

설명:

StringTemplate입력에서 URL을 형성하는 데 사용 합니다.

Import[..., "RawJSON"]JSON 객체를 가져 와서로 구문 분석합니다 Assocation.

키 값을 선택하십시오 "alt".

이 결과를 가져 와서 문자열을 HTML ( Import[#,"HTML"]) 로 해석하십시오 . 이것이 변경되지 않으면 결과를 반환하고 반환하면 결과를 전달합니다 $Failed. 이것은 859를 잡기 때문에

ImportString[
 "Brains aside, I wonder how many poorly-written xkcd.com-parsing 
  scripts will break on this title (or ;;\"''{<<[' this mouseover text.\"","HTML"]

결과 :

Brains aside, I wonder how many poorly-written xkcd.com-parsing 
scripts will break on this title (or ;;"''{

404 때문에 실패

If[
 ImportString[$Failed["alt"], "HTML"] === $Failed["alt"], 
 $Failed["alt"],
 $Failed]

결과 $Failed.


어떤 버전을 사용하고 있습니까? 나는 The Import element "RawJSON" is not present when importing as JSON10.0.1을 얻는다.
Julian Wolf

@totallyhuman 글쎄 그것은 아마 859를 확인할 필요가 없습니다. (질문의 현상금 조건을 참조하십시오)
Beta Decay

@ JulianWolf 11.1.0을 사용하고 있습니다. "RawJSON"지원이 10.2에 추가 된 것 같습니다.
chuy

4
@totallyhuman 명시 적 검사를 수행하지는 않지만 그게 ImportString[#,"HTML"]전부입니다.
chuy

1
@numbermaniac 실제로 할 수 있습니다. 내가 그것을 놓쳤다는 것을 믿을 수 없다, 감사합니다!
chuy

8

자바 8 255 176 바이트

바보처럼 느끼고 79 바이트를 줄인 @ OlivierGrégoire에게 감사드립니다. ;)

i->new java.util.Scanner(new java.net.URL("http://xkcd.com/"+i+"/info.0.json").openStream()).useDelimiter("\\a").next().replaceFirst(".*\"alt\": \"","").replaceFirst("\".*","")

이것은 너무 무겁게 느껴집니다 ... 여전히 무겁지 만 자바에는 "괜찮습니다"...

설명:

  • i->{...} 같은 람다 String <name>(int i) throws Exception
  • new java.util.Scanner(...).setDelimiter("\\a").next() 주어진 것에서 모든 것을 읽으십시오 InputStream
    • new java.net.URL("http://xkcd.com/"+i+"/info.0.json").openStream()이것은 원하는 만화의 정보 페이지 인 InputStream응답 본문을 참조하는http://xkcd.com/{comic_id}/info.0.json
    • replaceFirst(".*\"alt\": \"","").replaceFirst("\".*","") 대체 텍스트를 제외한 모든 것을 제거합니다 (첫 번째 큰 따옴표까지).
  • 암시 적 반환

더 짧은 대안, Java + json.org, 150

i->i==859?new Long(""):new org.json.JSONObject(new org.json.JSONTokener(new java.net.URL("http://xkcd.com/"+i+"/info.0.json").openStream())).get("alt")

이것은 내 해결책이 아니므로 이것을 첫 번째로 게시하고 싶지 않습니다. 모든 크레딧은 @ OlivierGrégoire에 속합니다.


1
수입품이 없습니다! . 또한, 골프와 거의 제로 시도이 답변이 ...있다
올리비에 그레 구 아르

추가되었습니다. 2 ^ 8 미만입니다. 적어도 내을 programm의 크기 : 한 바이트에 맞는
로마 그라프

i->new java.util.Scanner(new java.net.URL("http://xkcd.com/"+i+"/info.0.json").openStream()).useDelimiter("\\a").next().replaceFirst(".*\"alt\": \"","").replaceFirst("\".*","")(176 바이트, SO의 주석 커터 문자에주의) 그리고 나는 여기에 거의 아무것도 골프를하지 않았다.
Olivier Grégoire

오! 나는 Scanner#useDelimiter무효를 반환 생각 ... 다음에 더 나은 문서를 읽을;)
로마 Gräf

1
방금 Function예외를 던질 수있는 자신 만의 클래스를 만들 수 있다는 것을 알았습니다 . 오늘은 제 하루가 아닙니다.
Roman Gräf 2016 년

7

PHP, 89 86 85 바이트

<?=($a=$argv[1])==859?_:@json_decode(file("http://xkcd.com/$a/info.0.json")[0])->alt;

404 및 859에 대해 null을 반환

xkcd.php로 저장하고 만화 번호로 실행하십시오 ...

$ php xkcd.php 386

사용하는 $argn대신 $argv[1], _대신NULL
요 르그 Hülsermann

@ JörgHülsermann 감사합니다! 나는 _에 대해 몰랐다. $ argn은 작동하지 않는 것 같습니다.
Jared Mellentine

php.net/manual/en/features.commandline.options.php $argn 는 명령 행에서 -R또는 -F옵션을 사용하여 PHP를 실행하는 경우 사용할 수 있습니다
Jörg Hülsermann 2016 년

_NULLPHP 와 동일하지 않습니다 . 이 스크립트는 _정의되지 않은 상수 라는 오류를 발생시킵니다 .
Andy

@Andy 통지가 허용되지 않는 경우 Jared ""와 같이 더 나은 대안이 NULL여기에 있습니다 : $argn codegolf.stackexchange.com/questions/114146/…
Jörg Hülsermann

5

PHP 5.3 280 268 262 261 180 바이트


1. Roman Gräf의 제안으로 11을 저장했습니다
. 2. https 대신 http 링크를 사용하여 1 바이트를
저장했습니다. 3. Kevin_Kinsay 덕분에 6 바이트를 절약했습니다
. 4. Andy의 제안으로 1 바이트를 더 절약했습니다 .
5. 주요 개정 사항 :

  • 변경하는 대신 @로 오류를 억제했습니다. libxml_use_internal_errors
  • (2 바이트) implode(0,file(""))대신 사용file_get_contents("")
  • $x내부 에 정의를 이동if
  • throw 0실제로 예외를 던지는 대신 사용 (프로그램과 충돌)
  • @나는 지금이 생략 할 수 있습니다 comicLink대체합니다.


골프에 대한 나의 첫 번째 시도.

dobule ID comicLink가 발생하면 DOMDocument가 중단되므로이를 제거해야했습니다. 아마도 더 좋은 방법이있을 것입니다.

거절하려고 할 때 충돌이 발생합니다. 859 화

<?php if(($x=$argv[1])==859)throw 0;$a=new DOMDocument;$b=@$a->loadHTML(implode(0,file("http://xkcd.com/$x")));echo $a->getElementsByTagName('img')->item(1)->getAttribute('title');

2
PPCG에 오신 것을 환영합니다! 난 당신이 있는지 여부를 테스트를 제거 할 수 있습니다 생각하는 $x==404다른 코드가 404 응답에 실패 때문에 ... 또한 교체 할 수 throw new Exceptiona로 die전화 및 주위의 괄호를 제거 throw new Exception("")/ die그것은 단지 하나의 문장이기 때문에
로마 그라프

1
감사! die ()가 "throw a error";)로 계산되는지 잘 모르겠습니다.
Ezenhis

1
libxml_use_internal_errors에서 'true'대신 "1"을 사용하십시오. Exception에 0을 전달하고 따옴표를 상응하게 저장할 수 있습니다. 닫는?>는 선택 사항이어야합니다.
Kevin_Kinsey 2016 년

변수는 큰 따옴표 안에 보간되므로 1 바이트를 절약 "http://xkcd.com/".$x할 수 있습니다 "http://xkcd.com/$x":)
Andy

내 추악한 정규식 해킹과 달리 "적절한"파싱 기술 (XML 파서)을 사용하는 BTW, +1;)
Kevin_Kinsey

5

Python + xkcd , 54 바이트

import xkcd
lambda n:xkcd.getComic(*{n}-{859}).altText

확인

>>> import sys
>>> sys.tracebacklimit = 0
>>>
>>> import xkcd
>>> f = lambda n:xkcd.getComic(*{n}-{859}).altText
>>>
>>> print f(149)
Proper User Policy apparently means Simon Says.
>>>
>>> f(404)
urllib2.HTTPError: HTTP Error 404: Not Found
>>>
>>> f(859)
TypeError: getComic() takes at least 1 argument (0 given)

나는 단지 이것을 알아 차렸다. 좋은 골프!
Beta Decay

5

파이썬은 이미 이겼지 만 관계없이 ...

bash + curl + sed; 88 ~ 91 heh 바이트

printf "$(curl -s https://xkcd.com/2048/info.0.json|sed 's/.*"alt": "//;s/", "img":.*//')\n"

정규식 JSON 파싱에 대한 예!

NoLongerBreathedIn 편집 2048 년 이후 \"에 해당 항목의 JSON에서 예상치 못한 결과 로 실패한 것으로 나타났습니다 . 정규식이 위에 업데이트되었습니다. 예전에는 sed 's/.*alt": "\([^"]\+\).*/\1/')이었습니다.

printf래퍼 깔끔하게 유니 코드 문자를 표현하고 있다는 사실 처리 \unnnn표기 :

$ printf "$(curl -s https://xkcd.com/1538/info.0.json | sed 's/.*"alt": "//;s/", "img":.*//')\n"
To me, trying to understand song lyrics feels like when I see text in a dream but it𝔰 hอᵣd t₀ ᵣeₐd aกd 𝒾 canٖt fཱྀcu༧༦࿐༄

 

게시물 404 및 859에서는 실패합니다.

404

$ printf "$(curl -s https://xkcd.com/404/info.0.json | sed 's/.*alt": "\([^"]\+\).*/\1/')\n"
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

859

$ printf "$(curl -s https://xkcd.com/859/info.0.json | sed 's/.*alt": "\([^"]\+\).*/\1/')\n"
Brains aside, I wonder how many poorly-written xkcd.com-parsing scripts will break on this title (or ;;\n$

$출력의 끝에 내 프롬프트이며, 말 그대로 인쇄 \n는 printf와 문자열의 일부입니다 직전.

나는 의도적으로 사용 printf이 유니 코드를 구문 분석 때문에 이 특정 게시물에 몹시 넘어.


또한 2048 년에 바프. 큰 따옴표에 바 프라 고 생각합니까?
NoLongerBreathed

잘 잡았다. 게시물이 업데이트되었습니다. sed비트를 보면을 alt": "찾을 때까지 찾고 있던 것을 알 수 있습니다 ". 분명히 ... (이 솔루션 중 얼마나 많은 솔루션이 e̲͕̲̪v̲̺̗̱̬er̶͎y̦ ͖̙̝̦s҉̟̜i͓͜n̡g̸l͎̠̹̪͈͉͚͟e̩͙̙̣̲͕͘ ̴͎͉̳̮a̢͕l̯̦̮̥̺̱̤t̕ ͕̮̪̙̬̲̪͘t̰͙̘̪̼ͅex̺͕͍͔̠̮ͅt̪͔̀ ? : P :
i336_

4

파이썬 2 , 115106 바이트

ovs 덕분에 -8 바이트 Jonathan Allan 덕분에 -1 바이트.

표준 라이브러리 답변을 거기에 넣을 것이라고 생각했습니다.

lambda n:[json.load(urllib.urlopen('http://xkcd.com/%d/info.0.json'%n))['alt']][n==859]
import urllib,json

1
lambda n:[json.load(urllib.urlopen('https://xkcd.com/%d/info.0.json'%n))['alt']][n==859]-8 바이트
ovs

1
http://바이트 를 너무 저장하면 작동 합니다.
Jonathan Allan

4

배쉬 + 컬 + jq : 73 66 바이트

xkcd 특정 라이브러리를 사용하지 않는 최단 답변. jq는 쉘에서 json 객체를 조작하기위한 도구이며 구문 분석 언어가 포함되어 있습니다.

curl -Ls xkcd.com/$1/info.0.json|jq -r 'if.num==859then.num.a else.alt end'

curl -Ls xkcd.com/$1/info.0.json|jq -r '(.num!=859//.[9]|not)//.alt'

아래 확장 :

curl -Ls -쿼리하지만 자유롭게 (이 경우 https 사이트로) 리디렉션하고 관련없는 결과를 제공하지 마십시오.

xkcd.com/$1/info.0.json -다른 대답에서 뻔뻔스럽게 도난당했습니다.

|jq -r- jq다음 명령에서 "원시 출력"모드로 실행하십시오 .

if .num == 859 then .num.a # This fails because you can't get the key 'a' from a property that's an integer else .alt # And this pulls out the 'alt' key from our object. end

이제는 스크립트 에서 파이썬과 //동등한 것을 사용하도록 재 작업되었으며 a or b, a |not를 사용하여 실제 값을 거짓으로 간주하므로 두 번째 //는 인쇄 할 수 있습니다.alt


2

자바 스크립트 (ES6), 177 175 바이트

p=(x)=>{eval(`console.log("${x.alt}")`)};f=(y)=>{var d=document,e=d.createElement("script");e.src=`//dynamic.xkcd.com/api-0/jsonp/comic/${y}?callback=p`;d.body.appendChild(e)}}

브라우저 콘솔에이 붙여 넣기 한 후 실행 f(859)또는 f(404)등 - 그 두 하드 코딩하지 않을에도 불구하고, 콘솔에 오류해야 다른 사람이 표시됩니다.

잠시 후 첫 번째 게시물, 규칙을 준수하지 않으면 죄송합니다 ...!


x=>대신에 사용하십시오 (x)=>.
user75200

2

PHP, 160 바이트

<? preg_match_all('/(tle=\")(.+)(\")\sa/',join(0,file('http://xkcd.com/'.$argv[1])),$a);echo(strstr($c=$a[2][0],'Brains asid'))?$b:html_entity_decode($c,3);

잠깐만 ... 이것은 사양이 아닙니다.
고치기

결정된. 그래도 약 50 바이트를 추가해야했습니다 ... :(
Kevin_Kinsey 2016 년

1
에코를 제거하고 substr 안에서 $ c assign을 이동시키는 7 개의 문자를 제거 할 수 있습니다
Einacio

1
입력 번호를 확인하지 않기 때문에 @BetaDecay 추가 포인트를 제공합니다
Einacio

1
@BetaDecay 글쎄, 내용에 의존하는 스크립트는 나에게 잘 쓰여지지 않은 것 같습니다. 그렇게 시작하는 다른 제목은 그것을 깨뜨릴 것입니다. Kevin_Kinsey ENT_QUOTES를 값 = 3으로 대체 할 수 있습니다
Einacio

1

129 167 바이트

use LWP::Simple;use HTML::Entities;print decode_entities($1)if(get("http://www.xkcd.com/$ARGV[0]")=~m/text: ([^<]*)\}\}<\/div>/)

편집 : Psyche 실제로

use LWP::Simple;use HTML::Entities;$x=$ARGV[0];if($x==404||$x==859){die}else{print decode_entities($1)if(get("http://www.xkcd.com/$x")=~m/text: ([^<]*)\}\}<\/div>/)}

HTML 디코딩 및 HTTP 액세스를 가져온 다음 (...)과 일치하는 그룹을 인쇄하십시오.

{{Title text: (...)}}</div>

( {{Title 쿼리에서 생략하여 조금 저장 )

404와 859의 경우 죽음.


"적절하게 처리 859"는 무슨 뜻입니까?
Beta Decay

@BetaDecay은 실제 고도 텍스트 인쇄
archaephyrryx

1
the program must throw an error when given the numbers 859 or 404
Beta Decay

"오류 발생"이란 무엇입니까?
archaephyrryx 2016 년

Nvm die은 충분히 짧습니다
archaephyrryx

1

BASH, 111 108 바이트

a = $ (cat) curl -s https://xkcd.com/ $ a / | grep -oP '(? <= 제목 텍스트 :) ([^}}] *)'[$ a = 404] && echo "$ a를 찾을 수 없습니다"

a=#;curl -s https://xkcd.com/$a/ |grep -oP '(?<=Title text:)([^}}]*)';[ $a = 404 ] && echo "$a not found"


실행하려면 :
#을 코믹 수로 변경 하십시오 . 명령 행에서 실행하십시오.

제안에 감사드립니다.


명령 행에서 $ 1을 사용하는 대신 cat을 사용하여 표준 입력에서 읽는 이유는 무엇입니까? 바이트를 절약 할 수 있습니다.
Ale

1

자바 스크립트 (ES6), 118 96 94 바이트

f=n=>fetch(`//xkcd.com/${n}/info.0.json`).then(x=>x.json()).then(y=>eval(`alert('${y.alt}')`))

브라우저 콘솔에 붙여넣고 실행할 수 f(123)있습니다. 그러나 xkcd.com에 이미있는 페이지에서 그렇게하십시오. 그렇지 않으면 CORS 오류가 표시됩니다.

404의 경우 다음과 같이 실패합니다.

잡히지 않음 (약속 됨) SyntaxError : JSON의 0 위치에 예기치 않은 토큰 <

859의 경우 다음과 같이 실패합니다.

인수 목록 뒤에 잡히지 않는 (약속 된 SyntaxError : missing)

업데이트 : 최신 버전은 859와 2 바이트의 면도를 확인하는 대신 대체 텍스트를 올바르게 확인합니다.


슬프게도, 이것은 아포스트로피 (예 : 1084)를 포함하는 제목 텍스트에서 실패합니다.
ETHproductions
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.