Edición del cuatro de julio: imprima líneas de un archivo que contenga múltiplos de un número específico

8

Cree un programa que tome un argumento de línea de comando n, que será un entero menor que 2147483648 (2 ^ 31), y luego lee un archivo input.txte imprime las líneas input.txtque contienen cualquier subcadena que sea un múltiplo positivo (distinto de cero) de n. Puede optar por ignorar los múltiplos mayores que 2147483647.

Caso de prueba

Si input.txtcontiene

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

luego find_multiples 4imprimirá todo el archivo e find_multiples 40imprimirá

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
fuente
1. ¿Estás seguro de que quieres decir 32 bytes y no 32 bits? 2. ¿Qué múltiplo de 4 está presente en la línea 33. Oregon Feb. 14, 1859 1811? ¿Es el 4en 14, dando a entender que el partido está en contra de cualquier subcadena más que cualquier cadena de dígitos delimitado por los no-dígitos o final de la línea?
Peter Taylor
Sí, el 4 de cada 4 cuenta como un 4 porque es una subcadena.
ojblass
3
Además, ¿es este código golf o tiene algún otro criterio ganador?
Peter Taylor
solo codifique golf ... lo siento, solo aprendí aquí!
ojblass

Respuestas:

4

Perl, 67 caracteres

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

Tenga en cuenta que el recuento de caracteres dado se está aprovechando de una de las características más horribles de Perl, es decir, una variable especial de la forma $^X se puede escribir en dos caracteres en lugar de tres, reemplazando el ^Xcon un carácter ctrl- X literal .

Y, por supuesto, esta solución no sería posible sin un par de extensiones de expresiones regulares posiblemente igualmente aterradoras de Perl que le permitan incrustar código real dentro de un patrón de expresiones regulares. (Pero al menos esas características están claramente documentadas como potencialmente aterradoras).

[EDITADO para corregir un error en el manejo de argumentos debido a no leer la descripción con suficiente cuidado]

caja de pan
fuente
Como puedo ver, la solución no lee del archivo input.txt.
Howard
Hm. Mientras lo leo, la descripción del problema indica que el programa toma dos argumentos, el nombre del archivo de entrada y el número para buscar múltiplos. Ahora veo que esto se modifica al final de la descripción. Bonita trampa que me tendiste allí, Oscar Blass.
breadbox
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 elimina todos los no dígitos;

g encuentra todos los números que se pueden encontrar en una sola línea de fecha.

h comprueba si Mod [x, n] es verdadero para cualquiera de los números devueltos por g .

w llama a las subrutinas y formatea la salida.

Ejemplos

n=40
w[n]

salida 40


 n=51
 w[n]

salida 51


 n=71
 w[n]

salida 71

DavidC
fuente
Devuelve "ToExpression :: sntx: sintaxis no válida en o antes" 1. Delaware, 7 de diciembre de 1787 "." para mí
Dr. belisarius
@belisarius Sospecho que hubo un problema con su archivo "Input.txt". Intente configurar directamente dates={"1. Delaware Dec.7,1787"} Luego intente w[17]. Debería devolver la misma línea de información.
DavidC
Okay. ¿Cómo debo guardar mi archivo de entrada?
Dr. belisario
Primero ponga sus datos en una lista: dates = {"1. Delaware Dec.7,1787",...}luego Export["input.txt",dates]. Lo usas Import["input.txt", dates]para recuperarlo.
DavidC
Ahh ok. Se necesitaba algo de masaje. ¡Gracias!
Dr. belisario
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];

Sin duda, hay una forma más elegante de encontrar subcadenas en 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
fuente
2

Ruby 2.0, 129 caracteres

Con algo de ayuda de @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}}}}

Esa larga línea se rompió un poco:

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

Ejemplo:

$ 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
fuente
2
Unos pequeños ahorros para la segunda línea: ¡ 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}}}}me encanta #combinationpero es una palabra muy larga!
Paul Prestidge
Gracias cron! Sí, semánticamente, creo que mi respuesta original fue más bonita, pero esto es mucho más corto; ¡Buena esa! Me las arreglé para sacar algunos caracteres más aprovechando algunas $variables, ¡así que ahora casi parece perl!
daniero
¡Se ve bien! Mirando la especificación nuevamente, aparentemente ndebe ser un argumento de línea de comando en lugar de un valor leído desde stdin. Para que pueda eliminar su primera línea por completo y reemplazarla nen la segunda línea con$*[0].to_i
Paul Prestidge el
¡Estás en lo correcto! Gracias.
daniero