Twitterパーサーを作成する


14

前書き

Twitterを使用します(そうでない場合は仮装します)。ここでは、世界と共有したい個々のツイートごとに140文字に制限されています。フォロワーAbraham LincolnのGettysburg Addressにツイートしたい場合は、メッセージ全体を取り出すためにテキストを複数の140文字のチャンクに分割する必要があります。ただし、これらのチャンクの長さは常に140文字である必要はありません。たとえば、スピーチを17文字のチャンクに分割すると、これらのツイートになります。

  • 4つのスコアとSE
  • VEN YEARS AGO OUR
  • フェザーズブラウト
  • この詐欺について
  • 新たなナチ
  • Lで考えられる
  • (等々)

それはまずいです!個々の単語が分割されると、あなたが言おうとしていることを理解することが難しくなる可能性があります。また、twitterverseでは、フォロワーの1人が特定のツイートに出くわし、メッセージにそれ以上のものがあることに気付かない場合があるため、ツイートに番号を付けて作業するコンテキストを持たせます(17文字のチャンクを使用します) ):

  • (1/7)4つのスコアと
  • (2/7)7年前
  • (3/7)私たちの父
  • (4/7)BROUGHT FORTH ON
  • (5/7)この大陸A
  • (6/7)新国家
  • (7/7)に着想...

手動でツイートの最適な構成を手動で把握することもできますが、それが私たちのコンピューターの目的です!

チャレンジ

可能な限り短いコードで、ゲティスバーグアドレス(または任意のテキスト、ただしこれは例としてこれに固執します)を140文字以下で構成されるツイートのセットに解析します(この例のテキストはその中の珍しい/異常なビット)。

詳細

  • 関数/プログラム/などは、単一の文字列引数を取り、ツイートごとに1行のテキストを出力する必要があります。
    • 解析の選択方法に関係なく、この入力が解析時に合計99を超えるツイートになることはありません(その選択が課題の他のポイントに適合する限り)。
  • ツイートには、ツイートの本文の前に「」の形式tweet numbertotal tweetsインジケーターを含める必要があります(x/y)
    • このカウントは、140文字のスペースの一部を占有します!
  • ツイートのチャンクは、改行またはスペースでのみ分割できます。
    • ハイフン、ピリオド、コンマ、またはその他の句読点は、スペースまたは改行が直前または直後にない限り許可されません。
  • ツイートは、できるだけ多くの完全な単語で構成する必要があります。
    • この制約はやや柔軟性があります。たとえば、最終ツイートの単語が1つだけの場合
  • これはコードゴルフなので、最短のコードが勝ちます。

ゲティスバーグの住所の全文

(コードはまだ渡されたASCII文字列を処理できるはずです。)

4スコアと7年前私たちの父親は、この大陸で自由に考えられ、すべての人が平等に創造されるという提案に専念した新しい国を始めました。今、私たちは、そのような国や国がそのように考えられており、ひたむきに耐えることができるかどうかにかかわらず、大規模な市民戦争テストに従事しています。私たちはその戦争の素晴らしい戦いに出会っています。私たちは、その分野の一部を、その国が生計を立てた生計を立てた人たちのための最終的な休憩場所として捧げるようになりました。それはやはり適切であり、これを行うべきです。しかし、より大きな感覚では、私たちはこの地を捧げることはできません、私たちは黙認することも、放すこともできません。勇敢な男が生きて死んでしまった人は、私たちの貧弱な力を加えたり引いたりすることをはるかに凌ぐことを企てました。世界は、私たちがここで言うことを少しでも覚えていないが、彼らがここで何をしたかを決して忘れることはできないだろう。私たちにとって、生きているラザーは未完成の作品に専念し、ここで誰がここまで進んだのかを知ることができます。これらの名誉ある死から、私たちが最後の完全な献身をもたらすために、これらの名誉ある死からの献身を得るということは、私たちが偉大な仕事に専念することです。死んでしまい、神の下にあるこの国は新たな自由の誕生を持ち、人々のための人々の政府は地球から消滅することはありません。


