xkcd 표시


36

xkcd는 모두가 가장 좋아하는 웹 코믹이며, 우리 모두에게 약간의 유머를 가져다 줄 프로그램을 작성하게 될 것입니다.
이 과제의 목표는 xkcd와 제목 텍스트 (마우스 오버 텍스트)를 숫자로 입력하여 표시하는 프로그램을 작성하는 것입니다.

입력

프로그램은 양의 정수를 입력으로 사용하고 (유효한 만화가 반드시있는 것은 아님) xkcd를 표시합니다. 예를 들어 1500의 입력은 xkcd.com/1500에 만화 "Upside-Down Map"을 표시해야합니다. 그런 다음 제목 텍스트를 콘솔에 인쇄하거나 이미지와 함께 표시하십시오.

해협을 가로 지르는 접근성으로 인해 북한과 영국과 아일랜드 사이에는 오랜 긴장이 있었다. Due to their proximity across the channel, there's long been tension between North Korea and the United Kingdom of Great Britain and Southern Ireland.

테스트 사례 2, n = 859의 경우 :

두뇌는 제쳐두고, 나는 xkcd.com 구문 분석 스크립트가이 제목 (또는 ;; " ''{<< [ '이 마우스 오버 텍스트)에서 얼마나 잘 작성되지 않았는지 궁금합니다.

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

프로그램은 입력 없이도 작동 할 수 있어야하며 xkcd.com에있는 최신 xkcd에 대해 동일한 작업을 수행해야하며 새로운 프로그램이 올라가더라도 항상 가장 최신의 xkcd를 표시해야합니다.

xkcd.com에서 직접 이미지를 가져올 필요는 없습니다.이 문제가 발생하기 전에 이미 존재하고 이미 존재하는 한 다른 데이터베이스를 사용할 수 있습니다. URL 단축기, 즉 다른 곳으로 리디렉션하는 것 외에 다른 목적이없는 URL은 허용되지 않습니다.

브라우저를 포함하여 원하는 방식으로 이미지를 표시 할 수 있습니다. 그러나 다른 페이지의 일부를 iframe 등으로 직접 표시 할 수는 없습니다 . 설명 : 기존 웹 페이지를 열 수 없습니다. 브라우저를 사용하려면 새 페이지를 만들어야합니다 . 또한 실제로 이미지를 표시해야합니다. 이미지 파일을 출력 할 수 없습니다.

예외 처리를 포함하여 특정 만화에 대한 이미지가없는 경우 (예 : 대화식이거나 프로그램이 출시 된 만화 수보다 많은 수의 프로그램을 통과 한 경우)를 처리 할 수 ​​있습니다. 사용자에게 해당 입력에 대한 이미지가 없음을 나타내는 한, 최소한 하나의 문자열을 인쇄하십시오.

이미지 만 표시하고 제목 텍스트를 출력하거나 잘못된 만화에 대한 오류 메시지를 출력 할 수 있습니다. 다른 출력은 허용되지 않습니다.

이것은 챌린지이므로 가장 적은 바이트가 이깁니다.


1
@LukeFarritor 이미지 만 표시하고 제목 텍스트를 출력하거나 잘못된 만화에 대한 오류 메시지를 출력 할 수 있습니다.
Pavel

9
import antigravityPython에서 샘플 크기가 1이면 ;)
Wayne Werner

15
재미있는 사실 n=404 xkcd.com/404 는 404 페이지입니다.
Magic Octopus Urn

11
xkcd is everyone's favorite webcomic [인용 필요 ]
Sanchises

11
테스트 사례 : 859
betseg

답변:


13

Perl + curl + feh, 86 84 75 바이트

`curl xkcd.com/$_/`=~/<img src="(.*)" title="(.*?)"/;$_=$2;`feh "http:$1"`

-p스위치가 필요합니다 . 바이트 수로 이것을 설명했습니다.


@Matt 그것은 내가 시도한 모든 만화에서 작동했습니다. 대체 텍스트가있는 이미지 만 일치합니다.
스파게티

src 속성 주위에 따옴표가 필요하지 않을 수 있습니다.
Conor O'Brien

?첫 경기 그룹에서 당신이 필요하다고 생각하지 않습니다 . 당신은 사용할 수 -p$_=$2대신 print$2,하지만 제목 텍스트는 인쇄 FEH가 닫힙니다. 그것이 유효한지 확실하지 않습니다.
m-chrzan

