Photo glamour fabuleuse

11

entrez la description de l'image ici

J'ai trouvé cette photo sur le Web aujourd'hui. Étant un programmeur paresseux, je ne veux pas vraiment ouvrir Google et taper quelques caractères. Beaucoup trop de travail! Il s'agit d'une tâche tellement importante qu'elle devrait être automatisée.

Défi

Tout le monde sait que la première image d'un résultat de recherche Google est toujours la meilleure. Il doit donc être présenté à l'utilisateur.

Vous devez écrire un programme ou une fonction qui prend une chaîne en paramètre et affiche la première image qu'il trouve sur Google lorsque vous recherchez ce nom + les mots glamour shotderrière.

Requêtes de recherche Google

Pour rechercher des images sur Google, l'URL doit contenir le paramètre de requête tbm=ischet q=query, avec queryle nom que vous souhaitez rechercher.
Une chaîne de requête valide pour mon nom Basseraitwww.google.com/search?tbm=isch&q=Bas

Contribution

Votre programme ou fonction prend un seul paramètre d'entrée, qui est le nom que vous souhaitez rechercher sur google. Cette chaîne sera composée des personnages [a-z], [A-Z], [0-9]et (espace). Cette chaîne peut être séparée par des espaces, pour rechercher une chaîne séparée par des espaces sur Google, il faut remplacer les espaces par +. Par exemple, il s'agit d'une requête valide:
www.google.com/search?tbm=isch&q=Bassdrop+Cumberwubwubwub+glamour+shot

Production