ツイートの例では、単語を壊していますが、ルールではそうしないと言っています。これを一貫させてください-ルールまたは例を変更してください。
ブースビー

@boothbyさて、この例は、許可されていないものを明示的に示すことです。
ガフィ

質問を明確にして、回答が単語を再計算しなければならない可能性に対処する必要があるかどうかを明確にしてください->(X / Y)部分によるパッキングのつぶやき。これにより、問題が大幅に難しくなり、(X / Y)部分のデータをエンコードせずに通信できる最大のメッセージに上限が設定されます。
-arrdem

@rmckenzie申し訳ありませんが、あなたを得るかどうかわかりませんか?あなたはセットで100以上のツイートを持つことができるという事実を説明するつもりですか?
ガフィ

@Gaffi-はい、メッセージを分割する部分の最大数はありますか(その場合は仮定が行われ、grcのsolが有効です)、または数千語のシリアル化などの一般的なケースをサポートする必要がありますかあなたの問題の声明が示唆しているツイートに。
-arrdem

回答:


12

Perl、51文字

s#\G(.{1,132})(\s+|$)#(${\++$a}/~) $1\n#g;s#~#$a#g

-pコマンドラインプロンプトが必要です。1文字が含まれています。

説明:最大132文字の単語グループの前にカウント部分を挿入し、単語グループの後に改行を挿入します。~合計のプレースホルダー()を挿入し、2番目の置換で置き換えられます。メッセージにが含まれている場合、これは壊れますが~、代わりに印刷できない文字を簡単に使用できます。

わずかにごまかします:カウント部分には常に7文字を使用できます(nn/nn)。本当にそうなら、それは(n/n)2つの余分な文字を許可するべきです。ただし、これに対するarbitrary意的な解決策は、問題の複雑さを大幅に増加させます。


\Gここでは役に立たないですね。
user2846289 14

26

Python、140

^ 140文字は実際には偶然でした。

def f(s):
 s=s.split();i=0;l=[]
 while s:
  i+=1;t='(%d/%%d)'%i
  while s and len(t+s[0])<140:t+=' '+s.pop(0)
  l+=[t]
 for t in l:print t%i

単語が残っている間、ソリューションは単語の供給から新しいツイートを作成し、それらをリストに追加します。ツイートごとに、ツイートの長さが140文字を超えるまで単語を追加しようとし続けます。2つの文字はのために予約されてtotal tweetsおり、リスト内の各ツイートが印刷されると後で埋められます。

出力例:

(1/11) FOUR SCORE AND SEVEN YEARS AGO OUR FATHERS BROUGHT FORTH ON THIS CONTINENT A NEW NATION CONCEIVED IN LIBERTY AND DEDICATED TO THE
(2/11) PROPOSITION THAT ALL MEN ARE CREATED EQUAL. NOW WE ARE ENGAGED IN A GREAT CIVIL WAR TESTING WHETHER THAT NATION OR ANY NATION SO
(3/11) CONCEIVED AND SO DEDICATED CAN LONG ENDURE. WE ARE MET ON A GREAT BATTLEFIELD OF THAT WAR. WE HAVE COME TO DEDICATE A PORTION OF THAT
(4/11) FIELD AS A FINAL RESTING PLACE FOR THOSE WHO HERE GAVE THEIR LIVES THAT THAT NATION MIGHT LIVE. IT IS ALTOGETHER FITTING AND PROPER
(5/11) THAT WE SHOULD DO THIS. BUT IN A LARGER SENSE WE CAN NOT DEDICATE, WE CAN NOT CONSECRATE, WE CAN NOT HALLOW, THIS GROUND. THE BRAVE
(6/11) MEN LIVING AND DEAD WHO STRUGGLED HERE HAVE CONSECRATED IT FAR ABOVE OUR POOR POWER TO ADD OR DETRACT. THE WORLD WILL LITTLE NOTE NOR
(7/11) LONG REMEMBER WHAT WE SAY HERE BUT IT CAN NEVER FORGET WHAT THEY DID HERE. IT IS FOR US THE LIVING RATHER TO BE DEDICATED HERE TO THE
(8/11) UNFINISHED WORK WHICH THEY WHO FOUGHT HERE HAVE THUS FAR SO NOBLY ADVANCED. IT IS RATHER FOR US TO BE HERE DEDICATED TO THE GREAT
(9/11) TASK REMAINING BEFORE US, THAT FROM THESE HONORED DEAD WE TAKE INCREASED DEVOTION TO THAT CAUSE FOR WHICH THEY GAVE THE LAST FULL
(10/11) MEASURE OF DEVOTION, THAT WE HERE HIGHLY RESOLVE THAT THESE DEAD SHALL NOT HAVE DIED IN VAIN, THAT THIS NATION UNDER GOD SHALL HAVE
(11/11) A NEW BIRTH OF FREEDOM, AND THAT GOVERNMENT OF THE PEOPLE BY THE PEOPLE FOR THE PEOPLE SHALL NOT PERISH FROM THE EARTH.