@ m-chrzan 그래, 내가 싫어하는 정량자를 떨어 뜨릴 수있을 것 같아, 고마워. 나는 사용에 대해 생각 -p했지만 OP가 그것에 대해 어떻게 느낄지 확신하지 못했습니다.
스파게티

@ ConorO'Brien 불행히도 Randall은 훌륭한 HTML 코딩 관행을 준수합니다 ... 그리고 인용 부호를 잡는 것이 Perl에서 백틱이 작동하는 방식으로 인해 인수를 인용하지 않습니다.
스파게티

9

PowerShell에서의 V3 + 110 99 107 103 바이트

iwr($x=((iwr "xkcd.com/$args").images|?{$_.title})).src.Trim("/") -outf x.jpg;if($x){ii x.jpg;$x.title}

인라인 할당을 사용하여 일부 바이트를 절약 할 수 있도록 도와 준 Timmy에게 감사합니다.

인수가 전달되지 않으면 $argsnull이되고 현재 코믹을 가져옵니다. 그림을 대체 텍스트와 일치시켜 그림을 스크립트의 현재 실행중인 디렉토리에있는 파일로 다운로드하십시오. 그런 다음 jpg의 기본 뷰어로 표시하십시오. 그런 다음 대체 텍스트가 콘솔에 표시됩니다. iwr에 대한 별칭입니다Invoke-WebRequest

전달 된 숫자 (또는 해당 사안에 대한 유효하지 않은 입력)가 일치하지 않으면 404 오류 이상으로 프로세스가 실패합니다.

iwr(                                  # Request the comic image from XKCD
  $x=((iwr "xkcd.com/$args").images|  # Primary search to locate either the current image
                                      # or one matching an argument passed
     ?{$_.title}))                    # Find the image with alt text
        .src.Trim("/")                # Using the images associated link and strip the leading slashes
  -outf x.jpg                         # Output the image to the directory local to where the script was run
if($x){                               # Test if the image acquisition was successful
    ii x.jpg                          # Open the picture in with the default jpg viewer
    $x.title                          # Display alt text to console
}                                     # I'm a closing bracket.

방금이 서브에 대한 나의 의견 특권을 얻었습니다. 비슷한 답변을
colsw

@ConnorLSW 귀하의 답변에 좋은 접근 방식. 다음에 생각할 것.
Matt

8

AutoIt , 440 바이트

예, 길지만 안정적입니다.

#include<IE.au3>
#include<GDIPlus.au3>
Func _($0='')
_GDIPlus_Startup()
$1=_IECreate('xkcd.com/'&$0)
For $3 In $1.document.images
ExitLoop $3.title<>''
Next
$4=_GDIPlus_BitmapCreateFromMemory(InetRead($3.src),1)
$6=_GDIPlus_ImageGetDimension(_GDIPlus_BitmapCreateFromHBITMAP($4))
GUICreate(ToolTip($3.title),$6[0],$6[1])
GUICtrlSendMsg(GUICtrlCreatePic('',0,0,$6[0],$6[1]),370,0,$4)
_IEQuit($1)
GUISetState()
Do
Until GUIGetMsg()=-3
EndFunc

우선, 이것은 RegEx를 사용하여 사이트를 문지르지 않습니다 (모든 만화에서 이것을 테스트 할 시간이 없기 때문에).하지만 Internet Explorer API를 사용 img하여 제목 텍스트가있는 태그를 찾을 때까지 DOM 태그 를 반복 합니다.

이진 스트림은 이미지 URL에서 읽히고 GDIPlus를 사용하여 비트 맵으로 렌더링됩니다. 그런 다음 실제 툴팁과 함께 멋진 자동 크기 GUI에 표시되어 웹 사이트와 거의 동일하게 동작합니다.

테스트 사례 ( _(859)) 는 다음과 같습니다 .

)


4
이미지에 대괄호를 다시 추가하면 더 좋습니다.
Matt

와우, 우분투 와인에서 AutoIt을 실행할 수 있다는 것을 알았습니다. 이제 내가해야 할 일은 IE가 작동하도록하는 것입니다. 두 번째 생각에 ... 답변 +1
ElPedro

2
@ElPedro 최신 CPU를 사용하는 경우 와인 대신 qemu KVM 및 seamlessRDP (기본적으로 Linux의 경우 DIY 병렬 처리)를 사용하십시오. 이는 Windows 앱을 Linux 데스크톱에 완벽하게 통합하며 100 % 호환성 + GPU 패스 스루를 제공합니다. 그냥 팁.
mınxomaτ

