7月4日の版:特定の数の倍数を含むファイルの行を印刷する


8

1つのコマンドライン引数、nつまり2147483648(2 ^ 31)未満の整数をとるプログラムを作成し、ファイルinput.txtを読み取りinput.txt、正(ゼロ以外)の倍数である部分文字列を含む行を出力します。のn。2147483647より大きい倍数を無視することもできます。

テストケース

input.txt含む場合

1. Delaware Dec. 7, 1787    
2. Pennsylvania Dec. 12, 1787   1682
3. New Jersey   Dec. 18, 1787   1660
4. Georgia  Jan. 2, 1788    1733
5. Connecticut  Jan. 9, 1788    1634
6. Massachusetts    Feb. 6, 1788    1620
7. Maryland Apr. 28, 1788   1634
8. South Carolina   May 23, 1788    1670
9. New Hampshire    June 21, 1788   1623
10. Virginia    June 25, 1788   1607
11. New York    July 26, 1788   1614
12. North Carolina  Nov. 21, 1789   1660
13. Rhode Island    May 29, 1790    1636
14. Vermont Mar. 4, 1791    1724
15. Kentucky    June 1, 1792    1774
16. Tennessee   June 1, 1796    1769
17. Ohio    Mar. 1, 1803    1788
18. Louisiana   Apr. 30, 1812   1699
19. Indiana Dec. 11, 1816   1733
20. Mississippi Dec. 10, 1817   1699
21. Illinois    Dec. 3, 1818    1720
22. Alabama Dec. 14, 1819   1702
23. Maine   Mar. 15, 1820   1624
24. Missouri    Aug. 10, 1821   1735
25. Arkansas    June 15, 1836   1686
26. Michigan    Jan. 26, 1837   1668
27. Florida Mar. 3, 1845    1565
28. Texas   Dec. 29, 1845   1682
29. Iowa    Dec. 28, 1846   1788
30. Wisconsin   May 29, 1848    1766
31. California  Sept. 9, 1850   1769
32. Minnesota   May 11, 1858    1805
33. Oregon  Feb. 14, 1859   1811
34. Kansas  Jan. 29, 1861   1727
35. West Virginia   June 20, 1863   1727
36. Nevada  Oct. 31, 1864   1849
37. Nebraska    Mar. 1, 1867    1823
38. Colorado    Aug. 1, 1876    1858
39. North Dakota    Nov. 2, 1889    1812
40. South Dakota    Nov. 2, 1889    1859
41. Montana Nov. 8, 1889    1809
42. Washington  Nov. 11, 1889   1811
43. Idaho   July 3, 1890    1842
44. Wyoming July 10, 1890   1834
45. Utah    Jan. 4, 1896    1847
46. Oklahoma    Nov. 16, 1907   1889
47. New Mexico  Jan. 6, 1912    1610
48. Arizona Feb. 14, 1912   1776
49. Alaska  Jan. 3, 1959    1784
50. Hawaii  Aug. 21, 1959   1820

次にfind_multiples 4、ファイル全体を印刷し、find_multiples 40印刷します

10. Virginia    June 25, 1788   1607
17. Ohio    Mar. 1, 1803    1788
21. Illinois    Dec. 3, 1818    1720
32. Minnesota   May 11, 1858    1805
40. South Dakota    Nov. 2, 1889    1859
41. Montana Nov. 8, 1889    1809

1. 32ビットではなく32バイトを意味しますか?2.ラインには4の倍数が33. Oregon Feb. 14, 1859 1811いくつありますか?それは4inであり14、非数字または行末で区切られた数字の文字列ではなく、部分文字列に対する一致であることを意味しますか?
Peter Taylor

はい、4 in 4は部分文字列であるため、4としてカウントされます。
ojblass 2013

3
また、このコードはゴルフですか、それとも他の勝利基準がありますか?
Peter Taylor

ゴルフをコード化するだけ...ここで学んでいるだけで申し訳ありません!
ojblass 2013

回答:


4

Perl、67文字

open F,"input.txt";print grep/(\d+)(?(?{!$^N+$^N%$ARGV[0]})(*F))/,<F>

指定された文字数はPerlのより恐ろしい機能の1つを利用していることに注意してください。つまり、フォームの特殊変数は、文字列をctrl- X文字で$^X置き換えることにより、3文字ではなく2文字で記述できます。^X

そしてもちろん、このソリューションは、実際のコードを正規表現パターンの内部に埋め込むことができる、Perlのほぼ同等の恐ろしい正規表現拡張機能がいくつかない場合、不可能です。(しかし、少なくともそれらの機能は潜在的に恐ろしいものとして文書化されています。)

[説明を注意深く読んでいないため、引数処理のバグを修正するために編集されました。]


ご覧のように、ソリューションはファイルから読み取れませんinput.txt
ハワード

