Wikipedia: Philosophie!

26

Wie viele Geeks vielleicht wissen, führen die meisten Seiten (95% meiner Meinung nach) auf Wikipedia zu einer Philosophie wie dieser:

Klicken Sie auf den ersten nicht kursiven oder in Klammern gesetzten Link, der zu einem anderen normalen Artikel führt: (dh nicht File: oder Special:, aber Dinge wie Wikipedia: sind in Ordnung) und wiederholen Sie diesen, bis Sie Philosophie getroffen haben.

Das Skript muss:

  • Nehmen Sie eine erste Seite als Eingabe
  • Gib den Namen jedes Artikels aus, den du erhältst
  • Und drucken Sie, wie viele Artikel es gekostet hat, um zur Philosophie zu gelangen, und wenn es nicht so war.

Sie beginnen mit 1000 Punkten und verlieren einen für jedes Zeichen im Code. Bonuspunkte für:

Schleifen von Gegenständen erkennen und anhalten: +50

Erkennen von sich wiederholenden Artikeln und Anfordern, ob der Benutzer zum nächsten Link zum Artikel gehen soll: +170

Zulassen eines Standards für die vorherige Prüfung als Befehlszeilenargument oder Ähnliches: +140

Höchste Punktzahl gewinnt.

AlphaModder
quelle
7
+1, große Herausforderung! Diese Klammererkennung ist schwierig: P
Türknauf
1
Ich habe das Gefühl, dass dies eine bessere Definition gebrauchen könnte, aber ich bin mir noch nicht sicher, wie das genau ist.
Iszi
3
Verlieren Sie einen Punkt für jedes eingegebene Zeichen. Hmm. Großartig, ich habe es verstanden, ich kopiere einfach die Zeichen und füge sie ein! Keine Punkte verloren!
Justin
5
Bitte ändern Sie die Regeln nicht, nachdem die Antworten bereits veröffentlicht wurden. Das ist ziemlich unhöflich und wird von der Community hier allgemein verpönt ...
Türklinke

Antworten:

8

Ruby, 1000 - 303 299 337 - 50 373 - 170 382 - 170 - 140 379 - 170 - 140 Zeichen = 697 701 713 797 928 931

Ich bin mir sicher, dass noch viele Verbesserungen vorgenommen werden müssen.

(Dies erfordert Nokogiri)

require'open-uri'
require'nokogiri'
x="/wiki/"+gets.chomp
r=[n=i=0]
until x=~/\/Philosophy/
d=Nokogiri.HTML open"http://en.wikipedia.org#{x}"
x=d.css('p a').select{|a|t=a.xpath('preceding::text()').map(&:text)*'';t.count('(')==t.count(')')&&a.attr('href')=~/^.wiki[^:]+$/}[i].attr'href'
i=0
puts r.index(x)?"#{$><<'i=';i=($*[0]||gets).to_i;''}": r.push(x)[-1][6..-1]
n+=1
end
p n

Beispiellauf:

c:\a\ruby>wikipedia_crawl_philosophy
Latin (note: this is my input)
Classical_antiquity
History
Umbrella_term
Terminology
Word
Linguistics
Science
Knowledge
Fact
Proof_(truth)
Argument
Logic
Reasoning
Consciousness
Quality_(philosophy)
Property_(philosophy)
Modern_philosophy
Philosophy
18

Beispiel eins, wo ich zu einem anderen Link gehen musste

c:\a\ruby>wikipedia_crawl_philosophy
Snow
Precipitation_(meteorology)
Meteorology
Atmospheric_physics
Synoptic_scale_meteorology
i=2 // I put the 0-indexed number of the link I wanted to go to (so, the third link)

Weather
Atmosphere
Gas
State_of_matter#The_four_fundamental_states
Physics
Natural_science
Sciences
Knowledge
Fact
Proof_(truth)
Argument
Logic
Reasoning
Consciousness
Quality_(philosophy)
Property_(philosophy)
Modern_philosophy
Philosophy
25

Tricks, die ich verwendet habe:

  • Ich habe den Selektor verwendet, p aum nur nicht kursive Links zu erhalten, da sich alle nicht kursiven Links im eigentlichen Artikel immer in Absatzelementen in Wikipedia befinden.