감사합니다 @ mınxomaτ. 나는 그것을 갈 수 있습니다. 나는 하루 종일 Windows로 작업하므로 Linux (다양한 풍미)를 사용하지 않는 것을 선호하지만 항상 실험에 관심이 있습니다.
ElPedro

7

파워 쉘, 93 바이트

로컬 이미지 뷰어를 사용하는 93 바이트 버전.

$n=(iwr xkcd.com/$args).images|?{$_.title};$n.title;iwr ("http:"+$n.src) -OutF x.jpg;ii x.*

불필요한 쌍 따옴표를 제거하여 2 바이트를 저장 한 후 사용하여 다른 많은 ("http:"+$n.src)대신은 "https://"+$n.src.trim("/")- 이후 imgSRC가되어 //이미에, 그리고 XKCD는 HTTPS를 필요로하지 않습니다.

$n=(iwr xkcd.com/$args).images|?{$_.title};$n.title;saps ("http:"+$n.src)

$n=(iwr "xkcd.com/$args").images|?{$_.title};$n.title;saps ("https://"+$n.src.trim("/"))

Matts powershell 답변과 매우 유사합니다.

대신 기본 브라우저에서 새 탭 / 창이 열리고 바이트가 절약됩니다.

iwr 에 대한 별칭입니다 Invoke-WebRequest

sapsStart-Process기본 컨텍스트에서 'it'을 여는 별명입니다 .


기존 웹 페이지를 여는 것에 대한 규칙의 가장자리를 바꾸는 것입니다. 기존의 .jpg (또는 무엇이든)에서 브라우저를 직접 시작하기는하지만 좋은 대답입니다.
AdmBorkBork

@TimmyD 여기에 다음 오해가있을 수 있습니다 - 난 당신이 XKCD 웹 페이지 자체를 사용할 수 있습니다 가정 - 당신은 그냥 변경할 수 있습니다 sapsiwrAPPEND`-OutF x.jpg와;. II X를 *`마지막에 당신이 지역의 기본에서 열려면 이미지 뷰어.
colsw

1
OP가 기존 웹 페이지를 열 수 없도록 지정했습니다. 내가 생각하는 93 바이트 버전은 잘하지만
spaghetto

나는 이것이 당신이 작동하는 번호를 주면 항상 같은 일을 할 거라고 생각하지 않습니다 다음 하지 않는 수입니다. 이전 실행에서 존재했던 이미지가 열립니다.
Matt

나는 93 바이트 버전을 허용하지만 짧은 버전은 퍼즐의 조건을 위반합니다.
Pavel

4

R, 358 328 310 298 바이트

f=function(x){H="http:";p=paste0;library(XML);a=xpathSApply(htmlParse(p(H,'//xkcd.com/',x)),'//div/img',xmlAttrs)[[1]];download.file(p(H,a[1]),'a');I=`if`(grepl('png',a[1]),png::readPNG,jpeg::readJPEG)('a');d=dim(I)/100;quartz(,d[2],d[1]);par(mar=rep(0,4));frame();rasterImage(I,0,0,1,1);cat(a[2])}

새로운 줄과 의견 :

f=function(x){
H="http:"
p=paste0
library(XML) #Needed for xpathSApply, htmlParse and xmlAttrs
# The following line find the first img element and extract its attributes
a=xpathSApply(htmlParse(p(H,'//xkcd.com/',x)),'//div/img',xmlAttrs)[[1]]
download.file(p(H,a[1]),'a') #Download to a file called 'a'
I=`if`(grepl('png',a[1]),png::readPNG,jpeg::readJPEG)('a') #Check if png or jpeg and load the file accordingly
d=dim(I)/100 #convert dimension from pixel to inches (100 ppi).
quartz(,d[2],d[1]) #open a window of the correct dimension
par(mar=rep(0,4)) #Get rid of margins
frame() #Create empty plot
rasterImage(I,0,0,1,1) #Add png/jpeg to the plot
cat(a[2]) #Print title text to stdout
}

테스트 사례의 스크린 샷 :

x = 1500의 경우 : x = 1500 용 (png)

빈 x의 경우 :
x = ''

사진이 jpeg 인 경우 :
x = 10의 경우 (jpeg)

x = 859 :
x = 859


이미지를 올바른 크기로 표시해야하는지 궁금합니다. 내가이 도전을 가지고 놀 때 나는 단순히했다 plot.new();rasterImage(...).
Billywob

