Wikipedia: ปรัชญา!


26

หลายคนอาจรู้จักหน้าเว็บส่วนใหญ่ (95% ฉันคิดว่า) ในที่สุดวิกิพีเดียนำไปสู่ปรัชญาเช่นนี้:

คลิกลิงก์แรกที่ไม่ใช่ตัวเอียงหรือในวงเล็บที่อยู่ในบทความปกติอื่น: (เช่นไม่ใช่ไฟล์: หรือพิเศษ: แต่สิ่งต่าง ๆ เช่นวิกิพีเดีย: ใช้ได้) และทำซ้ำจนกว่าคุณจะตีปรัชญา

สคริปต์จะต้อง:

  • ใช้หน้าแรกเป็นอินพุต
  • พิมพ์ชื่อของแต่ละบทความที่ได้รับ
  • และพิมพ์จำนวนบทความที่ต้องใช้เพื่อไปที่ปรัชญาและถ้ามันไม่ได้พูดเช่นนั้น

คุณเริ่มต้นด้วย 1,000 คะแนนและสูญเสียหนึ่งสำหรับตัวละครแต่ละตัวในรหัสคะแนนโบนัสสำหรับ:

ตรวจจับบทความวนรอบและหยุด: +50

ตรวจจับบทความวนรอบและขอว่าผู้ใช้ควรไปที่ลิงค์ถัดไปในบทความ: +170

อนุญาตให้มีการเริ่มต้นในอดีตตรวจสอบเป็น ARG บรรทัดคำสั่งหรือคล้ายกัน: +140

คะแนนสูงสุดชนะ


7
+1 ท้าทายมาก! การตรวจจับวงเล็บนี้ยาก: P
Doorknob

1
ฉันรู้สึกว่าสิ่งนี้สามารถใช้คำจำกัดความที่ดีขึ้นได้บ้าง แต่ฉันยังไม่แน่ใจอย่างแน่นอน
Iszi

3
ลดหนึ่งจุดสำหรับแต่ละอักขระที่พิมพ์ อืมมม เยี่ยมมากฉันเข้าใจแล้วฉันจะคัดลอกอักขระ! ไม่เสียคะแนน!
Justin

5
โปรดอย่าเปลี่ยนกฎหลังจากโพสต์คำตอบแล้ว มันค่อนข้างหยาบและขมวดคิ้วโดยทั่วไปในชุมชนที่นี่ ...
Doorknob

คำตอบ:


8

Ruby, 1,000 - 303 299 337 - 50 373 - 170 382 - 170 - 140 379 - 170 - 140 ตัวอักษร = 697 701 713 797 928 931

ฉันแน่ใจว่ามีการปรับปรุงมากมายที่ต้องทำ