Türknauf
quelle
hmmm ... vielleicht sollte ich nur Bibliotheken verbieten, die mit der Sprache kommen ...
AlphaModder
@ user1825860 Es ist eigentlich keine Bibliothek, die mit der Sprache geliefert wird. Es ist ein Juwel. Ich habe meine Antwort bearbeitet. Aber wirklich, möchten Sie diese ohnehin schon harte Herausforderung annehmen und uns zwingen, keine HTML-Parsing-Bibliotheken zu verwenden? : P
Türklinke
Ich lasse es nicht zu, aber Sie verlieren Punkte: P
AlphaModder
Sie sollten den ersten Beitrag erneut lesen und entsprechend bearbeiten: P
AlphaModder
2
@ user1825860 Bitte ändern Sie die Regeln nicht, nachdem bereits Antworten gepostet wurden. Das ist ziemlich unhöflich ...
Türklinke
5

"BASH " - (falls nicht verwechselt: 1000 - 397 + 170 + 140 = 913 Punkte)
"BASH" - (falls nicht verwechselt: 1000 - 386 + 170 + 140 = 924 Punkte)

"BASH" - (Wenn nicht falsch angegeben: 1000 - 381 + 170 + 140 = 929 Punkte)

BASH wird absichtlich in Anführungszeichen gesetzt, da dies eine Mischung aus Werkzeugen ist, die in * nix-Shells verwendet werden, jedoch in ein Bash-Skript eingeschlossen sind.

Bearbeiten 1:

  • Entfernt http://als curlStandardwert zu diesem.
  • Die href=Übereinstimmung bei Ankern wurde in " f=as" geändert. <a>Andere normale Attribute, die auf " as" enden, sind nicht vorhanden f. (Es besteht die Möglichkeit von benutzerdefinierten Tags. Bisher noch keine gesehen.)
  • Setze Exit Nachricht auf nicht gefunden auf !Philstatt NoPhil. Dies ist ein wenig schrullig wie One zB auch sagen könnte !, 0, N, !Poder ähnliches.
  • Quirk zwei: -sauf curlkönnte entfernt werden durch drei weitere Bytes zu reduzieren, aber das wäre einen unordentlichen Ausgang ergeben. Ich bin mir nicht sicher, ob das ein Problem ist.
  • Aktualisierte Hilfe auf dieser Seite.

Unter Verwendung von Macken würde Code bei 379 Bytes und 931 Punkten enden.

Ich könnte auch die Verwendung des (hoffentlich) passenden Navigationsfelds in @plannapus implementieren, indem ich sechs Bytes hinzufüge (wobei sechs Punkte abgezogen werden).(p|ul).*?<(\1)

Bearbeiten 2:

