Edisi Keempat Juli: Mencetak baris file yang berisi kelipatan dari nomor tertentu

8

Buat program yang mengambil satu argumen baris perintah,, nyang akan menjadi bilangan bulat kurang dari 2147483648 (2 ^ 31), dan kemudian membaca file input.txtdan mencetak baris input.txtyang berisi substring yang merupakan beberapa substring yang positif (tidak nol) berganda dari n. Anda dapat memilih untuk mengabaikan kelipatan lebih besar dari 2147483647.

Kasus cobaan

Jika input.txtberisi

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

kemudian find_multiples 4akan mencetak seluruh file, dan find_multiples 40akan mencetak

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
ojblass
sumber
1. Apakah Anda yakin maksud Anda 32 byte dan bukan 32 bit? 2. Kelipatan 4 apa yang ada dalam garis 33. Oregon Feb. 14, 1859 1811? Apakah itu 4dalam 14, menyiratkan bahwa pertandingan itu melawan substring daripada string digit yang dibatasi oleh non-digit atau akhir baris?
Peter Taylor
ya 4 dalam 4 dihitung sebagai 4 karena merupakan substring.
ojblass
3
Juga, apakah kode golf ini atau apakah ada kriteria kemenangan lainnya?
Peter Taylor
kode golf saja ... maaf hanya belajar di sini!
ojblass

Jawaban:

4

Perl, 67 karakter

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

Harap dicatat bahwa jumlah karakter yang diberikan mengambil keuntungan dari salah satu fitur Perl yang lebih mengerikan, yaitu bahwa variabel khusus dari formulir $^Xdapat ditulis dalam dua karakter, bukan tiga, dengan mengganti ^Xdengan karakter ctrl- X literal .

Dan, tentu saja, solusi ini tidak akan mungkin tanpa beberapa ekstensi regex Perl yang bisa dibilang sama-sama menakutkan yang memungkinkan seseorang untuk menanamkan kode aktual di dalam pola regex. (Tapi setidaknya fitur-fitur itu jelas didokumentasikan sebagai berpotensi menakutkan.)

[Diedit untuk memperbaiki bug dalam penanganan argumen karena tidak membaca deskripsi dengan cukup hati-hati.]

kotak roti
sumber
Seperti yang saya lihat solusinya tidak membaca dari file input.txt.
Howard
Hm Ketika saya membacanya, deskripsi masalah menyatakan bahwa program ini mengambil dua argumen, nama file input dan nomor untuk mencari kelipatan. Saya melihat sekarang bahwa ini diubah pada bagian paling akhir dari deskripsi. Jebakan kecil yang bagus untukmu di sana, Oscar Blass.
kotak roti
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 menghapus semua non-digit;

g menemukan semua angka yang dapat ditemukan dalam satu baris tanggal.

hmemeriksa untuk melihat apakah Mod [x, n] benar untuk semua nomor yang dikembalikan oleh g.

w memanggil subrutin dan memformat output.

Contohnya

n=40
w[n]

keluaran 40


 n=51
 w[n]

keluaran 51


 n=71
 w[n]

keluaran 71

DavidC
sumber
Ia mengembalikan "ToExpression :: sntx: Sintaks tidak valid di atau sebelum" 1. Delaware 7 Des 1787 "." bagi saya
Dr. belisarius
@belisarius Saya curiga ada masalah dengan file "Input.txt" Anda. Coba langsung atur dates={"1. Delaware Dec.7,1787"} Lalu coba w[17]. Itu harus mengembalikan baris informasi yang sama.
DavidC
Baik. Bagaimana saya harus menyimpan file input saya?
Dr. belisarius
Pertama-tama masukkan data Anda ke dalam daftar:, dates = {"1. Delaware Dec.7,1787",...}lalu Export["input.txt",dates]. Anda gunakan Import["input.txt", dates]untuk mendapatkannya kembali.
DavidC
Ahh ok. Dibutuhkan pijatan. Terima kasih!
Dr. belisarius
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];

Tidak diragukan lagi ada cara yang lebih anggun untuk menemukan substring dalam 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
tmartin
sumber
2

Ruby 2.0, 129 karakter

Dengan bantuan dari @ sync:

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

Garis panjang itu terpecah sedikit:

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

Contoh:

$ 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
daniero
sumber
2
Beberapa penghematan kecil untuk baris kedua: 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}}}}Saya suka #combinationtapi itu kata yang panjang!
Paul Prestidge
Terima kasih chron! Ya, secara semantik, saya pikir jawaban asli saya lebih cantik, tetapi ini jauh lebih pendek; Yang bagus! Saya berhasil mengeluarkan beberapa karakter lagi dengan mengambil keuntungan dari beberapa $variabel, jadi sekarang hampir terlihat seperti perl!
daniero
Kelihatan bagus! Melihat spek itu lagi, tampaknya nperlu arg baris perintah daripada nilai yang dibaca dari stdin. Jadi, Anda dapat menghapus baris pertama sepenuhnya dan mengganti ndi baris kedua dengan$*[0].to_i
Paul Prestidge
Kamu benar! Terima kasih.
daniero