(สิ่งนี้ต้องใช้ 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

ตัวอย่างการเรียกใช้:

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

ตัวอย่างหนึ่งที่ฉันต้องไปที่ลิงค์อื่น

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

เคล็ดลับที่ฉันใช้:

  • ฉันใช้ตัวเลือกp aเพื่อรับลิงก์ที่ไม่ใช่ตัวเอียงเท่านั้นเนื่องจากลิงก์ทั้งหมดในบทความจริงที่ไม่ใช่ตัวเอียงอยู่ในองค์ประกอบย่อหน้าใน Wikipedia เสมอ

hmmm ... บางทีฉันควรจะไม่อนุญาต แต่ห้องสมุดที่มาพร้อมกับภาษา ...
AlphaModder

@ user1825860 ไม่ใช่ไลบรารีที่มาพร้อมกับภาษา มันเป็นอัญมณี ฉันแก้ไขคำตอบของฉัน แต่จริงๆแล้วคุณต้องการท้าทายนี้อย่างหนักและบังคับให้เราไม่ต้องใช้ห้องสมุดการแยกวิเคราะห์ HTML ด้วยเหรอ? : P
Doorknob

ฉันไม่ได้ห้าม แต่คุณเสียคะแนน: P
AlphaModder

คุณควรอ่านโพสต์แรกและแก้ไขตามนั้น: P
AlphaModder

2
@ user1825860 โปรดอย่าเปลี่ยนกฎหลังจากคำตอบถูกโพสต์แล้ว มันค่อนข้างหยาบคาย ...
Doorknob

5

"BASH " - (หากไม่เข้าใจผิด: 1,000 - 397 + 170 + 140 = 913 คะแนน)
"BASH" - (หากไม่เข้าใจผิด: 1,000 - 386 + 170 + 140 = 924 คะแนน)

"BASH" - (หากไม่เข้าใจผิด: 1,000 - 381 + 170 + 140 = 929 คะแนน)

BASH อยู่ในเครื่องหมายคำพูดตามวัตถุประสงค์เนื่องจากเป็นการผสมผสานของเครื่องมือที่ใช้ในเชลล์ * nix แต่ถูกรวมอยู่ในสคริปต์ทุบตี

แก้ไข 1:

  • นำออกhttp://เป็นcurlค่าเริ่มต้นของสิ่งนี้
  • เปลี่ยนการhref=จับคู่ของแองเคอร์f=เป็น<a>ไม่มีฟีเจอร์ปกติอื่น ๆ ที่ลงท้ายfด้วย (เป็นไปได้ของแท็กที่กำหนดเองยังไม่เคยเห็นมาก่อน)
  • ตั้งค่าข้อความทางออกไม่พบการแทน!Phil NoPhilหนึ่งนี้เป็นโวหารบิตเป็นหนึ่งยังสามารถพูดเช่น!, 0, N, !Pหรือคล้ายกัน
  • วิธีที่สอง: -sเปิดcurlสามารถลบเพื่อลดได้อีกสามไบต์ แต่นั่นจะทำให้เกิดผลลัพธ์ที่ยุ่งเหยิง ไม่แน่ใจว่าเป็นปัญหาหรือไม่
  • อัปเดตความช่วยเหลือในหน้านี้

การใช้งาน quirks รหัสจะสิ้นสุดที่ 379 bytes, 931 คะแนน

ฉันยังสามารถใช้@plannapus ในการใช้งานกล่องนำทาง (หวังว่า) โดยการ(p|ul).*?<(\1)เพิ่มการเพิ่มหกไบต์ (การลบหกจุด)

แก้ไข 2:

ใช้${#c[@]}เพื่อพิมพ์องศาการแยกแทนตัว$iนับ

การใช้งาน quirks รหัสจะสิ้นสุดที่ 374 ไบต์ 936 คะแนน


ฉันเรียกคธูลูและไปหาทางออก regexp + bash / shell / * ระวัง

ขโมย:

  • ใช้<p>เคล็ดลับจาก@Doorknob ของหิมะ

การดำเนินการ:

  • ตรวจสอบลูปและถามว่าควรใช้ลิงค์ถัดไปหรือไม่
  • เลือกที่ลิงค์ถัดไปสำหรับทำซ้ำเป็นตัวเลือก

ที่ต้องการ:

  • bash v.?
  • grepด้วย-Pการสนับสนุน (PCRE)
  • sed
  • curl
  • cut

การใช้งาน:

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.

รหัสแบบอินไลน์ คัดลอกไปยังไฟล์ chmod +x filename. ดำเนินการโดย./script /wiki/…จาก 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[@]};

รหัสขยายและอธิบาย:

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[@]}

คุณชนะฉันหนึ่งครั้ง! : P ฉันจะต้องตีกอล์ฟวิธีแก้ปัญหาของฉันให้มากขึ้น
Doorknob

ใช่;) แต่ไม่แน่ใจว่านี่เป็นรหัสที่ถูกต้อง การใช้เครื่องมือด้วยวิธีนี้
Runium

5

JavaScript 726 (444 ตัวอักษร [556] + 170)

ตอนนี้ฉันขอขอบคุณที่นี่อาจไม่ถูกต้องเป็น bookmarklet แต่ฉันสนุกกับมันอยู่แล้ว

การใช้งาน: ไปที่หน้าที่คุณต้องการเริ่มต้นและเรียกใช้สิ่งต่อไปนี้ในคอนโซล:

(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)

สำหรับ JavaScript เอาต์พุตจะเป็นดังนี้:

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

วิธีแก้ปัญหานี้จะถือว่าคุณต้องการข้ามไปยังลิงค์ถัดไปของลูปที่ตรวจพบ แต่ถ้าคุณเปลี่ยนtrueในตอนท้ายfalseมันจะปรากฏกล่องยืนยันแทน (ค่อนข้างน่ารำคาญ ... ) ไม่แน่ใจว่ามีคุณสมบัติสำหรับ โบนัสรองหรือไม่ ฉันจะไม่คิด

เยื้อง:

(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

ตอนแรกฉันก็เลยพลาดส่วนที่เกี่ยวกับการละเว้นสิ่งของใน parens และเพิ่มมันทำให้มันคร่ำครวญมากขึ้นดังนั้นฉันจึงหวังที่จะเล่นกอล์ฟตัวกรองที่ฟังก์ชั่นลง (หรือหวังว่าจะแทนที่มันทั้งหมด)

ทำงานได้ทั้ง Chrome และ Firefox (ทดสอบใน Firefox 26)


2
ดูดี แต่ล้มเหลวใน Firefox 20
บูธโดย

Argghh! ฉันทดสอบ Chrome เท่านั้น ฉันจะดูมัน!
Dom Hastings

@boothby น่าจะทำงานใน Firefox ได้แล้ว ... ยังคงต้องการลิงก์ที่ฉันเลือก!
Dom Hastings

5

C # - 813 ตัวอักษร

คะแนน: 1,000-813 + 50 + 170 + 140 = 547 :(

ไม่มีห้องสมุดภายนอก การตรวจสอบห่วง

อาร์กิวเมนต์แรกคือบทความต้นฉบับที่สองคือบทความเป้าหมาย

รุ่น Golfed:

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);
    }
}