それはまさに私が必要としていたものでした。このソリューションはクールです。ありがとう@grc
iChux

7

ルビー、77文字

f=->t{i=0;$><<t.gsub(/(.{1,132})([ \n]|$)/m){"(#{i+=1}/%{i}) #{$1}\n"}%{i:i}}

ロジックを単一の正規表現にパックしました。の出力f[text]

(1/11) FOUR SCORE AND SEVEN YEARS AGO OUR FATHERS BROUGHT FORTH ON THIS CONTINENT A NEW NATION CONCEIVED IN LIBERTY AND DEDICATED TO THE
(2/11) PROPOSITION THAT ALL MEN ARE CREATED EQUAL. NOW WE ARE ENGAGED IN A GREAT CIVIL WAR TESTING WHETHER THAT NATION OR ANY NATION SO
(3/11) CONCEIVED AND SO DEDICATED CAN LONG ENDURE. WE ARE MET ON A GREAT BATTLEFIELD OF THAT WAR. WE HAVE COME TO DEDICATE A PORTION OF
(4/11) THAT FIELD AS A FINAL RESTING PLACE FOR THOSE WHO HERE GAVE THEIR LIVES THAT THAT NATION MIGHT LIVE. IT IS ALTOGETHER FITTING AND
(5/11) PROPER THAT WE SHOULD DO THIS. BUT IN A LARGER SENSE WE CAN NOT DEDICATE, WE CAN NOT CONSECRATE, WE CAN NOT HALLOW, THIS GROUND. THE
(6/11) BRAVE MEN LIVING AND DEAD WHO STRUGGLED HERE HAVE CONSECRATED IT FAR ABOVE OUR POOR POWER TO ADD OR DETRACT. THE WORLD WILL LITTLE
(7/11) NOTE NOR LONG REMEMBER WHAT WE SAY HERE BUT IT CAN NEVER FORGET WHAT THEY DID HERE. IT IS FOR US THE LIVING RATHER TO BE DEDICATED
(8/11) HERE TO THE UNFINISHED WORK WHICH THEY WHO FOUGHT HERE HAVE THUS FAR SO NOBLY ADVANCED. IT IS RATHER FOR US TO BE HERE DEDICATED TO
(9/11) THE GREAT TASK REMAINING BEFORE US, THAT FROM THESE HONORED DEAD WE TAKE INCREASED DEVOTION TO THAT CAUSE FOR WHICH THEY GAVE THE
(10/11) LAST FULL MEASURE OF DEVOTION, THAT WE HERE HIGHLY RESOLVE THAT THESE DEAD SHALL NOT HAVE DIED IN VAIN, THAT THIS NATION UNDER GOD
(11/11) SHALL HAVE A NEW BIRTH OF FREEDOM, AND THAT GOVERNMENT OF THE PEOPLE BY THE PEOPLE FOR THE PEOPLE SHALL NOT PERISH FROM THE EARTH.

3

ルビー、75