Verwenden Sie ${#c[@]}, um Trennungsgrade anstelle von Zählern zu drucken $i.

Unter Verwendung von Macken würde Code bei 374 Bytes und 936 Punkten enden.


Ich beschwöre Cthulhu und greife zu einer regulären + bash / shell / * nix-Lösung.

Gestohlen:

Umgesetzt:

  • Ermitteln Sie die Schleife und fragen Sie, ob der nächste Link verwendet werden soll.
  • Optional können Sie den nächsten Link beim Duplizieren als Option auswählen.

Bedarf:

  • bash v.
  • grepmit -P(PCRE) Unterstützung.
  • sed
  • curl
  • cut

Verwendung:

script PATH [OPTIONS]

Print separation of article from ``PATH'' to ``Philosophy'' on Wikipedia.
Degrees of separation, if found, is printed as last line. 
If not found last line yields ``!Phil''.

PATH    
     Absolute path to starting article, e.g: /wiki/Word 
OPTIONS
     y   Automatically select next link if already visited.
     n   (Or other) Quit if next link already visited.
BUGS
     1. On previous visit; "next link" is not checked. Thus if next link
     has already been visited we get eternal loop. Not sure if this
     disqualify +170 points.
     2. Sure there are.

Inline-Code. In Datei kopieren. chmod +x filename. Laufen Sie von ./script /wiki/…der Bash-Shell.

u=($1);c=($1);while ! [[ "$u" =~ /Philosophy$ ]];do echo "$u";u=($(curl -s "en.wikipedia.org$u"|tr '\n' ' '|grep -Po '<p>.*?</p>'|sed 's/>[^<]*([^)]*)//g'|grep -o '<a [^>]*f="/wiki/[^":]*"'|cut -d\" -f2));for x in "${c[@]}";do if [ "$x" = "$u" ];then [ $2 ] &&s=$2||read -p "${u[0]}?" s;[ $s = y ] &&u[0]=${u[1]}||{ echo "!Phil";exit;} fi;done;c=("${c[@]}" "$u");done;echo ${#c[@]};

Erweiterter und erklärter Code:

u=($1); # Array of paths.
c=($1); # Array of visited paths.
# While $u != /Philosophy, ugly trick is to use $u instead of ${u[0]}.
while ! [[ "$u" =~ /Philosophy$ ]];do   
        echo "$u";      # Print current page.
        # curl   : prints retreived page to stdout. "-s" could be skipped.
        # tr     : replace all newline with space. This is a ®sanity thing when it comes to 
        #          twidling with html using regex.
        # grep 1 : match <p> tags. Using -P's ungreedy *?.
        # sed    : remove all occurences of "(" something ")".
        # grep 2 : match links where "href" attribute starts with /wiki/ and is not e.g. File:
        # cut    : match actual href value.
        # Result is added to array ``u''.
        u=($(curl -s "en.wikipedia.org$u" |
                tr '\n' ' ' | 
                grep -Po '<p>.*?</p>' | 
                sed 's/>[^<]*([^)]*)//g' | 
                grep -o '<a [^>]*f="/wiki/[^":]*"' | 
                cut -d\" -f2));

        # For previously visited pages as x.
        for x in "${c[@]}"; do 
                # If x equals to first page ...
                if [ "$x" = "$u" ]; then        
                        # Use option or ask.
                        [ $2 ] && s=$2 || read -p "${u[0]}?" s; 
                        # If response is "y" use next link, else exit with status.
                        [ $s = y ] && u[0]=${u[1]} || { 
                                echo "!Phil"; 
                                exit;
                        } 
                fi;
        done;
        # Append current link to "visited"
        c=("${c[@]}" "$u"); 
done;
# Print number of visited pages.
echo ${#c[@]}
Runium
quelle
Verdammt, du hast mich um einen Punkt geschlagen! : P Ich werde meine Lösung mehr Golf spielen müssen
Türklinke
Ja;), aber nicht sicher, ob dies ein gültiger Code ist. Verwenden Sie Werkzeuge auf diese Weise.
Runium
5

JavaScript 726 (444 Zeichen [556] + 170)

Jetzt weiß ich, dass dies möglicherweise nicht als Lesezeichen gilt, aber ich habe es trotzdem genossen, daran zu basteln.

Verwendung: Navigieren Sie zu der Seite, von der aus Sie beginnen möchten, und führen Sie in der Konsole Folgendes aus:

(function(a){c=0,o="";$(u="html")[u](f=$('<iframe src="'+location+'?">').on("load",function(){$=f.contentWindow.$;p=f.contentDocument.title[s="split"](" - ")[0];c++;p=="Philosophy"?document.write("<pre>"+o+p+"\n"+c):(i=RegExp("^"+p+"$","m").test(o)?a||confirm("Loop, try next?")?2:0:1)&&(f.src=$("p>a").filter(function(){return(t=$(this).parent()[u]()[s](this.outerHTML)[0])[s]("(").length==t[s](")").length})[--i].href);o+=p+"\n"})[0])})(true)

Für JavaScript ist die Ausgabe wie folgt:

JavaScript
Interpreter (computing)
Computer science
Science
Knowledge
Fact
Proof (truth)
Argument
Logic
Reason
Consciousness
Quality (philosophy)
Property (philosophy)
Modern philosophy
Philosophy
15

Bei dieser Lösung wird davon ausgegangen, dass Sie auf einer erkannten Schleife zum nächsten Link springen möchten. Wenn Sie jedoch den Link am trueEnde ändern, wird falsestattdessen ein Bestätigungsfeld angezeigt (ziemlich ärgerlich ...) Zweitbonus oder nicht. Ich nehme nicht an.

Eingerückt:

(function(l){
    c=0,o='';
    $(u='html')[u](f=$('<iframe src="'+location+'?">').on('load',function(){ // Firefox needs the ? to properly load the frame
        $=f.contentWindow.$; // reference repeated calls as strings to save more bytes
        p=f.contentDocument.title[s='split'](' - ')[0]; // get the title

        c++;
        p=='Philosophy'?
            document.write('<pre>'+o+p+'\n'+c): // pre for nice formatting
            (i=RegExp('^'+p+'$','m').test(o)?
                l||confirm('Loop, try next?')?
                    2: // desired index + 1 so we can use as a boolean
                    0
                :
                1)&&
            (f.src=$('p>a').filter(function(){
                return (t=$(this).parent()[u]()[s](this.outerHTML)[0])[s]('(').length == t[s](')').length // shorter, but still not overly happy with this...
            })[--i].href);
            o+=p+'\n' // update output
    })[0])
})(true) // change this to show confirm box when loop detected

Also habe ich ursprünglich den Teil über das Ignorieren von Elementen in Parens verpasst, was es viel wortreicher gemacht hat, also hoffe ich, diese Filterfunktion herunterzufahren (oder sie hoffentlich ganz zu ersetzen).

Arbeiten in Chrome und Firefox (getestet in Firefox 26)

Dom Hastings
quelle
2
Sieht toll aus, schlägt aber in Firefox 20 fehl.
Stand
Argghh! Ich habe nur Chrome getestet. Ich werde es untersuchen!
Dom Hastings
@boothby Sollte jetzt in Firefox funktionieren ... Ich möchte immer noch an den Links arbeiten, die ich wähle!
Dom Hastings
5

813 Zeichen

Prüfungsergebnis: 1000-813 + 50 + 170 + 140 = 547 :(

Keine externen Bibliotheken. Schleifenerkennung .

Das erste Argument ist der Quellartikel, das zweite ist der Zielartikel.

Golf Version:

class Program
{
    static void Main(string[] a)
    {
        Func<XmlDocument,IList<string>> G=delegate(XmlDocument xd){return xd.SelectNodes("//p//a[starts-with(@href,'/wiki/') and not(contains(@href,':'))]").Cast<XmlNode>().Select(n=>n.Attributes["href"].InnerText).ToList();};Action<string> W=delegate(string s){Console.WriteLine(s);};var h=new HashSet<string>();var c=new WebClient();var x=new XmlDocument();var t=c.DownloadString(@"http://wikipedia.org/wiki/"+a[0]);int i=0,C=0;
    GO:
        x.LoadXml(t);var ns=G(x);
    COL:
        var f=ns[i];if(f.Equals("/wiki/"+a[1],StringComparison.OrdinalIgnoreCase)){goto END;}if(h.Contains(f)){W("loop: "+f);i++;goto COL;}else{h.Add(f);i=0;C++;}W(f);t=c.DownloadString(@"http://wikipedia.org"+f);goto GO;
    END:
        W("Found in "+C);
    }
}

Verständliche Version:

class Program
{
    // arg[0] source article. arg[1] target article
    static void Main(string[] arg)
    {
        Func<XmlDocument, IList<string>> G = delegate(XmlDocument xd)
        {
            return xd.SelectNodes("//p//a[starts-with(@href,'/wiki/') and not(contains(@href,':'))]").Cast<XmlNode>().Select(n => n.Attributes["href"].InnerText).ToList();
        };
        Action<string> W = delegate(string s) { Console.WriteLine(s); };
        var h = new HashSet<string>(); var c = new WebClient(); var x = new XmlDocument();
        var allText = c.DownloadString(@"http://wikipedia.org/wiki/" + arg[0]);
        int i = 0; int C = 0;
    GO:
        x.LoadXml(allText);
        var ns = G(x);
    COL:
        var f = ns[i];
        if (f.Equals("/wiki/" + arg[1], StringComparison.OrdinalIgnoreCase))
        {
            goto END;
        }
        if (h.Contains(f))
        {
            W("loop: " + f); i++; goto COL;
        }
        else
        {
            h.Add(f); i = 0; C++;
        }
        W(f);
        allText = c.DownloadString(@"http://wikipedia.org" + f);
        goto GO;
    END:
        W("Found in " + C);
    }
}

Beispiellauf "Sky" bis "Philosophie":

C:\>wiki.exe Sky Philosophy

/wiki/Earth
/wiki/Geometric_albedo
/wiki/Phase_angle_(astronomy)
/wiki/Observational_astronomy
/wiki/Astronomy
/wiki/Natural_science
/wiki/Sciences
/wiki/Latin_language
/wiki/Classical_antiquity
/wiki/History
/wiki/Ancient_Greek
/wiki/Greek_language
/wiki/Modern_Greek
loop: /wiki/Greek_language
/wiki/Colloquialism
/wiki/Word
/wiki/Linguistics
/wiki/Science
loop: /wiki/Latin_language
/wiki/Knowledge
/wiki/Fact
/wiki/Latin
loop: /wiki/Classical_antiquity
/wiki/Italic_languages
/wiki/Indo-European_languages
/wiki/Language_family
/wiki/Language
/wiki/Human
/wiki/Extinct
/wiki/Biology
loop: /wiki/Natural_science
/wiki/Life
loop: /wiki/Earth
/wiki/Physical_body
/wiki/Physics
loop: /wiki/Greek_language
loop: /wiki/Natural_science
/wiki/Matter
/wiki/Rest_mass
/wiki/Center_of_momentum_frame
loop: /wiki/Physics
/wiki/Inertial_frame
loop: /wiki/Physics
/wiki/Frame_of_reference
loop: /wiki/Physics
/wiki/Coordinate_system
/wiki/Geometry
loop: /wiki/Ancient_Greek
/wiki/Mathematics
/wiki/Quantity
/wiki/Property_(philosophy)
/wiki/Modern_philosophy
Found in 41

C:\>
thepirat000
quelle
5

Scala (294 Zeichen => 1000-294 + 140 = 846 Punkte)

Die aktualisierte Lösung, die automatisch den nächsten Link übernimmt, wenn einer bereits verwendet wurde. Danke für die 140 Bonuspunkte.

Logik: Nimm den ersten "/ wiki" -Link, der kein ":" enthält (also ignoriert er "Datei:" -Link). Spülen und wiederholen mit Rekursion, wobei jedes Mal die Zählung + 1 zurückgegeben wird. Ich habe eine Liste aller vorherigen Ausgaben griffbereit, damit das Programm nicht in eine Endlosschleife gerät.

Regulärer Ausdruck: Ich habe 2 Formen des regulären Ausdrucks.

  • "<p>.*?\"/wiki/([^:]*?)\".*?/p>"Hier finden Sie Links innerhalb der <p>Tags
  • "p>.*?/wiki/([^:]*?)\""Dies ist ein etwas experimentelleres Tag, das sich bewährt hat, aber unterschiedliche Ergebnisse liefert, da es manchmal Links aus der rechten Infoleiste aufruft. Dies sind reguläre Artikel, daher glaube ich, dass sie immer noch gültig sind. Wenn dies nicht der Fall ist, kann das OP (oder jemand anderes) mir einen Kommentar hinterlassen und ich kann meine Lösung auf ein besseres Reg-Ex aktualisieren.

Ich werde den zweiten regulären Ausdruck verwenden, bis ich einen Testfall finde, in dem es nicht funktioniert oder die OP erwähnt, dass das Aufnehmen von Links von der Seitenleiste nicht zulässig ist (meiner Meinung nach sind die Infoleisten immer noch Teil von der eigentliche Artikel selbst; eher eine Zusammenfassung).


Minimierte Quelle:

object W extends App{print(x(Seq(args(0))));def x(s:Seq[Any]):Int={val? =s.last;println(?);?match{case "Philosophy"=>1;case _=>x(s:+"p>.*?/wiki/([^:]*?)\".*?/p>".r.findAllMatchIn(io.Source.fromURL("http://en.wikipedia.org/wiki/"+ ?).getLines.mkString).map(_ group 1).filter(!s.contains(_)).next)+1}}}

Lesbare Quelle:

object W extends App {
  print(x(Seq(args(0))))

  def x(s: Seq[Any]): Int = {
    val ? = s.last
    println(?)
    ? match {
      case "Philosophy" => 1
      case _ => x(s :+ "p>.*?/wiki/([^:]*?)\"".r.findAllMatchIn(io.Source.fromURL("http://en.wikipedia.org/wiki/" + ?).getLines.mkString).map(_ group 1).filter(!s.contains(_)).next) + 1
    }
  }
}

Beispielausgabe:

Eingang

Space_toilet

Ausgabe

Space_toilet
Weightlessness
G-force
Weight
Force
SI_unit
French_language
Second_language
Language_acquisition
Word
Linguistics
Science
Latin_language
Pontifical_Academy_for_Latin
Pope_Benedict_XVI
Pope_Benedict_(disambiguation)
Regnal_name#Catholic_Church
Monarch
State_(polity)
Community
Commutative_property
Mathematics
Quantity
Property_(philosophy)
Modern_philosophy
Philosophy
26
Javatarz
quelle
1
Scala benötigt kein Hauptobjekt oder eine Hauptmethode. Sie können es mit dem Interpreter als "scala <filename> [args ..]" ausführen. Verwenden Sie args(0), um das erste Argument zu erhalten, Ihre objectund mainDefinitionen zu entfernen, und ich denke, Sie können die auch entfernen :Int. pastebin.com/YqywKcG8
KChaloux
Es stellte sich heraus, dass Sie das nicht entfernen können : Int. Wusste nicht, dass Sie einen rekursiven Anruf tätigen. Mein Pastebin stammt ebenfalls aus Ihrer alten lesbaren Quelle, aber es gelten dieselben Konzepte.
KChaloux
Ich werde versuchen, die Hauptmethode loszuwerden. Und ja, rekursive Aufrufe haben mich dazu gebracht, die :Intdort hinzuzufügen . Später heute werde ich auch eine lesbare Form der 333-Zeichen-Lösung hinzufügen, die ich habe. Vielen Dank für die Vorschläge @KChaloux
Javatarz
1
Wie gesagt, der Verweis auf object Q extends App { ... }ist völlig unnötig, wenn Sie den Code mit dem Interpreter ausführen, anstatt ihn mit scalac zu kompilieren. Lauf einfach mitscala <filename> [args..]
KChaloux
4

R, 379 Zeichen; 1000-379 + 170 = 791 Punkte

Version, bei der Benutzer gefragt werden, wie sie beim Erkennen einer Schleife vorgehen sollen

library(XML);w="http://en.wikipedia.org";W="/wiki/";n=1;A=c(scan(,""));while(A[n]!="Philosophy"){a=paste0(w,W,A[n]);d=sapply(strsplit(grep(W,sapply(xpathApply(xmlParse(readLines(a)),"//p/a[@href]|//ul/li/a[@href]",xmlAttrs),`[`,'href'),v=T),"/"),`[`,3);B=d[-grep(":",d)];n=n+1;if(B[1]%in%A)if(readline("Loop!2nd link?")=="n")break;A[n]=head(B[!B%in%A],1);cat(A[n],"\n")};cat(n-1)

Mit Einrückungen und Kommentaren:

library(XML) #Uses package XML
w="http://en.wikipedia.org"
W="/wiki/"
n=1
A=c(scan(,"")) #Stdin + makes it a vector so we can store each iteration
while(A[n]!="Philosophy"){
    a=paste0(w,W,A[n])
    d=sapply(strsplit(grep(W,sapply( #The heart of the program
             xpathApply(xmlParse(readLines(a)),"//p/a[@href]|//ul/li/a[@href]",xmlAttrs),
             `[`,'href'),v=T),"/"),`[`,3)
    B=d[-grep(":",d)] #get rid of Templates, Files ,etc...
    n=n+1
    #Ask user if should proceed when loop encountered 
    #(any answer other than "n" is considered agreement):
    if(B[1]%in%A)if(readline("Loop!2nd link?")=="n")break
    A[n]=head(B[!B%in%A],1) #Take the first link that is not redundant
    cat(A[n],"\n")
    }
cat(n-1)

Beispiellauf:

> library(XML);w="http://en.wikipedia.org";W="/wiki/";n=1;A=c(scan(,""));while(A[n]!="Philosophy"){a=paste(w,W,A[n],sep="");d=sapply(strsplit(grep(W,sapply(xpathApply(xmlParse(readLines(a)),"//p/a[@href]|//ul/li/a[@href]",xmlAttrs),`[`,'href'),v=T),"/"),`[`,3);B=d[-grep(":",d)];n=n+1;if(B[1]%in%A)if(readline("Loop!2nd link?")=="n")break;A[n]=head(B[!B%in%A],1);cat(A[n],"\n")};cat(n-1)
1: Extended_ASCII
2: 
Read 1 item
Eight-bit 
Computer_architecture 
Computer_science 
Science 
Logic 
List_of_aestheticians 
Art 
Human_behavior 
Behavior 
Organism 
Biology 
Loop!2nd link?y
Mathematics 
Quantity 
Property_(philosophy) 
Modern_philosophy 
Philosophy 
16

R, 325 Zeichen; ??? Punkte

Version, die standardmäßig die erste nicht redundante Verbindung verwendet (dh keine Schleife).

library(XML);w="http://en.wikipedia.org";W="/wiki/";n=1;A=c(scan(,""));while(A[n]!="Philosophy"){a=paste0(w,W,A[n]);d=sapply(strsplit(grep(W,sapply(xpathApply(xmlParse(readLines(a)),"//p/a[@href]|//ul/li/a[@href]",xmlAttrs),`[`,'href'),v=T),"/"),`[`,3);B=d[-grep(":",d)];n=n+1;A[n]=head(B[!B%in%A],1);cat(A[n],"\n")};cat(n-1)
Plannapus
quelle