Desafío
Dado el número de un cómic XKCD, genera el texto del título de ese cómic (el texto que pasa el mouse).
Sin embargo, el programa debe arrojar un error cuando se le dan los números 859o404 .
Reglas
El número dado siempre será un cómic existente (excepto 404 ).
Su programa no debe arrojar un error para ningún otro número que 859o404 .
Como referencia, el cómic 404no existe y 859es:
Brains aside, I wonder how many poorly-written xkcd.com-parsing scripts will break on this title (or ;;"''{<<[' this mouseover text."
Los acortadores de URL no están permitidos. Puede usar Internet para obtener el texto del título.
Ejemplos
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.
Generosidad
Otorgaré una recompensa por la respuesta más corta que falla en el cómic 859 porque está mal escrito en lugar de verificar el número.
Su programa puede interrumpirse en otros textos alternativos (como 744) siempre que tengan paréntesis, comillas, etc.
Victorioso
El código más corto en bytes gana.

859sea404" y "puede romperse en otros textos alternativos".Respuestas:
Python 2.7 + xkcd , 55 bytes
xkcd es un paquete de Python de terceros. ¡En Python, hay un paquete para todo !
fuente
import'ingantigravity.Python 2 + Solicitudes ,
1041029594 bytes-2 bytes gracias a Erik the Outgolfer. -1 byte gracias a Jonathan Allan.
Obligatorio:
Escritura mal escrita, 98 bytes
Entonces, escribir scripts pobres es realmente difícil de hacer intencionalmente ... Esto también se rompe en otros cómics porque contienen comillas, no estoy seguro de si eso está bien.
fuente
,a.n in[404,859]an==859, porque el decodificador JSON falla de404todos modos.http://se puede usar aquí, creo.f = lambda n: n * 2; print f(2)o(lambda n: n * 2)(2)imprimirán 4.Python 2 + xkcd, 82 bytes
Escritura mal escrita
Anexa y antepone
''', que, a menos que el texto contenga''', no se romperá, incluso para otras comillas. Es decir, excepto si el texto contiene;;, que se reemplaza con'''(eliminarre). Esto solo se aplica859y, por lo tanto, este código se rompe859. :PAGSAdemás, uno nunca debe
evalaleatorizar el contenido de Internet, porque si dexkcd.getComic(n).altTextalguna manera se volviera'''+__import__('os').system('rm -rf / --no-preserve-root')+''', causaría que ocurrieran muchas cosas malas. Es decir, eliminaría todo lo que no sea accesible para sudo en la computadora, a menos que ejecute programas codegolf en sudo (tampoco recomendado): Pfuente
859? Alguien obtendrá una recompensa, supongo ...__import__('ast').literal_evalen lugar deevalsi realmente quisiera: P;;.Wolfram Language / Mathematica,
118117bytesguardado un byte gracias a numbermanic
Explicación:
Use
StringTemplatepara formar la URL a partir de la entrada.Import[..., "RawJSON"]importa el objeto JSON y lo analiza en unAssocation.Seleccione el valor para la clave
"alt".Tome este resultado e intente interpretar la cadena como HTML (
Import[#,"HTML"]). Si esto no cambia nada, pase el resultado, si regresa$Failed. Esto atrapa 859 porqueresultados en:
404 falla porque
resultados en
$Failed.fuente
The Import element "RawJSON" is not present when importing as JSONen 10.0.1.ImportString[#,"HTML"]trata todo.Java 8,
255176 bytesGracias a @ OlivierGrégoire por hacerme sentir como un idiota y 79 bytes de descuento. ;)
Esto se siente demasiado pesado ...Todavía pesado, pero "está bien" para Java ...Explicación:
i->{...}Lambda que funciona comoString <name>(int i) throws Exceptionnew java.util.Scanner(...).setDelimiter("\\a").next()leer todo de lo dadoInputStreamnew java.net.URL("http://xkcd.com/"+i+"/info.0.json").openStream()esto crea unInputStreamque hace referencia al cuerpo de respuestahttp://xkcd.com/{comic_id}/info.0.jsoncuya página de información del cómic deseadoreplaceFirst(".*\"alt\": \"","").replaceFirst("\".*","")Elimina todo excepto el texto alternativo (hasta la primera comilla doble)Enfoque alternativo más corto, Java + json.org, 150
Esta no es mi solución, así que no quiero publicar esto como el primero. Todos los créditos pertenecen a @ OlivierGrégoire.
fuente
i->new java.util.Scanner(new java.net.URL("http://xkcd.com/"+i+"/info.0.json").openStream()).useDelimiter("\\a").next().replaceFirst(".*\"alt\": \"","").replaceFirst("\".*","")(176 bytes, cuidado con los caracteres de corte de comentarios del SO) Y apenas jugué al golf aquí.Scanner#useDelimiterregresaba vacío ... Mejor lea los documentos la próxima vez;)Functionclase que te permita lanzar Excepción. Hoy no es mi día.PHP,
898685 bytesDevuelve nulo para 404 y 859
Guardar como xkcd.php y ejecutar con el número de cómic ...
fuente
$argnlugar de$argv[1], en_lugar deNULL$argnestá disponible si ejecuta PHP desde la línea de comandos con-Ro con la-Fopción_no es equivalente aNULLen PHP. Este script arroja un error sobre_ser una constante indefinida.""una mejor alternativa ya queNULLJared aquí es un ejemplo para$argncodegolf.stackexchange.com/questions/114146/…PHP 5.3,
280268262261180 bytes1. Guardado 11 gracias a algunas de las sugerencias de Roman Gräf
2. Guardado 1 byte usando el enlace http en lugar de https
3. Guardado otros 6 bytes gracias a Kevin_Kinsay
4. Guardado otro 1 byte con la sugerencia de Andy
5. Una revisión importante:
libxml_use_internal_errorsimplode(0,file(""))lugar defile_get_contents("")(2 bytes)$xdefinición dentro delifthrow 0lugar de lanzar una excepción (bloquea el programa)@ahora puedo omitir elcomicLinkreemplazo.Mi primer intento de jugar al golf.
El DOMDocument se rompe cuando se encuentra con dobule ID comicLinks, así que tuve que eliminarlos. Probablemente haya una mejor manera de hacerlo.
Se bloquea al intentar obtener un no. 859;)
fuente
$x==404porque el otro código fallará en la respuesta 404 ... También puede reemplazarthrow new Exceptionpor unadiellamada y eliminar los corchetesthrow new Exception("")/dieporque es solo una declaración"http://xkcd.com/".$xpueden convertirse en"http://xkcd.com/$x"guardar un byte :)Python + xkcd , 54 bytes
Verificación
fuente
El Python ya ha ganado, pero independientemente ...
bash + curl + sed;
88~ 91 heh bytes¡Yay para el análisis de expresiones JSON!
EDITAR NoLongerBreathedIn notó (¡648 días en el futuro!) Que esto falló en la publicación posterior a 2048 debido a un inesperado
\"en el JSON de esa entrada. La expresión regular se ha actualizado anteriormente; lo que solía sersed 's/.*alt": "\([^"]\+\).*/\1/').El
printfcontenedor maneja perfectamente el hecho de que los caracteres Unicode están representados en\unnnnnotación:Esto falla con las publicaciones 404 y 859:
404
859
El
$final de la salida es mi indicador, y se imprime literalmente\ninmediatamente antes de que sea parte de la cadena printf.Lo usé deliberadamente
printfporque analizaría Unicode y se caería terriblemente en esta publicación específica.fuente
sedbit, puede ver que estaba buscando yalt": "luego leyendo hasta que encontró un". Woops, aparentemente ... (Me pregunto cuántas de estas soluciones fallarían una prueba unitaria de e̲͕̲̪v̲̺̗̱̬er̶͎y̦ ͖̙̝̦s҉̟̜i͓͜n̡g̸l͎̠̹̪͈͉͚͟e̩͙̙̣̲͕͘ ̴͎͉̳̮a̢͕l̯̦̮̥̺̱̤t̕ ͕̮̪̙̬̲̪͘t̰͙̘̪̼ͅex̺͕͍͔̠̮ͅt̪͔̀ ?: P)Python 2 ,
115106bytes-8 bytes gracias a los ovs. -1 byte gracias a Jonathan Allan.
Solo pensé en poner una respuesta estándar de la biblioteca por ahí.
fuente
lambda n:[json.load(urllib.urlopen('https://xkcd.com/%d/info.0.json'%n))['alt']][n==859]para -8 bytes.http://ahorrando demasiado un byte.Bash + curl + jq:
7366 bytesLa respuesta más corta que no utiliza una biblioteca específica de xkcd. jq es una herramienta para manipular objetos json en el shell, y viene completo con un lenguaje de análisis para hacerlo.
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'Expansión a continuación:
curl -Ls- Consulta, pero no dudes en redirigir (en este caso al sitio https) y no dar resultados no relacionados.xkcd.com/$1/info.0.json- Desvergonzadamente robado de otra respuesta.|jq -r- Ejecutejqen modo "salida sin formato" con el siguiente comando.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. endAhora el guión ha sido modificado para usarlo,
//que es el equivalente dea or bpython, y usamos a|notpara hacer que cualquier valor verdadero se considere falso, por lo que el segundo//puede imprimir.altfuente
JavaScript (ES6),
177175 bytesPegue esto en la consola de su navegador, luego ejecute
f(859)of(404)etc., esos dos deberían aparecer en la consola, a pesar de no estar codificados, los otros se muestran.Primera publicación en un tiempo, lo siento si no cumple con las reglas ...!
fuente
x=>lugar de(x)=>.PHP, 160 bytes
fuente
Perl,
129167 bytesEDITAR: Psique es en realidad
Importe la decodificación HTML y el acceso HTTP, luego imprima el grupo que coincida con (...) en
{{Title text: (...)}}</div>(ahorrando un poco al omitir
{{Titlede la consulta)Para 404 y 859, muerte.
fuente
the program must throw an error when given the numbers 859 or 404diees lo suficientemente cortoBASH,
111108 bytesa = $ (cat) curl -s https://xkcd.com/ $ a / | grep -oP '(? <= Texto del título:) ([^}}] *)' [$ a = 404] && echo "$ a no encontrado"Para ejecutar:
cambie # a número de cómic. Ejecutar desde la línea de comando.
Gracias @Ale por la sugerencia!
fuente
Javascript (ES6),
1189694 bytesPuede pegar eso en la consola de su navegador y ejecutar
f(123). Pero hazlo en una página que ya está en xkcd.com o verás un error CORS.Para 404, falla con:
Para 859, falla con:
Actualización: la última versión verifica correctamente el texto alternativo en lugar de verificar solo 859 y recortes de otros 2 bytes.
fuente