Phiên bản thứ tư của tháng 7: In các dòng của một tệp chứa bội số của một số cụ thể


8

Tạo một chương trình có một đối số dòng lệnh, nsẽ là một số nguyên nhỏ hơn 2147483648 (2 ^ 31), sau đó đọc một tệp input.txtvà in các dòng input.txtchứa bất kỳ chuỗi con nào có bội số dương (khác không) của n. Bạn có thể chọn bỏ qua bội số lớn hơn 2147483647.

Trường hợp thử nghiệm

Nếu input.txtchứa

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

sau đó find_multiples 4sẽ in toàn bộ tập tin và find_multiples 40sẽ in

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. Bạn có chắc là bạn có nghĩa là 32 byte chứ không phải 32 bit? 2. Bội số nào của 4 có mặt trong dòng 33. Oregon Feb. 14, 1859 1811? Đây có phải là 4trong 14, ngụ ý rằng trận đấu chống lại bất kỳ chuỗi con nào hơn là bất kỳ chuỗi chữ số nào được phân tách bằng các chữ số không hoặc cuối dòng?
Peter Taylor

vâng, 4 trong 4 được tính là 4 vì nó là một chuỗi con.
ojblass

3
Ngoài ra, mã golf này hay nó có một số tiêu chí chiến thắng khác?
Peter Taylor

chỉ cần chơi golf ... xin lỗi chỉ học ở đây!
ojblass

Câu trả lời:


4

Perl, 67 ký tự

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

Xin lưu ý rằng số lượng ký tự đã cho là lợi dụng một trong những tính năng khủng khiếp hơn của Perl, cụ thể là một biến đặc biệt của biểu mẫu $^Xcó thể được viết thành hai ký tự thay vì ba, bằng cách thay thế ^Xbằng ký tự ctrl- X bằng chữ.

Và, tất nhiên, giải pháp này sẽ không thể thực hiện được nếu không có một vài phần mở rộng biểu thức chính đáng sợ không kém phần đáng sợ của Perl cho phép người ta nhúng mã thực tế vào bên trong mẫu biểu thức chính quy. (Nhưng ít nhất những tính năng đó được ghi lại rõ ràng là có khả năng đáng sợ.)

[EDITED để sửa lỗi trong xử lý đối số do không đọc kỹ mô tả.]


Như tôi có thể thấy giải pháp không đọc từ tập tin input.txt.
Howard

Hừm. Khi tôi đọc nó, mô tả vấn đề nói rằng chương trình có hai đối số, tên của tệp đầu vào và số để tìm kiếm bội số của. Bây giờ tôi thấy rằng điều này được sửa đổi ở phần cuối của mô tả. Cái bẫy nhỏ xinh mà bạn đặt cho tôi ở đó, Oscar Blass.
hộp bánh mì

2

Toán học

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 loại bỏ tất cả các chữ số không;

g tìm thấy tất cả các số có thể được tìm thấy trong một dòng ngày duy nhất.

hkiểm tra xem Mod [x, n] có đúng với bất kỳ số nào được trả về không g.

w gọi chương trình con và định dạng đầu ra.

Ví dụ

n=40
w[n]

đầu ra 40


 n=51
 w[n]

đầu ra 51


 n=71
 w[n]

đầu ra 71


Nó trả về "ToExpression :: sntx: Cú pháp không hợp lệ trong hoặc trước" 1. Del biết ngày 7 tháng 12 năm 1787 "." với tôi
Tiến sĩ belisarius

@belisarius Tôi nghi ngờ rằng có vấn đề với tệp "Input.txt" của bạn. Thử trực tiếp cài đặt dates={"1. Delaware Dec.7,1787"} Sau đó thử w[17]. Nó sẽ trả về cùng một dòng thông tin.
DavidC

Đồng ý. Làm thế nào tôi nên lưu tập tin đầu vào của tôi?
Tiến sĩ belisarius

Đầu tiên hãy đưa dữ liệu của bạn vào một danh sách : dates = {"1. Delaware Dec.7,1787",...}, sau đó Export["input.txt",dates]. Bạn sử dụng Import["input.txt", dates]để lấy lại.
DavidC

À, được rồi. Một số xoa bóp là cần thiết. Cảm ơn!
Tiến sĩ 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];

Chắc chắn có một cách duyên dáng hơn để tìm các chuỗi con trong 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 ký tự

Với một số trợ giúp từ @ 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}}}}

Dòng dài chia tay một chút:

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

Thí dụ:

$ 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
Một vài khoản tiết kiệm nhỏ cho dòng thứ hai: 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}}}}Tôi yêu #combinationnhưng đó là một từ dài!
Paul Prestidge

Cảm ơn chron! Vâng, về mặt ngữ nghĩa, tôi nghĩ rằng câu trả lời ban đầu của tôi đẹp hơn, nhưng đây là cách ngắn hơn; Đẹp quá Tôi đã xoay sở để tiết lộ thêm một vài ký tự bằng cách tận dụng một số $biến, vì vậy bây giờ nó gần giống như perl!
daniero

Có vẻ tốt! Nhìn vào thông số kỹ thuật một lần nữa, rõ ràng ncần phải là một đối số dòng lệnh hơn là một giá trị được đọc từ stdin. Vì vậy, bạn có thể xóa hoàn toàn dòng đầu tiên của mình và thay thế ntrong dòng thứ hai bằng$*[0].to_i
Paul Prestidge

Bạn đúng! cảm ơn.
daniero
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.