รุ่นที่เข้าใจได้:

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);
    }
}

ตัวอย่างการวิ่งจาก "Sky" ถึง "Philosophy":

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:\>

5

Scala (294 chars => 1,000-294 + 140 = 846 คะแนน)

โซลูชันที่อัปเดตซึ่งใช้ลิงก์ถัดไปโดยอัตโนมัติหากมีการใช้ไปแล้ว ขอบคุณสำหรับคะแนนโบนัส 140 คะแนน

ลอจิก: เลือกลิงก์ "/ wiki" แรกที่ไม่มีลิงก์ ":" อยู่ (ดังนั้นจะละเว้นลิงก์ "ไฟล์:") ล้างและทำซ้ำด้วยการเรียกซ้ำส่งกลับการนับ + 1 ทุกครั้ง ฉันเก็บรายการเอาท์พุทก่อนหน้าทั้งหมดที่มีประโยชน์เพื่อให้โปรแกรมไม่เข้าสู่วงวนไม่สิ้นสุด

นิพจน์ทั่วไป:ฉันมีนิพจน์ทั่วไป 2 รูปแบบ

  • "<p>.*?\"/wiki/([^:]*?)\".*?/p>"ซึ่งค้นหาลิงก์ภายใน<p>แท็ก
  • "p>.*?/wiki/([^:]*?)\""ซึ่งเป็นแท็กทดลองอีกเล็กน้อยที่พิสูจน์แล้วว่าใช้งานได้ แต่ให้ผลลัพธ์ที่แตกต่างเพราะบางครั้งจะรับลิงก์จากแถบข้อมูลด้านขวา บทความเหล่านี้เป็นบทความปกติดังนั้นฉันเชื่อว่ามันยังใช้ได้ ถ้ามันถูกตัดสินว่าไม่ใช่ OP (หรือคนอื่น) สามารถแสดงความคิดเห็นให้ฉันได้และฉันสามารถอัปเดตโซลูชันของฉันให้ดีขึ้นกว่าเดิม

ฉันจะใช้นิพจน์ทั่วไปที่สองจนกว่าฉันจะพบกรณีทดสอบที่มันใช้งานไม่ได้หรือ OP กล่าวถึงการรับลิงก์จากแถบด้านข้างไม่ได้รับอนุญาต (ในความคิดของฉันแถบข้อมูลยังคงเป็นส่วนหนึ่งของ บทความจริงของตัวเองสรุปมากขึ้น)


ลดขนาดแหล่งที่มา:

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}}}

อ่านแหล่งที่มา:

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
    }
  }
}

ตัวอย่างผลลัพธ์:

อินพุต

Space_toilet

เอาท์พุต

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

1
สกาล่าไม่จำเป็นต้องมีวัตถุหลักหรือวิธีการ คุณสามารถเรียกใช้โดยใช้ล่ามเป็น "scala <filename> [args .. ]" ใช้args(0)เพื่อรับอาร์กิวเมนต์แรกกำจัดของคุณobjectและmainคำจำกัดความและฉันคิดว่าคุณสามารถลบได้:Intเช่นกัน pastebin.com/YqywKcG8
KChaloux

: Intเปิดออกคุณไม่สามารถลบ ไม่ทราบว่าคุณกำลังโทรซ้ำ นอกจากนี้ Pastebin ของฉันยังนำมาจากแหล่งที่อ่านได้เก่าของคุณด้วย แต่มีการนำแนวคิดเดียวกันมาใช้
KChaloux

ฉันจะลองกำจัดวิธีหลัก และใช่การโทรซ้ำทำให้ฉันเพิ่มที่:Intนั่น ต่อมาวันนี้ฉันจะเพิ่มรูปแบบการอ่านของ 333 char solution ที่ฉันมี ขอบคุณสำหรับคำแนะนำ @KChaloux
javatarz

1
อย่างที่ฉันพูดการอ้างอิงถึงobject Q extends App { ... }ไม่จำเป็นเลยหากคุณเรียกใช้โค้ดด้วยล่ามแทนที่จะรวบรวมด้วย scalac เพิ่งทำงานกับscala <filename> [args..]
KChaloux

4

R, 379 ตัวอักษร; 1,000-379 + 170 = 791 คะแนน

รุ่นที่ถามผู้ใช้ถึงวิธีการดำเนินการเมื่อตรวจพบการวนซ้ำ

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)

ด้วยการเยื้องและความคิดเห็น:

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)

ตัวอย่างการเรียกใช้:

> 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 ตัวอักษร; ??? จุด

รุ่นที่โดยค่าเริ่มต้นจะใช้ลิงก์ที่ไม่ซ้ำซ้อนก่อน (เช่นการไม่วนซ้ำ)

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.