@Billywob 음모의 기본 크기가 7x7 인치이므로 완전히 왜곡됩니다. OP가 명시 적으로 이미지가 왜곡되지 않도록 요구하지는 않았지만이 방법을 선호합니다 :) 그러나 나는 제거하는 것을 고려 xaxs하고 yaxs있으며 결과는 여전히 비례합니다.
plannapus


2

파이썬 2.7, 309 299 295 274 바이트

전체 프로그램. 확실히 더 골프화가 가능하지만 xkcd 만화를 오랫동안 읽은 후에는 이것을 통과시킬 수 없었습니다.

입력이 전달되지 않으면 현재 코믹을 가져옵니다. 유효한 만화 번호가 입력으로 전달되면 해당 만화를 가져옵니다. 유효하지 않은 입력 (유효 범위의 숫자 만화가 아님)이 전달되면 오류가 발생합니다.

바이트 수를 줄이는 방법에 대한 제안은 환영합니다! 시간이 더 있으면 다시 방문하여 설명을 추가합니다.

@Dopapp 덕분에 -10 바이트

@Shebang 덕분에 -21 바이트

import urllib as u,re
from PIL import Image
h='http://';x='xkcd.com/'
o=u.URLopener()
t=u.urlopen(h+x+raw_input()).read()
c=sum([re.findall(r,t)for r in[h+'imgs.'+x+'c.*s/.*\.\w{1,3}','\.\w{1,3}" t.*e="(.*)" a']],[])
Image.open(o.retrieve(c[0],'1.png')[0]).show();print c[1]

1
당신은 변경할 수 있습니다 try:...except:...try:n=...except:n=''당신에게 10 바이트를 저장은 총
다니엘

1
try진술을합니까? 프로그램 사양에 따르면 항상 양의 정수를 얻습니다.
Kade

@ Shebang은 입력이 없을 때 최신 만화를 반환해야합니다. 입력 오류를 제외 하고는이 사례를 관리 할 수 ​​없었습니다.
Ioannes

1
@Joannes 왜 사용하지 raw_input()않습니까? 기본적으로 사용자가 누를 수 [Enter]n어쨌든 빈 문자열이 포함됩니다. 해당 try-except 블록을 제거하고 t=u.urlopen(h+x+n).read() -> t=u.urlopen(h+x+raw_input()).read()274 바이트로 줄이면됩니다.
Kade

xkcd 이미지 URL이를 사용하기 때문에 더 이상 작동하지 않습니다 https. 그러나 게시 당시에 작동했기 때문에 여전히 유효합니다. 지금 작동하게하려면 h='https://'+1 바이트 로 시작하도록 3 행을 변경하십시오 .
Mego

2

PHP, 42 바이트

<?=@file('http://xkcd.com/'.$_GET[i])[59];

파일에 저장하고 선택한 웹 서버에서 실행하십시오.


1
PPCG에 오신 것을 환영합니다! PHP를 모르지만 이미지의 제목 텍스트를 가져 오는 코드의 일부가 아닌 것 같습니다.
Pavel

1

자바 스크립트 + HTML, 124 + 18 = 142 바이트

i=>fetch(`//crossorigin.me/http://xkcd.com/${i||""}/info.0.json`).then(r=>r.json()).then(d=>(A.innerHTML=d.alt,B.src=d.img))
<img id=B><p id=A>

Kaiido의 답변 덕분에 교차 출처 솔루션 .

//crossorigin.me/xkcd.com에 연결하는 데 필요한 프록시를 빼면 17 바이트 ( )를 저장할 수 있습니다 (이에 대한 메타 게시물 ).

테스트 스 니펫

f=
i=>fetch(`//crossorigin.me/http://xkcd.com/${i||""}/info.0.json`).then(r=>r.json()).then(d=>(A.innerHTML=d.alt,B.src=d.img))
<style>img{width:50%}</style><input id=I> <button onclick="f(I.value)">Run</button><br>
<img id=B><p id=A>


1

파이썬 + 3 명 + PIL 요청, 192 186 바이트

from requests import*
import PIL.Image as f
from io import*
r=get("https://xkcd.com/%s/info.0.json"%input()).json()
f.open(BytesIO(get(r["img"],stream=1).content)).show()
print(r["alt"])

만화가 포함 된 이미지 뷰어 (실행중인 시스템의 기본값)를 열고 제목 텍스트를 콘솔에 게시합니다.


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