एक xkcd प्रदर्शित करें


36

xkcd हर किसी का पसंदीदा वेबकॉम है, और आप एक प्रोग्राम लिख रहे होंगे जो हम सभी के लिए थोड़ा और हास्य लाएगा।
इस चुनौती में आपका उद्देश्य एक प्रोग्राम लिखना है जो एक नंबर को इनपुट के रूप में लेगा और उस एक्सकेडी और उसके शीर्षक-पाठ (मूसओवर टेक्स्ट) को प्रदर्शित करेगा।

इनपुट

आपका प्रोग्राम इनपुट के रूप में एक सकारात्मक पूर्णांक लेगा (जरूरी नहीं कि जिसके लिए एक वैध कॉमिक मौजूद है) और xkcd को प्रदर्शित करें: उदाहरण के लिए, 1500 का इनपुट कॉमिक "अपसाइड-डाउन मैप" को xkcd.com/1500 पर प्रदर्शित करना चाहिए, और फिर इसके शीर्षक-पाठ को कंसोल पर प्रिंट करें या छवि के साथ प्रदर्शित करें।

पूरे चैनल में उनकी निकटता के कारण, उत्तर कोरिया और यूनाइटेड किंगडम ऑफ ग्रेट ब्रिटेन और दक्षिणी आयरलैंड के बीच लंबे समय से तनाव है। 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.com से प्राप्त करने की आवश्यकता नहीं है, आप किसी अन्य डेटाबेस का उपयोग तब तक कर सकते हैं जब तक यह अद्यतित हो और इस चुनौती के उठने से पहले ही मौजूद हो। URL शॉर्टर्स, जो कि किसी अन्य उद्देश्य के साथ कहीं और अनुप्रेषित करने के अलावा किसी और उद्देश्य से आता है, की अनुमति नहीं है।

आप किसी भी तरह से छवि को प्रदर्शित कर सकते हैं, जिसमें ब्राउज़र शामिल है। हालाँकि, आप सीधे किसी अन्य पेज का हिस्सा iframe या समान में प्रदर्शित नहीं कर सकते हैं । CLARIFICATION: आप एक preexisting वेबपेज नहीं खोल सकते, यदि आप उस ब्राउज़र का उपयोग करना चाहते हैं जिसे आपको एक नया पेज बनाना है । आपको वास्तव में एक छवि प्रदर्शित करनी होगी - एक छवि फ़ाइल को आउटपुट करने की अनुमति नहीं है।

आप इस मामले को संभाल सकते हैं कि किसी विशेष कॉमिक के लिए कोई छवि नहीं है (उदाहरण के लिए यह इंटरएक्टिव है या किसी भी उचित तरीके से कॉमिक्स की मात्रा से अधिक संख्या को जारी किया गया है) जिसे आप छोड़ना चाहते हैं। , या कम से कम एकल-वर्ण स्ट्रिंग को प्रिंट करना, जब तक कि यह किसी तरह उपयोगकर्ता को संकेत देता है कि उस इनपुट के लिए कोई छवि नहीं है।

आप केवल एक छवि प्रदर्शित कर सकते हैं और उसका शीर्षक-पाठ आउटपुट कर सकते हैं, या अमान्य कॉमिक के लिए एक त्रुटि संदेश आउटपुट कर सकते हैं। अन्य आउटपुट की अनुमति नहीं है।

यह एक चुनौती है, इसलिए सबसे कम बाइट्स जीतता है।


1
@LukeFarritor आप केवल छवि प्रदर्शित कर सकते हैं और शीर्षक पाठ का उत्पादन कर सकते हैं या किसी अमान्य कॉमिक के लिए त्रुटि संदेश के कुछ रूप को आउटपुट कर सकते हैं।
पावेल

9
यदि आपका नमूना आकार 1 है, import antigravityपायथन में;)
वेन वर्नर

15
मजेदार तथ्य n=404 xkcd.com/404 404 पृष्ठ है।
मैजिक ऑक्टोपस Urn

11
xkcd is everyone's favorite webcomic [उद्धरण वांछित ]

11
टेस्ट केस: 859
betseg

जवाबों:


13

पर्ल + कर्ल + फेह, 86 84 75 बाइट्स

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

-pस्विच की आवश्यकता है । मैंने इसके लिए बाइट काउंट में हिसाब लगाया है।


@ मैट यह मैंने कोशिश की सभी कॉमिक्स पर काम किया। यह केवल ऑल-टेक्स्ट के साथ छवियों से मेल खाता है।
एक स्पेगेटो

आपको src विशेषता के आसपास उद्धरणों की आवश्यकता नहीं हो सकती है।
कॉनर ओ'ब्रायन

मुझे नहीं लगता कि आपको ?पहले मैच ग्रुप में जरूरत है । आप उपयोग कर सकते हैं -pऔर $_=$2इसके बजाय print$2, लेकिन तब शीर्षक पाठ केवल feh बंद होने के बाद मुद्रित किया जाता है। यकीन नहीं है कि अगर यह वैध है।
m-chrzan