うーん。私がそれを読んだとき、問題の説明は、プログラムが2つの引数、入力ファイルの名前と倍数を検索する番号を取ることを述べています。これは、説明の最後で変更されていることがわかります。そこに私のために設置した素敵な小さな罠、オスカーブラス。
ブレッドボックス2013

2

Mathematica

dates=Import["input.txt"]
f[digits_]:=FromDigits/@Flatten[Table[Partition[digits,k,1],{k,1,Length[digits]}],1]
g[oneline_]:={FromDigits[oneline[[1]]],Complement[Union[Flatten[f/@oneline]],{0}]}
h[n_,{a_,b_}]:={a,MemberQ[Mod[#,n]&/@b,0]};

w[k_]:=Column@dates[[Cases[h[k,g[#]]&/@ToExpression@(Characters /@ (StringCases[#, DigitCharacter ..] & /@ dates)),{j_,True}:>j]]]

f 非数字をすべて削除します。

g 単一の日付行にあるすべての数値を検索します。

hが返す数値のいずれかに対してMod [x、n]がtrueかどうかを確認しますg

w サブルーチンを呼び出し、出力をフォーマットします。

n=40
w[n]

出力40


 n=51
 w[n]

出力51


 n=71
 w[n]

出力71


「ToExpression :: sntx:Invalid syntax before or before」を返します。デラウェア州、1787年12月7日。私へ
ベリサリウス博士2013

@belisarius「Input.txt」ファイルに問題があったと思われます。直接設定してdates={"1. Delaware Dec.7,1787"} みてくださいw[17]。同じ行の情報を返す必要があります。
DavidC 2013

OK。入力ファイルをどのように保存すればよいですか?
belisarius博士2013

最初にデータをリストに入れます。dates = {"1. Delaware Dec.7,1787",...}次にExport["input.txt",dates]。あなたはImport["input.txt", dates]それを取り戻すために使用します。
DavidC 2013

ああ… いくつかのマッサージが必要でした。ありがとう!
belisarius博士、2013

2

Q、94

-1@m(&){0|/{(x>0)&0=x mod"I"$.z.x 0}"J"$sublist[;x]'[a cross a:(!)1+(#)x]}'[m:(0:)`input.txt];

qで部分文字列を検索するためのより優雅な方法は間違いありません。

$ q find_multiples.q 40 -q
10. Virginia    June 25, 1788   1607
17. Ohio    Mar. 1, 1803    1788
21. Illinois    Dec. 3, 1818    1720
32. Minnesota   May 11, 1858    1805
40. South Dakota    Nov. 2, 1889    1859
41. Montana Nov. 8, 1889    1809

$ q find_multiples.q 51 -q
19. Indiana Dec. 11, 1816   1733
25. Arkansas    June 15, 1836   1686
37. Nebraska    Mar. 1, 1867    1823

2

Ruby 2.0、129文字

@chronの助けを借りて:

IO.foreach('input.txt'){$><<$_ if$_.gsub(/\d+/).any?{(0..s=$&.size).any?{|i|(1..s).any?{|j|(v=$&[i,j].to_i)%$*[0].to_i<1&&v>0}}}}

その長い行は少し分割されています:

IO.foreach('input.txt') {
    $> << $_ if $_.gsub(/\d+/).any? {
        (0..s=$&.size).any? { |i|
            (1..s).any? { |j|
                (v=$&[i,j].to_i) % $*[0].to_i < 1 && v>0 }}}}

例:

$ ruby july4.rb 40
10. Virginia    June 25, 1788   1607
17. Ohio    Mar. 1, 1803    1788
21. Illinois    Dec. 3, 1818    1720
32. Minnesota   May 11, 1858    1805
40. South Dakota    Nov. 2, 1889    1859
41. Montana Nov. 8, 1889    1809

$ ruby july4.rb 71
29. Iowa    Dec. 28, 1846   1788

2
2行目のいくつかの小さな節約:IO.foreach('input.txt'){|l|puts l if l.scan(/\d+/).any?{|a|(0..s=a.size).any?{|i|(1..s).any?{|j|(v=a[i,j].to_i)%n<1&&v>0}}}}大好きです#combinationが、とても長い言葉です!
Paul Prestidge 2013

いつもありがとう!はい、意味的には、私の元の答えはよりきれいだったと思いますが、これははるかに短いです。良いですね!いくつかの$変数を利用することで、さらにいくつかの文字をなんとか絞り出すことができたので、今ではほとんどperlのように見えます!
daniero 2013

いいね!仕様をもう一度見ると、nstdinから読み取った値ではなく、コマンドライン引数である必要があるようです。したがって、最初の行を完全に削除nし、2行目を次のように置き換えることができます$*[0].to_i
Paul Prestidge

その通りその通り!ありがとう。
daniero 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.