위키 백과 : 철학!


26

많은 괴짜들이 위키피디아에있는 대부분의 페이지 (95 %라고 생각)를 알고있을 때 결국 다음과 같은 철학으로 이어집니다.

다른 일반 기사 (예 : File : 또는 Special :는 아니지만 Wikipedia :와 같은 것)에 대한 첫 번째 비 이탈리아어 또는 괄호 링크를 클릭하고 철학에 도달 할 때까지 해당 기사를 반복하십시오.

스크립트는 다음과 같아야합니다.

  • 첫 페이지를 입력으로 사용
  • 받는 각 기사의 이름을 인쇄하십시오
  • 그리고 철학에 도달하는 데 필요한 기사 수와 그렇지 않은 기사를 인쇄하십시오.

1000 포인트로 시작하여 코드의 각 캐릭터마다 하나씩, 보너스 포인트는 다음과 같습니다.

루핑 아티클 감지 및 중지 : +50

루핑 아티클 감지 및 사용자가 아티클의 다음 링크로 이동해야하는지 요청 : +170

이전 검사에서 기본값을 명령 줄 인수 또는 이와 유사한 형식으로 허용 : +140

최고 점수가 이깁니다.


7
+1, 큰 도전! 이 괄호 감지는 어렵다 : P
Doorknob

1
나는 이것이 더 나은 정의를 사용할 수 있다는 느낌을 얻지 만 정확히 어떻게 아직 그렇게 잘 모르겠습니다.
Iszi

3
입력 한 각 문자에 대해 1 점을 잃습니다. 흠. 좋아, 난 그냥 문자를 복사하여 붙여 넣을 것입니다! 포인트를 잃지 않았습니다!
Justin

5
답변이 이미 게시 된 후에는 규칙을 변경하지 마십시오. 그것은 꽤 무례하고 일반적으로 여기의 지역 사회에서 눈살을 찌푸리게합니다 ...
손잡이

답변:


8

루비 1000 - 303 299 337-50 373-170 382 - 170-140 379-170 - 문자 = 140 697 701 713 797 928 931

많은 개선이 이루어질 것으로 확신 합니다.

(노코 기리 필요)

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의 단락 요소에 있기 때문에 선택기 를 사용하여 비 이탈리아 링크 만 가져 왔습니다.

흠 ... 어쩌면 나는 언어와 함께 제공되는
라이브러리 외에는

@ user1825860 실제로 언어와 함께 제공되는 라이브러리는 아닙니다. 보석입니다. 내 답변을 편집했습니다. 그러나 실제로, 당신은 이미 어려운 도전을하고 HTML 파싱 라이브러리를 사용하지 말아야합니까? : P
Doorknob

나는 그것을 거부하지 않지만 당신은 포인트를 잃는다 : P
AlphaModder

첫 번째 게시물을 다시 읽고 그에 따라 편집해야합니다. P
AlphaModder

2
@ user1825860 답변을 게시 한 후에는 규칙을 변경하지 마십시오. 그건 꽤 무례합니다 ...
손잡이

5

"BASH "– (실수하지 않은 경우 : 1000-397 + 170 + 140 = 913 포인트)
"BASH" – (실수하지 않은 경우 : 1000-386 + 170 + 140 = 924 포인트)

"BASH" – (실수하지 않은 경우 : 1000-381 + 170 + 140 = 929 점)

Bash는 * nix 쉘에서 사용되지만 bash 스크립트로 래핑 된 도구의 조합이므로 의도적으로 인용됩니다.

편집 1 :

  • 기본적으로 제거 http://되었습니다 curl.
  • href=앵커에서 일치하는 항목이 f=로 끝나는 <a>다른 일반 속성 이없는 것으로 변경 되었습니다 f. (맞춤 태그 일 가능성이 있습니다. 지금까지 본 적이 없습니다.)
  • !Phil대신 종료 메시지를 찾을 수 없음으로 설정하십시오 NoPhil. 이것은 하나 하나는 예를 들어 말할 수로 비트 황당 !, 0, N, !P또는 유사한.
  • Quirk 2 : -son curl을 제거하여 3 바이트를 더 줄일 수 있지만 지저분한 출력이 발생합니다. 그것이 문제인지 확실하지 않습니다.
  • 이 페이지에서 업데이트 된 도움말 입니다.

