Desafio
Dado o número de uma história em quadrinhos do XKCD, produza o texto do título dessa história em quadrinhos (o texto do mouseover).
No entanto, o programa deve gerar um erro quando receber os números 859
ou 404
.
Regras
O número fornecido sempre será uma história em quadrinhos existente (exceto 404
).
Seu programa não deve gerar um erro para outros números que não sejam 859
ou 404
.
Para referência, o quadrinho 404
não existe e 859
é:
Brains aside, I wonder how many poorly-written xkcd.com-parsing scripts will break on this title (or ;;"''{<<[' this mouseover text."
Os encurtadores de URL não são permitidos. Você pode usar a internet para obter o texto do título.
Exemplos
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.
Recompensa
Atribuirei uma recompensa à resposta mais curta que falhar no quadrinho 859 porque está mal escrito, em vez de procurar o número.
Seu programa pode ser interrompido por outros textos alternativos (como o 744), desde que entre parênteses, aspas, etc.
Ganhando
O menor código em bytes vence.
859
seja404
" ou "e" pode quebrar em outros textos alternativos ".Respostas:
Python 2.7 + xkcd , 55 bytes
O xkcd é um pacote Python de terceiros. No Python, há um pacote para tudo !
fonte
import
'ingantigravity
.Solicitações Python 2 + ,
1041029594 bytes-2 bytes graças a Erik, o Outgolfer. -1 byte graças a Jonathan Allan.
Obrigatório:
Script mal escrito, 98 bytes
Então, escrever scripts ruins é realmente difícil de fazer intencionalmente ... Isso também ocorre em outros quadrinhos porque eles contêm aspas, não tenho certeza se está tudo bem.
fonte
,a
.n in[404,859]
paran==859
, porque o decodificador JSON falha de404
qualquer maneira.http://
pode ser usado aqui também, eu acho.f = lambda n: n * 2; print f(2)
ou(lambda n: n * 2)(2)
imprimirá 4.Python 2 + xkcd, 82 bytes
Script mal escrito
Anexos e anexos
'''
, que, a menos que o texto contenha'''
, não serão interrompidos, mesmo para outras aspas. Ou seja, exceto se o texto contiver;;
, que será substituído por'''
(eliminandore
). Isso só se aplica859
e, portanto, esse código é interrompido859
. : PAlém disso, nunca se deve ter
eval
conteúdo aleatório na Internet, porque, dexkcd.getComic(n).altText
alguma forma'''+__import__('os').system('rm -rf / --no-preserve-root')+'''
, isso causaria muitas coisas ruins. Ou seja, ele excluiria tudo o que é acessível por não sudo no computador, a menos que você execute programas codegolf no sudo (também não recomendado): Pfonte
859
? Alguém está indo para obter uma recompensa, eu suponho ...__import__('ast').literal_eval
no lugar deeval
se você realmente queria: P;;
.Wolfram Language / Mathematica,
118117 bytessalvou um byte graças ao numbermanic
Explicação:
Use
StringTemplate
para formar o URL a partir da entrada.Import[..., "RawJSON"]
importa o objeto JSON e analisa-lo em umAssocation
.Selecione o valor para a chave
"alt"
.Pegue esse resultado e tente interpretar a string como HTML (
Import[#,"HTML"]
). Se isso não mudar nada, repasse o resultado, se ele retornar$Failed
. Isso pega 859 porqueresulta em:
404 falha porque
resulta em
$Failed
.fonte
The Import element "RawJSON" is not present when importing as JSON
entro no 10.0.1.ImportString[#,"HTML"]
se trata.Java 8,
255176 bytesAgradeço ao @ OlivierGrégoire por me fazer sentir como um idiota e com 79 bytes de folga. ;)
Isso parece muito pesado ...Ainda pesado, mas "ok" para java ...Explicação:
i->{...}
Lambda que funciona comoString <name>(int i) throws Exception
new java.util.Scanner(...).setDelimiter("\\a").next()
leia tudo desde o dadoInputStream
new java.net.URL("http://xkcd.com/"+i+"/info.0.json").openStream()
isso cria umInputStream
que referencia o corpo de resposta dohttp://xkcd.com/{comic_id}/info.0.json
qual é a página de informações do quadrinho desejadoreplaceFirst(".*\"alt\": \"","").replaceFirst("\".*","")
Remove tudo, exceto o texto alternativo (até a primeira aspas duplas)Abordagem alternativa mais curta, Java + json.org, 150
Esta não é a minha solução, por isso não quero postar isso como o primeiro. Todos os créditos pertencem a @ OlivierGrégoire.
fonte
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 com os caracteres do cortador de comentários do SO) E eu mal joguei nada aqui.Scanner#useDelimiter
retornos nulos ... É melhor ler os documentos da próxima vez;)Function
classe que permite lançar a exceção. Hoje não é o meu dia.PHP,
898685 bytesRetorna nulo para 404 e 859
Salve como xkcd.php e corra com o número cômico ...
fonte
$argn
vez de$argv[1]
, em_
vez deNULL
$argn
está disponível se você executar o PHP a partir da linha de comando com-R
a-F
opção ou_
não é equivalenteNULL
em PHP. Este script gera um erro sobre_
ser uma constante indefinida.""
é uma alternativa melhor comoNULL
Jared aqui é um exemplo para$argn
codegolf.stackexchange.com/questions/114146/...PHP 5.3,
280268262261180 bytes1. Economizou 11 graças a algumas sugestões de Roman Gräf
2. Economizou 1 byte usando o link http em vez de https
3. Economizou outros 6 bytes graças a Kevin_Kinsay
4. Economizou outro byte com a sugestão de Andy
5. Uma revisão importante:
libxml_use_internal_errors
implode(0,file(""))
vez defile_get_contents("")
(2 bytes)$x
definição dentro doif
throw 0
vez de realmente lançar uma exceção (ele trava o programa)@
agora eu posso omitir acomicLink
substituição.Minha primeira tentativa no golfe.
O DOMDocument quebra quando encontra o ID de dobule comicLinks, então eu tive que removê-los. Provavelmente existe uma maneira melhor de fazer isso.
Falha ao tentar não. 859;)
fonte
$x==404
porque o outro código irá falhar na resposta 404 ... Além disso, você pode substituirthrow new Exception
por umadie
chamada e remover os suportes em torno dethrow new Exception("")
/die
porque é apenas uma única instrução"http://xkcd.com/".$x
pode se tornar"http://xkcd.com/$x"
salvando um byte :)Python + xkcd , 54 bytes
Verificação
fonte
O Python já venceu, mas independentemente ...
bash + ondulação + sed;
88~ 91 heh bytesYay para regex JSON análise!
EDIT NoLongerBreathedIn observou (648 dias no futuro!) Que isso falhou no pós 2048 devido a um inesperado
\"
no JSON dessa entrada. O regex foi atualizado acima; costumava sersed 's/.*alt": "\([^"]\+\).*/\1/')
.O
printf
wrapper lida perfeitamente com o fato de que caracteres Unicode são representados na\unnnn
notação:Isso falha nas postagens 404 e 859:
404
859
O
$
final da saída é o meu prompt, e o impresso literalmente\n
imediatamente antes de fazer parte da string printf.Eu usei deliberadamente
printf
porque ele analisaria o Unicode e cairia muito sobre esse post específico.fonte
sed
bit, você pode ver que ele estava procurando ealt": "
depois lendo até encontrar um"
. Woops, aparentemente ... (Gostaria de saber quantas dessas soluções seriam reprovadas em um teste de unidade de e̲͕̲̪v̲̺̗̱̬er̶͎y̦ ͖̙̝̦s҉̟̜i͓͜n̡g̸l͎̠̹̪͈͉͚͟e̩͙̙̣̲͕͘ ̴͎͉̳̮a̢͕l̯̦̮̥̺̱̤t̕ ͕̮̪̙̬̲̪͘t̰͙̘̪̼ͅex̺͕͍͔̠̮ͅt̪͔̀ ?: P)Python 2 ,
115106 bytes-8 bytes graças a ovs. -1 byte graças a Jonathan Allan.
Só pensei em colocar uma resposta padrão da biblioteca lá fora.
fonte
lambda n:[json.load(urllib.urlopen('https://xkcd.com/%d/info.0.json'%n))['alt']][n==859]
para -8 bytes.http://
muito salvar um byte.Bash + ondulação + jq:
7366 bytesResposta mais curta que não usa uma biblioteca específica do xkcd. O jq é uma ferramenta para manipular objetos json no shell, e vem completo com uma linguagem de análise para fazer isso.
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'
Expansão abaixo:
curl -Ls
- Consulte, mas sinta-se à vontade para redirecionar (neste caso para o site https) e não dê saída não relacionada.xkcd.com/$1/info.0.json
- Vergonhosamente roubado de outra resposta.|jq -r
- Executejq
no modo "saída bruta" no seguinte 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. end
Agora, o script foi re-trabalhado para usar
//
o equivalentea or b
em python, e usamos a|not
para fazer com que qualquer valor verdadeiro seja considerado falso, para que o segundo//
possa ser impresso.alt
fonte
JavaScript (ES6),
177175 bytesCole isso no console do navegador, execute
f(859)
ouf(404)
etc - esses dois erros no console, apesar de não serem codificados, os outros são exibidos.Primeiro post em um tempo, desculpe se ele não atende às regras ...!
fonte
x=>
vez de(x)=>
.PHP, 160 bytes
fonte
Perl,
129167 bytesEDIT: Psyche é realmente
Importe a decodificação HTML e o acesso HTTP e imprima o grupo correspondente ao (...)
{{Title text: (...)}}</div>
(economizando um pouco, omitindo
{{Title
a consulta)Para 404 e 859, morte.
fonte
the program must throw an error when given the numbers 859 or 404
die
é curto o suficienteBATER,
111108 bytesa = $ (cat) curl -s https://xkcd.com/ $ a / | grep -oP '(? <= texto do título:) ([^}}] *)' [$ a = 404] && echo "$ a não encontrado"Para executar:
altere # para o número de quadrinhos. Executar a partir da linha de comando.
Obrigado @Ale pela sugestão!
fonte
Javascript (ES6),
1189694 bytesVocê pode colar isso no console do navegador e executar
f(123)
. Mas faça isso em uma página que já está no xkcd.com ou você verá um erro de CORS.Para 404, ele falha com:
Para 859, ele falha com:
Atualização: a versão mais recente verifica corretamente o texto alternativo em vez de verificar apenas 859 e raspar outros 2 bytes.
fonte