@ m-chrzan हाँ लगता है कि मैं अनिच्छुक क्वांटिफायर को वहीं छोड़ सकता हूं, धन्यवाद। मैं का उपयोग करने के बारे में सोचा -pथा, लेकिन यकीन नहीं था कि ओपी इसके बारे में कैसा महसूस करेगा।
एक स्पेगेटो

@ ConorO'Brien दुर्भाग्य से रान्डेल अच्छी 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}

इनलाइन असाइनमेंट का उपयोग करके कुछ बाइट्स को बचाने में मदद करने के लिए टिम्मी को धन्यवाद।

यदि कोई तर्क पारित नहीं किया जाता है तो $argsअशक्त है और यह सिर्फ वर्तमान हास्य मिलेगा। स्क्रिप्ट के वर्तमान चल रहे निर्देशिका में एक फ़ाइल में, कुल पाठ के साथ मिलान करके चित्र डाउनलोड करें। फिर इसे 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 आपके उत्तर में अच्छा तरीका है। अगली बार के लिए सोचने वाली बातें।
मैट

8

ऑटो इट , 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 का उपयोग नहीं करता है (क्योंकि मेरे पास सभी कॉमिक्स पर यह परीक्षण करने का कोई समय नहीं है), बल्कि DOM के imgटैग के माध्यम से इंटरनेट एक्सप्लोरर एपीआई का उपयोग करता है जब तक कि यह एक शीर्षक पाठ के साथ नहीं मिलता है।

बाइनरी स्ट्रीम को छवि URL से पढ़ा जाता है और GDIPlus का उपयोग करके बिटमैप में प्रदान किया जाता है। यह तब एक वास्तविक टूलटिप के साथ एक अच्छा, ऑटो-आकार के GUI में प्रदर्शित होता है, ताकि यह वेबसाइट की तरह लगभग व्यवहार में आ सके।

यहाँ एक परीक्षण मामला ( _(859)) है:

)


4
बेहतर होगा कि आप ब्रैकेट को वापस इमेज में शामिल करें।
मैट

वाह, अभी पता चला है कि मैं Ubuntu पर शराब के तहत AutoIt चला सकते हैं। अब मुझे बस इतना करना है कि मुझे वहां काम करना है। दूसरे विचारों पर ... जवाब के लिए +1
ElPedro

2
@ElPedro यदि आपके पास एक आधुनिक सीपीयू है, तो शराब के बजाय क्यूमू केवीएम और सीमलेस आरडीपी (मूल रूप से लिनक्स के लिए एक DIY समानताएं) का उपयोग करें। यह विंडोज एप्स को मूल रूप से लिनक्स डेस्कटॉप में एकीकृत करता है और इसमें 100% संगतता + जीपीयू pststrough है। बस एक टिप।
mınxomaτ

धन्यवाद @ mınxomaτ। हो सकता है कि मैं जाऊं। मैं पूरे दिन विंडोज के साथ काम करता हूं इसलिए काम से बाहर लिनक्स (विभिन्न स्वादों) का उपयोग करना पसंद करता हूं, लेकिन मैं हमेशा प्रयोग करने में दिलचस्पी रखता हूं :) टिप प्राप्त हुआ।
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("/"))

मैट्स का बहुत समान रूप से उत्तर देता है, (शायद यह एक टिप्पणी होनी चाहिए लेकिन कम प्रतिष्ठा है)

इसके बजाय यह डिफ़ॉल्ट ब्राउज़र और अन्य चीजों में एक नया टैब / विंडो खोलता है, जिससे कुछ बाइट्स बचती हैं।

iwr के लिए एक उपनाम है Invoke-WebRequest

sapsएक उपनाम है Start-Processजिसके लिए डिफ़ॉल्ट संदर्भ में 'यह' खुलता है।


किसी मौजूदा वेबपेज को खोलने के बारे में नियमों के किनारों को छोड़ना, क्योंकि यह सीधे ब्राउज़र को पहले से मौजूद .jpg (या जो भी) में लॉन्च कर रहा है, लेकिन एक अच्छा जवाब है।
AdmBorkBork

तुम सिर्फ बदल सकते हैं - @TimmyD यहाँ तो गलत समझा हो सकता है - मैं तुम्हें xkcd वेबपेज ही उपयोग कर सकते हैं ग्रहण sapsकरने के लिए iwrयदि आप इसे डिफ़ॉल्ट स्थानीय में खोलना चाहते हैं समाप्त करने के लिए ii x * `; संलग्न` -OutF x.jpg और। छवि दर्शक।
बृहस्पतिवार

1
ओपी ने निर्दिष्ट किया कि आपको पहले से मौजूद वेबपेज खोलने की अनुमति नहीं है। 93 बाइट संस्करण मुझे लगता है कि ठीक है
एक स्पैगेटो

