Ausgabe vom 4. Juli: Drucken Sie Zeilen einer Datei, die Vielfache einer bestimmten Zahl enthält

8

Erstellen Sie ein Programm, das ein Befehlszeilenargument verwendet n, das eine Ganzzahl kleiner als 2147483648 (2 ^ 31) ist, und liest dann eine Datei input.txtund druckt die Zeilen, input.txtderen Teilzeichenfolge ein positives (nicht null) Vielfaches ist von n. Sie können Vielfache größer als 2147483647 ignorieren.

Testfall

Wenn input.txtenthält

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

Dann find_multiples 4wird die gesamte Datei find_multiples 40gedruckt und gedruckt

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
quelle
1. Sind Sie sicher, dass Sie 32 Bytes und nicht 32 Bit meinen? 2. Welches Vielfache von 4 ist in der Zeile vorhanden 33. Oregon Feb. 14, 1859 1811? Ist es das 4In 14, was bedeutet, dass die Übereinstimmung eher mit einem Teilstring als mit einer durch Nicht-Ziffern oder Zeilenende begrenzten Ziffernfolge erfolgt?
Peter Taylor
Ja, die 4 in 4 zählt als 4, weil es sich um eine Teilzeichenfolge handelt.
Ojblass
3
Ist dieser Code Golf oder hat er ein anderes Gewinnkriterium?
Peter Taylor
Nur Code Golf ... Entschuldigung, ich lerne gerade hier!
Ojblass

Antworten:

4

Perl, 67 Zeichen

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

Bitte beachten Sie, dass die angegebene Anzahl von Zeichen eine der schrecklichsten Funktionen von Perl ausnutzt, nämlich dass eine spezielle Variable des Formulars $^Xin zwei statt drei Zeichen geschrieben werden kann, indem die ^Xdurch ein wörtliches Strg- X- Zeichen ersetzt wird.

Und natürlich wäre diese Lösung ohne ein paar von Perls wohl ebenso furchterregenden Regex-Erweiterungen nicht möglich, mit denen man tatsächlichen Code in ein Regex-Muster einbetten kann. (Aber zumindest diese Funktionen sind eindeutig als potenziell beängstigend dokumentiert.)

[BEARBEITET, um Fehler in der Argumentationsbehandlung zu beheben, da die Beschreibung nicht sorgfältig genug gelesen wurde.]

Brot-Box
quelle
Wie ich sehen kann, liest die Lösung nicht aus der Datei input.txt.
Howard
Hm. Während ich es lese, heißt es in der Problembeschreibung, dass das Programm zwei Argumente akzeptiert, den Namen der Eingabedatei und die Nummer, nach der nach Vielfachen gesucht werden soll. Ich sehe jetzt, dass dies ganz am Ende der Beschreibung geändert wird. Schöne kleine Falle, die du mir dort gestellt hast, Oscar Blass.
Brotkasten
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 entfernt alle nicht Ziffern;

g findet alle Zahlen, die in einer einzigen Datumszeile gefunden werden können.

hprüft, ob Mod [x, n] für eine der von zurückgegebenen Zahlen wahr ist g.

w ruft die Unterprogramme auf und formatiert die Ausgabe.

Beispiele

n=40
w[n]

Ausgang 40


 n=51
 w[n]

Ausgang 51


 n=71
 w[n]

Ausgang 71

DavidC
quelle
Es gibt "ToExpression :: sntx: Ungültige Syntax in oder vor" 1 zurück. Delaware 7. Dezember 1787 "." zu mir
Dr. Belisarius
@belisarius Ich vermute, dass es ein Problem mit Ihrer "Input.txt" -Datei gab. Versuchen Sie es direkt. dates={"1. Delaware Dec.7,1787"} Dann versuchen Sie es w[17]. Es sollte dieselbe Informationszeile zurückgeben.
DavidC
OK. Wie soll ich meine Eingabedatei speichern?
Dr. Belisarius
Fügen Sie zuerst Ihre Daten in eine Liste ein : dates = {"1. Delaware Dec.7,1787",...}, dann Export["input.txt",dates]. Sie verwenden es Import["input.txt", dates], um es zurückzubekommen.
DavidC
Ahh ok. Es war etwas Massage nötig. Vielen Dank!
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];

Es gibt zweifellos eine elegantere Möglichkeit, Teilzeichenfolgen in q zu finden.

$ 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
quelle
2

Ruby 2.0, 129 Zeichen

Mit etwas Hilfe von @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}}}}

Diese lange Schlange hat sich ein bisschen aufgelöst:

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

Beispiel:

$ 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
quelle
2
Ein paar kleine Einsparungen für die zweite Zeile: 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}}}}Ich liebe, #combinationaber es ist so ein langes Wort!
Paul Prestidge
Danke chron! Ja, semantisch denke ich, dass meine ursprüngliche Antwort hübscher war, aber das ist viel kürzer; Schön! Ich habe es geschafft, ein paar weitere Zeichen herauszuholen, indem ich einige $Variablen ausgenutzt habe , also sieht es jetzt fast wie Perl aus!
Daniero
Sieht gut aus! Wenn Sie sich die Spezifikation noch einmal ansehen, nmuss es sich anscheinend eher um ein Befehlszeilenargument als um einen von stdin gelesenen Wert handeln. So können Sie Ihre erste Zeile vollständig löschen und nin der zweiten Zeile durch$*[0].to_i
Paul Prestidge
Du hast Recht! Vielen Dank.
Daniero