L'image peut être dessinée à l'écran ou enregistrée dans un fichier (dans n'importe quel format).
Si le premier résultat de recherche sur google est un fichier gif, vous pouvez soit afficher le gif, soit afficher n'importe quelle image de ce gif.

Cas de test

Exécutez cet extrait pour voir les résultats attendus

C'est le , le code le plus court en octets gagne!

Bassdrop Cumberwubwubwub
la source
Quels caractères doivent être pris en charge dans l'entrée? Avons-nous besoin de nous soucier du codage des URL?
Martin Ender
@Martin Ender [a-z0-9], a modifié mon article. Les URL ressembleront aux exemples que j'ai fournis, aucun encodage n'est nécessaire, juste de l'espace pour+
Bassdrop Cumberwubwubwub
Je suppose, A-Zpeut également apparaître, à en juger par votre exemple?
Martin Ender
@MartinEnder Oui, il n'est pas sensible à la casse. Oublié de mentionner
Bassdrop Cumberwubwubwub
2
Il y a un nombre surprenant de personnes qui posent avec des fusils lorsque vous jouez à ce jeu: D
Beta Decay

Réponses:

8

PowerShell v4 +, 160 octets

param($a)iwr (((iwr "google.com/search?tbm=isch&q=$($a-replace' ','+')+glamour+shot").links|?{$_.innerhtml-like"*$a*"})[0].innerhtml-split'"')[3] -outf "$a.jpg"

Prend l'entrée $asous forme de chaîne. Fait un Invoke-WebRequest( iwr) à l'emplacement Google approprié, en utilisant un bloc de script de chaîne interne pour les -replaceespaces avec +dans la chaîne d'entrée. Nous prenons le .linksde cela, où le .innerhtmlest -likenotre chaîne d'entrée. Cela donne les liens avec la description de vignette appropriée. Prenez le premier [0]de ceux-ci, prenez le sien .innerhtml et -splitle sur les citations. Le quatrième [3]élément est le texte à l'intérieur de la img src="partie, nous en faisons donc un autre iwren spécifiant que -outfile doit être $a.jpgdans le dossier local. Comme ce ne sont que les vignettes générées par Google, elles sont garanties au format jpg.

AdmBorkBork
la source
1
vous pouvez changer google.comavec google.nlpour -1 octet
Taylor Scott
4

Excel VBA + , 465 332 octets

REMARQUE: utilise des références à

  • Bibliothèque d'objets HTML Microsoft
  • Contrôles Internet de Microsoft
  • Microsoft Scripting Runtime

Golfé:

SubRoutine complète qui prend une entrée n(abréviation de nom) du type attendu Variant/Stringet génère le premier résultat de recherche d'images google pour la requête de ce nom et glamour shotvers une fenêtre Internet Explorer.

Sub g(n)
Set i=New InternetExplorer
l="google.nl/search?tbm=isch&q="&Replace(n," ","+")&"+glamour+shot"
For y=0To 2
i.navigate l
While i.readyState<4
DoEvents
Wend
j=0
Do Until InStr(1,l,IIf(y,"yp","res"))
j=j+1
Set x=i.document.getElementsByTagName(IIf(y,"img","a"))(j)
If y Then l=x.src Else l=x.href
Loop
Next
i.visible=1
End Sub

-2 octets pour supprimer les espaces blancs dans If InStr(1, a.href, "imgres") Then

-2 octets pour passer .navigate (a.href)à.navigate a.href

-27 octets pour réduire la for each a in ... if (...) then ... end if .. nextboucle àdo until ... loop

-10 octets pour la condensation imgresvers reset encryptedversyp

-8 octets pour la suppression initalizers pour j, ket en supposant que le module propre

-1 octet pour passer google.comàgoogle.nl

-3 octets pour remplacer Dim i as New ...parSet i=New ...

-8 octets pour supprimer SHDocVw.la référence de classe

-12 octets pour supprimer le with ibloc

-7 octets pour la suppression i.quit- cela provoque une fuite de mémoire en laissant Internet Explorer ouvert en arrière-plan, en tant que tel, il est recommandé d'utiliser la version complète non golfée à la place ou de terminer la tâche Internet Explorer via le gestionnaire de tâches après utilisation

-6 octets pour passer i.navigateau sous-programme d'assistanceh

-13 octets pour passer Do Until ... Loopau sous-programme d'assistance

-2 octets en se déplaçant j=0dans l'assistant et en supprimant ,j, ,0(x2)

-11 octets pour la conversion en une fonction de fenêtre immédiate anonyme

-8 octets pour réduire les appels de fonction d'assistance en for .. nextboucle

-16 octets pour changer la sortie de l' Sheets(1)objet d'image en affichage via l' InternetExplorerobjet

Non golfé, 1304 octets

Option Private Module
Option Compare Text
Option Explicit
Option Base 0

Sub GlamourShot(ByVal name As String)

    Dim ie As New SHDocVw.InternetExplorer, _
        doc As MSHTML.HTMLDocument, _
        link As String, _
        j As Integer, _
        k As Integer

    With ie
        On Error GoTo CloseIE #'prevents memory leak

        Let .visible = True
        Call .navigate("www.google.com/search?tbm=isch&q=" & _
                    Replace(name, " ", "+") & _
                    "+glamour+shot")
        While .readyState <> READYSTATE_COMPLETE Or .Busy
            VBA.DoEvents
        Wend

        Set doc = .document

        Let j = 1
        Do Until InStr(1, link, "imgres") > 0
            Let link = doc.getElementsByTagName("a")(j).href
            Let j = j + 1
        Loop

        Call .navigate(link)
        While .readyState <> READYSTATE_COMPLETE Or .Busy
            VBA.DoEvents
        Wend

        Let k = 1
        Do Until InStr(1, link, "encrypted") > 0
            Let link = doc.getElementsByTagName("img")(k).src
            Let k = k + 1
        Loop

        With ThisWorkbook.ActiveSheet
            Call .Range("A1").Select
            Call .Pictures.Insert(link)
            Call .Activate
        End With
CloseIE:
        Call .Quit
    End With
End Sub

Gif d'utilisation

Gif d'utilisation

Taylor Scott
la source
3

Vimperator , 30 touches

pgi<End> glamour shot<CR>fi222jf<CR>fim2

Alternativement 27 touches si vous n'avez pas besoin de l'image à la résolution la plus élevée:

pgi<End> glamour shot<CR>fi222j;I<CR>

Vidéo: https://youtu.be/t8824UjlYt8



Heureusement, le moteur de recherche standard de Firefox est Google, et Vimperator vous permet de taper des indices par défaut. C'est plus long que nécessaire pour être sûr qu'il fonctionne toujours, indépendamment de ce que vous recherchez.

Prend des entrées via le presse-papiers.

Explication:

p             Google the contents of the clipboard
gi            Select the search box
<End>         Move the cursor to the end of the text
 glamour shot Type " glamour shot"
<CR>          Press enter to search
fi2           Click the second link that begins with the letter "i" (images)
22j           Go 22 scroll steps down on the page.
              This makes it so that the first row of images are at
              the very top of the screen.

f<CR>         Click the first clickable element, which is the
              first image because we scrolled down

fim2          Click the second link containing "im" (view image)

Merci à @TaylorScott d'avoir trouvé un cas de bord.

BlackCap
la source
Est-ce que cela gère les cas lorsque Google recommande d'autres résultats de recherche, comme c'est le cas dans ce cas
Taylor Scott
@TaylorScott Ce n'est pas le cas, mais je ne parviens pas à obtenir de recommandations dans Firefox. Cela pourrait-il dépendre du navigateur?
BlackCap
1
Peu importe
3

Python 3.6, 247 242 232 peut-être 224 octets

Ceci est une tentative mignonne de résoudre celui-ci. Il enregistrera le fichier comme p.pngdans le répertoire courant.

import sys; import requests as r; from bs4 import BeautifulSoup as s;
n = sys.argv[1]; open('p.png', 'wb').write(r.get(s(r.get(f'https://www.google.com.br/search?tbm=isch&q={n}+glamour+shot').content,'lxml').find_all('img')[1].get('src')).content)

Pour l'exécuter facilement à partir de la ligne de commande, placez simplement le contenu ci-dessus dans un fichier, tel que glamour.pyet exécutez:

$ python glamour.py NAME_YOU_WANT

Mise à jour 1: meilleure version avec la nouvelle URL Google

import sys; import requests as r; from bs4 import BeautifulSoup as s;
n = sys.argv[1]; open('p.png', 'wb').write(r.get(s(r.get(f'http://www.google.nl/search?tbm=isch&q={n}+glamour+shot').content,'lxml').find_all('img')[1].get('src')).content)

Mise à jour 2:

J'ai économisé quelques octets:

  • En important uniquement la fonction get depuis le module des requêtes
  • profiter du nouveau fdrapeau d' interpolation de chaîne python 3.6 sans allouer le sys.argvà une variable
  • éliminer certains espaces blancs
  • en le transformant en une ligne
  • suppression de la spécification de l'analyseur de l' BeautifulSoupappel

Le dernier est controversé, car il entraîne un message std.output indiquant au programmeur de spécifier l'analyseur pour la compatibilité multiplateforme, il peut donc être considéré comme une sortie indésirable.

Voici la version 224 octets:

import sys;from requests import get;from bs4 import BeautifulSoup as s;open('p.png','wb').write(get(s(get(f'http://www.google.nl/search?tbm=isch&q={sys.argv[1]}+glamour+shot').content).find_all('img')[1].get('src')).content)

Voici la version 232 octets:

import sys;from requests import get;from bs4 import BeautifulSoup as s;open('p.png','wb').write(get(s(get(f'http://www.google.nl/search?tbm=isch&q={sys.argv[1]}+glamour+shot').content, 'lxml').find_all('img')[1].get('src')).content)

Mais la version plus courte pourrait être utilisée si std.out est redirigé vers /dev/nullou quelque chose comme ça: D

Gui42
la source
Je pourrais probablement avoir une version avec urllib + html.parse afin qu'elle puisse fonctionner entièrement avec la bibliothèque standard.
Gui42
1
vous pouvez probablement utiliser www.google.nl/ou peut-être même google.nlau lieu d' https://www.google.com.br/enregistrer quelques octets
Taylor Scott
1
pour une raison quelconque, je dois le garder http://pour qu'il fonctionne avec les demandes. Mais le google brésilien m'a donné des résultats plus drôles, donc je
perds des
Est-ce que cela gère les cas lorsque Google recommande d'autres résultats de recherche, comme c'est le cas dans ce cas (vous devrez peut-être effectuer plusieurs recherches pour obtenir des suggestions comme celle-ci)
Taylor Scott
J'aime aussi la façon dont je gagne quelques octets grâce à la n = 'something'; f'{n}_here'place de n = 'something'; '{n}_here'.format(n = n)oun = 'something'; '{}_here'.format(n)
Gui42
1

Raquette, 284 byes

(require net/url html-parsing sxml racket/draw)(define(g n)(let([g(compose get-pure-port string->url string-append)])(make-object bitmap%(g(car((sxpath"//*[@id='ires']//@src/text()")(html->xexp(g"http://www.google.com/search?tbm=isch&q="(string-replace n" ""+")"+glamour+shot"))))))))

Capture d'écran: entrez la description de l'image ici

Geoff Reedy
la source