Perlに勝るものはありませんが、少なくとも他のRubyソリューションにはわずかに勝っています。ツイートを逆の順序で出力することに注意してください(問題では特定されていません)。

f=->t,i=1{t=~/\S.{,130}\S(?!\S)/?puts("(#{i}/%d) #$&"%n=f[$',i+1])||n :i-1}

1
うーん...私は順序を指定しなかったと思います。ルールをハイジャックするのは良い仕事です。;-)
ガフィ

1

VBA、251

別の方法を試してみました...私のオリジナルほど良くはありませんが、まだ作業中です

Sub a(s)
Dim n(99)
m=1
r=Split(StrConv(s,64),Chr(0))
For i=0 To Len(s)
If i-g>132 Then n(m)=Mid(s,g+1,u-g):i=u:g=i:m=m+1
If r(i)=" " Or r(i)=vbCr Then i=i+1:u=i
Next
n(m)=Mid(s,g+1)
For o=1 To m
Debug.Print "(" & o & "/" & m & ") " & n(o)
Next
End Sub

出力:

(1/11) FOUR SCORE AND SEVEN YEARS AGO OUR FATHERS BROUGHT FORTH ON THIS CONTINENT A NEW NATION CONCEIVED IN LIBERTY AND DEDICATED TO THE 
(2/11) PROPOSITION THAT ALL MEN ARE CREATED EQUAL. NOW WE ARE ENGAGED IN A GREAT CIVIL WAR TESTING WHETHER THAT NATION OR ANY NATION SO 
(3/11) CONCEIVED AND SO DEDICATED CAN LONG ENDURE. WE ARE MET ON A GREAT BATTLEFIELD OF THAT WAR. WE HAVE COME TO DEDICATE A PORTION OF 
(4/11) THAT FIELD AS A FINAL RESTING PLACE FOR THOSE WHO HERE GAVE THEIR LIVES THAT THAT NATION MIGHT LIVE. IT IS ALTOGETHER FITTING AND 
(5/11) PROPER THAT WE SHOULD DO THIS. BUT IN A LARGER SENSE WE CAN NOT DEDICATE, WE CAN NOT CONSECRATE, WE CAN NOT HALLOW, THIS GROUND. THE 
(6/11) BRAVE MEN LIVING AND DEAD WHO STRUGGLED HERE HAVE CONSECRATED IT FAR ABOVE OUR POOR POWER TO ADD OR DETRACT. THE WORLD WILL LITTLE 
(7/11) NOTE NOR LONG REMEMBER WHAT WE SAY HERE BUT IT CAN NEVER FORGET WHAT THEY DID HERE. IT IS FOR US THE LIVING RATHER TO BE DEDICATED 
(8/11) HERE TO THE UNFINISHED WORK WHICH THEY WHO FOUGHT HERE HAVE THUS FAR SO NOBLY ADVANCED. IT IS RATHER FOR US TO BE HERE DEDICATED TO 
(9/11) THE GREAT TASK REMAINING BEFORE US, THAT FROM THESE HONORED DEAD WE TAKE INCREASED DEVOTION TO THAT CAUSE FOR WHICH THEY GAVE THE 
(10/11) LAST FULL MEASURE OF DEVOTION, THAT WE HERE HIGHLY RESOLVE THAT THESE DEAD SHALL NOT HAVE DIED IN VAIN, THAT THIS NATION UNDER GOD 
(11/11) SHALL HAVE A NEW BIRTH OF FREEDOM, AND THAT GOVERNMENT OF THE PEOPLE BY THE PEOPLE FOR THE PEOPLE SHALL NOT PERISH FROM THE EARTH.

1

BASH(88文字)

fold -132 -s |tac|cat -n |tac|awk '{if(NR==1)a=$1;$1="";printf "(%d/%d) %s\n",NR,a,$0 }'

ツイートのカウントを考慮して、132文字で行を折り、スペース(-s)、テキストを逆方向に読む(tac)、テキストに番号を付ける(cat -n)、逆順にする(tac)。Awkの内部:最初の行(NR == 1)、文字 'a'に最初の行の値を割り当てます。数値列を空白にします。次に(NR / 'a')行を印刷します。

出力:

(1/12)  FOUR SCORE AND SEVEN YEARS AGO OUR FATHERS BROUGHT FORTH ON THIS CONTINENT A NEW NATION CONCEIVED IN LIBERTY AND DEDICATED TO THE
(2/12)  PROPOSITION THAT ALL MEN ARE CREATED EQUAL. NOW WE ARE ENGAGED IN A GREAT CIVIL WAR TESTING WHETHER THAT NATION OR ANY NATION SO
(3/12)  CONCEIVED AND SO DEDICATED CAN LONG ENDURE. WE ARE MET ON A GREAT BATTLEFIELD OF THAT WAR. WE HAVE COME TO DEDICATE A PORTION OF
(4/12)  THAT FIELD AS A FINAL RESTING PLACE FOR THOSE WHO HERE GAVE THEIR LIVES THAT THAT NATION MIGHT LIVE. IT IS ALTOGETHER FITTING AND
(5/12)  PROPER THAT WE SHOULD DO THIS. BUT IN A LARGER SENSE WE CAN NOT DEDICATE, WE CAN NOT CONSECRATE, WE CAN NOT HALLOW, THIS GROUND.
(6/12)  THE BRAVE MEN LIVING AND DEAD WHO STRUGGLED HERE HAVE CONSECRATED IT FAR ABOVE OUR POOR POWER TO ADD OR DETRACT. THE WORLD WILL
(7/12)  LITTLE NOTE NOR LONG REMEMBER WHAT WE SAY HERE BUT IT CAN NEVER FORGET WHAT THEY DID HERE. IT IS FOR US THE LIVING RATHER TO BE
(8/12)  DEDICATED HERE TO THE UNFINISHED WORK WHICH THEY WHO FOUGHT HERE HAVE THUS FAR SO NOBLY ADVANCED. IT IS RATHER FOR US TO BE HERE
(9/12)  DEDICATED TO THE GREAT TASK REMAINING BEFORE US, THAT FROM THESE HONORED DEAD WE TAKE INCREASED DEVOTION TO THAT CAUSE FOR WHICH
(10/12)  THEY GAVE THE LAST FULL MEASURE OF DEVOTION, THAT WE HERE HIGHLY RESOLVE THAT THESE DEAD SHALL NOT HAVE DIED IN VAIN, THAT THIS
(11/12)  NATION UNDER GOD SHALL HAVE A NEW BIRTH OF FREEDOM, AND THAT GOVERNMENT OF THE PEOPLE BY THE PEOPLE FOR THE PEOPLE SHALL NOT PERISH
(12/12)  FROM THE EARTH.

私は短いbashコマンド、トイレ-l虐待されたものがある確信しています
Pureferretを

1

Javascript(FFのみ)、92文字

r=(s)=>{s.match(/.{1,132}(\s|$)/gm).map((v,i,a)=>console.log(v,'('+(i+1)+'/'+a.length+')'))}

フォーマットされた、それはPerlスクリプトのぼったくりです:

r=(s)=>{
    s.match(/.{1,132}(\s|$)/gm).map((v,i,a) => console.log(v,'('+(i+1)+'/'+a.length+')'))
}

0

VBA、227

Sub a(s)
Dim n(99)
m=1
x=133
While Len(s)>x
t=Left(s,x):p=InStrRev(t," "):q=InStrRev(t,vbCr):i=IIf(p>q,p,q):t=Left(s,i):s=Mid(s,i+1):n(m)=t:m=m+1
Wend
n(m)=s
For o=1 To m
Debug.Print "(" & o & "/" & m & ") " & n(o)
Next
End Sub

出力:

(1/11) FOUR SCORE AND SEVEN YEARS AGO OUR FATHERS BROUGHT FORTH ON THIS CONTINENT A NEW NATION CONCEIVED IN LIBERTY AND DEDICATED TO THE 
(2/11) PROPOSITION THAT ALL MEN ARE CREATED EQUAL. NOW WE ARE ENGAGED IN A GREAT CIVIL WAR TESTING WHETHER THAT NATION OR ANY NATION SO 
(3/11) CONCEIVED AND SO DEDICATED CAN LONG ENDURE. WE ARE MET ON A GREAT BATTLEFIELD OF THAT WAR. WE HAVE COME TO DEDICATE A PORTION OF 
(4/11) THAT FIELD AS A FINAL RESTING PLACE FOR THOSE WHO HERE GAVE THEIR LIVES THAT THAT NATION MIGHT LIVE. IT IS ALTOGETHER FITTING AND 
(5/11) PROPER THAT WE SHOULD DO THIS. BUT IN A LARGER SENSE WE CAN NOT DEDICATE, WE CAN NOT CONSECRATE, WE CAN NOT HALLOW, THIS GROUND. THE 
(6/11) BRAVE MEN LIVING AND DEAD WHO STRUGGLED HERE HAVE CONSECRATED IT FAR ABOVE OUR POOR POWER TO ADD OR DETRACT. THE WORLD WILL LITTLE 
(7/11) NOTE NOR LONG REMEMBER WHAT WE SAY HERE BUT IT CAN NEVER FORGET WHAT THEY DID HERE. IT IS FOR US THE LIVING RATHER TO BE DEDICATED 
(8/11) HERE TO THE UNFINISHED WORK WHICH THEY WHO FOUGHT HERE HAVE THUS FAR SO NOBLY ADVANCED. IT IS RATHER FOR US TO BE HERE DEDICATED TO 
(9/11) THE GREAT TASK REMAINING BEFORE US, THAT FROM THESE HONORED DEAD WE TAKE INCREASED DEVOTION TO THAT CAUSE FOR WHICH THEY GAVE THE 
(10/11) LAST FULL MEASURE OF DEVOTION, THAT WE HERE HIGHLY RESOLVE THAT THESE DEAD SHALL NOT HAVE DIED IN VAIN, THAT THIS NATION UNDER GOD 
(11/11) SHALL HAVE A NEW BIRTH OF FREEDOM, AND THAT GOVERNMENT OF THE PEOPLE BY THE PEOPLE FOR THE PEOPLE SHALL NOT PERISH FROM THE EARTH.

0

Javascript(FFのみ)、135文字

n=(s)=>{for(g=[],i=1,a=s.split(/(\s)/),r='';c=a.shift();g[i]=r+=c)if((c+r)[132]&&i++)r='';g.map((v,k)=>console.log(v,'('+k+'/'+i+')'))}

書式設定済み:

n=(s)=>{
    for (g=[],i=1,a=s.split(/(\s)/),r=''; c=a.shift(); g[i]=r+=c) {
        if((c+r)[132]&&i++) {
            r='';
        }
    }
    g.map((v,k)=>console.log(v,'('+k+'/'+i+')'))
}

これは私の短い答えよりも賢いと思います
チャールズではない14

0

PHP、233

これがカウント部分をチートしない最初の答えであると仮定して正しいですか?
(99以上のツイートでも機能します。その場合、無限ループを許可すれば、さらに2バイトを削ることができます。)

function t($s,$e=1){$a=explode(' ',$s);while($a){$t=++$n;while($a&&strlen($t.$a[0])<137-$e)$t.=' '.array_shift($a);$r[]=$t;}if($n>=10**$e)t($s,$e+1);else foreach($r as$i=>$s)echo preg_replace('%(^\d+)%',"(\$1/$n)",$s),'
';}

権利なし:

function t($s,$e=1)
{
    $a=explode(' ',$s);
    while($a)
    {
        $t=++$n;
        while($a&&strlen($t.$a[0])<137-$e)$t.=' '.array_shift($a);
        $r[]=$t;
    }
    if($n>=10**$e)                  // if tweet count has more than $e digits
        t($s,ceil(log10($n+1)));    // use correct length (golfed: try with length+1)
    else
        foreach($r as$i=>$s)
            echo preg_replace('%(^\d+)%',"(\$1/$n)",$s),"\n";
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.