मुझे नहीं लगता कि यह हमेशा एक ही काम करने वाला है यदि आप एक नंबर देते हैं जो काम करता है तो एक नंबर जो ऐसा नहीं करता है। यह पिछले रन से मौजूद छवि को खोलेगा।
मैट

मैं 93 बाइट संस्करण स्वीकार करता हूं, लेकिन आपका छोटा पहेली की स्थितियों का उल्लंघन करता है।
पावेल

4

आर, 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 = '' के लिए

मामला जब तस्वीर एक JPEG है:
x = 10 (jpeg) के लिए

एक्स = 859:
एक्स = 859


मुझे आश्चर्य है कि क्या छवि को सही आयामों में प्रदर्शित करना आवश्यक है। जब मैं इस चुनौती के साथ खेल रहा था तो मैंने बस किया plot.new();rasterImage(...)
बिलीवोब

@ बिलीवॉब यह पूरी तरह से विकृत होगा क्योंकि प्लॉट के लिए डिफ़ॉल्ट आकार 7x7 इंच है। यह सच है कि ओपी ने स्पष्ट रूप से छवि को विकृत नहीं होने के लिए नहीं कहा था, लेकिन मैं इसे इस तरह से पसंद करता हूं :) लेकिन मैं इससे छुटकारा पाने पर विचार कर रहा हूं xaxsऔर yaxsपरिणाम अभी भी आनुपातिक होगा।
प्लेनैपस


2

पायथन 2.7, 309 299 295 274 बाइट्स

पूरा कार्यक्रम। निश्चित रूप से अधिक गोल्फ खेलने योग्य है, लेकिन इतने लंबे समय तक xkcd कॉमिक्स पढ़ने के बाद मैं इसे पास नहीं कर सका (जो जानता है कि यह भविष्य में आसानी से ब्राउजिंग करने के लिए मददगार होगा)।

यदि कोई इनपुट पारित नहीं होता है, तो वर्तमान कॉमिक प्राप्त करता है। यदि एक वैध कॉमिक नंबर इनपुट के रूप में पारित किया जाता है तो वह कॉमिक प्राप्त करता है। यदि कोई अमान्य इनपुट (मान्य श्रेणी में एक नंबर कॉमिक नहीं) पारित किया गया है, तो एक त्रुटि फेंकता है।

बाइट काउंट कम करने के बारे में किसी भी सुझाव का स्वागत है! जब मेरे पास अधिक समय होगा तब पुन: विचार (और स्पष्टीकरण जोड़ूंगा) करूंगा।

-10 बाइट्स @ @ धन्यवाद के लिए धन्यवाद

-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बयान क्यों है ? कार्यक्रम युक्ति कहता है कि आपको हमेशा एक पूर्णांक मिलेगा।
केड

@ शेबंग को इनपुट नहीं होने पर नवीनतम कॉमिक भी लौटाना चाहिए। मैं इस मामले को इनपुट त्रुटि के अपवाद के बिना प्रबंधित करने में सक्षम नहीं था।
Ioannes

1
@ जॉन्स का उपयोग क्यों नहीं raw_input()? डिफ़ॉल्ट रूप से उपयोगकर्ता दबा सकता है [Enter]और nइसमें रिक्त स्ट्रिंग वैसे भी हो सकती है। यदि आप उस प्रयास को छोड़कर ब्लॉक को हटाते हैं और क्या t=u.urlopen(h+x+n).read() -> t=u.urlopen(h+x+raw_input()).read()आप इसे 274 बाइट्स तक ले जाते हैं।
काडे

यह अब काम नहीं करता है, क्योंकि xkcd छवि URL का उपयोग करते हैं https। हालाँकि, यह अभी भी मान्य है, क्योंकि यह पोस्टिंग के समय काम किया था। इसे अभी काम करने के h='https://'लिए, +1 बाइट के साथ शुरू करने के लिए लाइन 3 बदलें ।
मेगो

2

PHP, 42 बाइट्स

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

एक फ़ाइल को सहेजें और इसे अपने पसंद के वेब सर्वर में आग दें


1
PPCG में आपका स्वागत है! मैं PHP नहीं जानता, लेकिन आपके कोड का एक हिस्सा नहीं लगता है जो छवि के शीर्षक पाठ को ला रहा है?
पावेल

1

जावास्क्रिप्ट + एचटीएमएल, 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>

काइदो के जवाब के लिए क्रॉस-मूल समाधान यहां धन्यवाद ।

17 बाइट्स ( //crossorigin.me/) को बचाया जा सकता है अगर xkcd.com से कनेक्ट होने के लिए प्रॉक्सी को घटाया जा सकता है ( इस बारे में मेटा पोस्ट )।

टेस्ट स्निपेट

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 + अनुरोध + पीआईएल, 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"])

कॉमिक युक्त एक छवि दर्शक (जो भी उस सिस्टम पर चलाया जा रहा है डिफ़ॉल्ट है) को खोलता है, और शीर्षक पाठ को कंसोल पर पोस्ट करता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.