쿼크를 사용하면 코드는 379 바이트, 931 포인트로 끝납니다.

6 바이트 를 추가 하여 (6 포인트 빼기 ) 일치하는 탐색 상자@plannapus 사용법을 구현할 수도 있습니다 .(p|ul).*?<(\1)

편집 2 :

카운터 ${#c[@]}대신 분리 각도를 인쇄하는 데 사용 합니다 $i.

쿼크를 사용하면 코드는 374 바이트, 936 포인트로 끝납니다.


나는 Cthulhu를 소환하고 정규 표현식 + bash / shell / * nix 솔루션을 찾습니다.

훔친:

구현 :

  • 루프를 감지하고 다음 링크가 필요한지 묻습니다.
  • 선택적으로 중복 옵션에서 다음 링크를 선택하십시오.

요구 사항 :

  • 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 쉘에서 실행하십시오 .

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

Ye;), 그러나 이것이 올바른 코드인지 확실하지 않습니다. 이런 식으로 도구를 사용합니다.
Runium

5

자바 스크립트 726 (444 자 [556] + 170)

이제는 이것이 북마크릿으로 유효하지 않을 수도 있지만 고맙지 만 어쨌든 그것을 좋아했습니다.

사용법 : 시작하려는 페이지로 이동하여 콘솔에서 다음을 실행하십시오.

(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에서는 실패합니다.
boothby

아가! Chrome 만 테스트했습니다. 내가 볼게요!
Dom Hastings

@boothby Firefox에서 지금 작업 중이어야합니다 ... 그래도 내가 선택한 링크에서 작업하고 싶습니다!
Dom Hastings

5

C #-813 자

점수 : 1000-813 + 50 + 170 + 140 = 547 :(

외부 라이브러리가 없습니다. 루프 감지 .

첫 번째 주장은 소스 기사이고 두 번째 주장은 대상 기사입니다.

골프 버전 :

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

"하늘"에서 "철학"에 이르는 예제 실행 :

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

스칼라 (294 자 => 1000-294 + 140 = 846 점)

다음 링크가 이미 소비 된 경우 자동으로 다음 링크를 가져 오는 업데이트 된 솔루션입니다. 140 보너스 포인트에 감사드립니다.

논리 : ":"가없는 첫 번째 "/ wiki"링크를 선택하십시오 (따라서 "File :"링크는 무시 함). 매번 카운트 + 1을 반환하는 재귀로 헹구고 반복하십시오. 프로그램이 무한 루프로 들어 가지 않도록 이전의 모든 출력 목록을 편리하게 유지합니다.

정규식 : 정규식 에는 두 가지 형식이 있습니다.

  • "<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)첫 번째 인수를 얻을, 당신의 제거 objectmain정의, 그리고 난 당신이를 제거 할 수 있습니다 생각 :Int도. pastebin.com/YqywKcG8
KChaloux

를 제거 할 수 없습니다 : Int. 당신이 재귀 호출을하고 있다는 것을 몰랐습니다. 또한 내 pastebin은 이전 읽기 가능한 소스에서 가져 왔지만 동일한 개념이 적용됩니다.
KChaloux

나는 주요 방법을 제거하려고 노력할 것입니다. 그리고 재귀 호출로 :Int거기에 추가 했습니다. 나중에 오늘, 나는 가지고있는 333 문자 솔루션의 읽을 수있는 형태를 추가 할 것입니다. @KChaloux의 제안에 감사드립니다
javatarz

1
내가 말했듯 object Q extends App { ... }이 스칼라로 컴파일하는 대신 인터프리터로 코드를 실행하면 참조 가 필요하지 않습니다. 다음으로 실행scala <filename> [args..]
KChaloux

4

R, 379 자; 1000-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.