Detección de secuencia de enteros faltantes - Sistema de archivos


8

El desafío es detectar secuencias enteras faltantes de archivos o directorios. Tiene un directorio lleno de archivos / directorios que se nombran como enteros.

Los archivos / directorios se generan a partir de varios subprocesos, pero el trabajo no se completó; por lo tanto, hay espacios en la secuencia.

La entrada es dos enteros, un inicio y un final, y su tarea es detectar el entero inicial de las siguientes secuencias que faltan. Puede suponer que todos los archivos y directorios en el directorio donde se ejecutan solo tienen archivos o directorios con nombre entero.

Formularios de respuesta aceptables: funciones, fragmentos de código: deben ejecutarse en la línea de comandos.
Entrada de inicio / fin aceptable: incluida en la línea de comando, las variables env / argv están bien , los parámetros para las funciones, la entrada del usuario está bien .
El código más corto gana.

Actualización: aunque logré exprimir esta, hubo muchas respuestas interesantes. La idea en la respuesta Bash de apricotboy se usó en parte para ayudarme a diseñar mi respuesta Bash de 35 bytes. Mucha suerte en el próximo.

E.g. Presume files 1,2,3,4,7,8,9,10,18 are present, start is 1, end is 20: 

The output should be: 
5
11
19


44
Este es absolutamente un desafío de camaleón: el requisito de tomar la entrada como nombres de archivo y / o directorios hace que este desafío sea más sobre trabajar con el sistema de archivos que sobre llenar los huecos.
Mego

14
Todos se quejan demasiado cuando hay un desafío que requiere funcionalidades que no sean mezclar enteros o cadenas.
fiesta

3
@feersum Nos quejamos cuando los desafíos requieren arbitrariamente funcionalidades adicionales (como E / S del sistema de archivos) que no agregan nada al desafío real.
Mego

44
@feersum ¿Cómo se relaciona la búsqueda de enteros faltantes en secuencia con la búsqueda de archivos en el directorio?
Leaky Nun

Respuestas:


5

Python 2, 101 bytes

2 bytes gracias a @xnor.

import os
t=-1
for n in range(input(),input()+1):
 if~-os.path.isfile(str(n)):
  if~t+n:print n
  t=n

Detecté 2 espacios finales después de tu import osque deberías eliminar.
Value Ink

@ KevinLau-notKenny Gracias.
Leaky Nun

Creo que if~-n!=t:puede ser if~t+n:.
xnor

4

Dyalog APL , 25 24 o 36 bytes

Solicita límite inferior, luego límite superior.

De los comentarios a otras respuestas parece que el OP quería secuencias tan cortas como fuera posible.

{⍵/⍨~⍵∊⍨⍵-1}((⍳⎕)~⍳⎕-1)~⍎¨⎕SH'dir/b'

{
    ⍵/⍨aquellos en los que
    ~no es cierto
    ⍵∊⍨que el conjunto contenga
    ⍵-1su predecesor
}de
(
    (⍳⎕)los enteros hasta n,
    ~ excepto los
    ⍳⎕-1enteros hasta n -1,
)~excepto
⍎¨la evaluación de cada una de
⎕SH'dir/b'las listas de nombres en el directorio actual


Respuesta anterior que devuelve secuencias de longitud 1:

(⍕¨(⍳⎕)~⍳⎕-1)~⎕SH'dir/b'

(
    representación
    ¨de cadena de cada uno
    (⍳⎕)de los enteros hasta n,
    ~ excepto los
    ⍳⎕-1enteros hasta n -1,
)~excepto
⎕SH'dir/b'la lista de archivos en el directorio actual

Solo funciona en Windows. Una solución multiplataforma:

(⍕¨(⍳⎕)~⍳⎕-1)~0⎕NINFO⍠1⊢'*'

0solo los nombres de archivo
⎕NINFOde los archivos nativos INFOrmation
⍠1usando comodines
⊢'*'en todos los archivos


Estoy obteniendo (⍕¨ (⍳⎕) ~ ⍳⎕-1) ~ 0⎕NINFO⍠1⊢ '*' Carácter APL desconocido: ⍠ (U + 2360) Carácter no APL

@ A.Danischewski ¿Qué APL estás usando?
Adám

3
@ A.Danischewski Dyalog APL
Adám

2
@ A.Danischewski Específicamente la versión 15.0+, que es gratuita y se puede descargar con el enlace que proporcioné.
Adám


4

Ruby, 74 60 45 bytes

La entrada está en la línea de comando, ejecútela como ruby f.rb 0 20. Solo funciona en el directorio actual.

-1 byte de desempaquetar las ARGVvariables en, y -13 bytes de reemplazar el selecty grepcon una resta establecida.

V3: -5 bytes del uso de una sustitución Dir.globen una respuesta anterior de Ruby a otro desafío de sistemas de archivos , como lo sugiere @PatrickOscity. -10 de recordar algunas peculiaridades en la String#nextfunción de Ruby .

a,b=$*
f=[*a..b]-Dir[?*]
puts f-f.map(&:next)

4

Perl 6, 47 bytes

{my \c;.say if .IO.e??(c=0)!!!c++ for $^a..$^b}

Explicación:

{my \c;.say if .IO.e??(c=0)!!!c++ for $^a..$^b}
{                                               } # A function. Arguments: $^a and $^b (implicitly)
 my \c;                                           # A variable without prefix (\ is needed only here)
                                  for $^a..$^b    # For each number between $^a and $^b 
       .say if                                    # Print the number if the result is truthy:
               .IO.e??(c=0)!!!c++                 # If the file exists, reset the sequence (don't print this one), otherwise, return the `!(c++)` result (is it the first time we're incrementing)

Intenté usar chanclas. No logró: P.


Esta es una función. simplemente ponga paréntesis con los argumentos después del cierre }.
Ven

Sí :-). con la esperanza de ver a más personas usando Perl 6 en todas partes, ¡incluso en el golf!
Ven

1

PHP, 64 bytes

<?=implode("\n",array_diff(range($argv[1],$argv[2]),glob("*")));

Corre así:

php -f golf.php 1 20

Nota:

  • Solo lo hace el directorio actual.

  • No hay nueva línea final en la salida.

  • Esto requiere <?=que se permita en php.ini. Lo cual creo que es predeterminado pero no estoy seguro.

Bash, 31 bytes

a(){(seq $@;ls)|sort|uniq -u;}

Corre como a 1 20. De nuevo, solo lo hace el directorio actual.

¿Puedo enviar dos? Eso espero. Esta es mi primera publicación en Code Golf, así que no estoy muy seguro de la etiqueta. Espero que también cuente mis bytes correctamente.


3
Puede enviar múltiples soluciones, pero a menos que sean derivadas triviales entre sí, cada solución debe estar en una respuesta separada.
Mego

Se supone que solo debe imprimir el primer elemento de cada rango faltante, pero el código PHP parece que imprimirá todos los números faltantes, ¿es correcto?
feersum

Ah, mi mal. Lo entendí mal y solo pretendía obtener el resultado de la pregunta, sin leerlo lo suficiente. ¿Debo retirar mi presentación?
albaricoquero

1

Ahora veo que esta es una vieja pregunta, pero aún así, me gusta ...

PowerShell, 70 bytes

for($m,$n=$args;$m-le$n;$m++){$w=$a;$a=Test-Path $m;if(!$a-and$w){$m}}

Ejecutar como un script desde la línea de comando, por ejemplo. \ Misso.ps1 1 20.


0

PowerShell v4 +, 62 bytes

param($x,$y)$x..$y|?{$_-notin($a=(ls ".\").Name)-and$_-1-in$a}

Guardar como una secuencia de comandos en el directorio deseado y llamarlo localmente (ver ejemplo a continuación). Toma datos $xy $yconstruye un rango .., luego lo canaliza a un Where-Object(el |?{...}) que es básicamente un filtro. Aquí solo seleccionamos elementos donde el elemento actual $_es -notinla .Namecolección del directorio actual, pero el elemento anterior es-in esa colección (es decir, solo el comienzo de un rango faltante).

El lses un alias para Get-ChildItemy es básicamente lo que esperarías. Requiere v4 para la selección de encapsulación .Name, de lo contrario necesitaría$a=ls ".\"|select Name .

Ejemplo

PS C:\Tools\Scripts\golfing\misd> ls .\

    Directory: C:\Tools\Scripts\golfing\misd

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         7/26/2016   7:48 AM          8 1
-a---         7/26/2016   7:48 AM         10 10
-a---         7/26/2016   7:54 AM          0 18
-a---         7/26/2016   7:48 AM          8 2
-a---         7/26/2016   7:48 AM          8 3
-a---         7/26/2016   7:48 AM          8 4
-a---         7/26/2016   7:48 AM         10 7
-a---         7/26/2016   7:48 AM          8 8
-a---         7/26/2016   7:48 AM          8 9
-a---         7/26/2016   8:18 AM        365 misd.ps1

PS C:\Tools\Scripts\golfing\misd> .\misd.ps1 1 20
5
11
19

0

Groovy, 53 bytes

{f,s,e->(s..e)-f.listFiles().collect{it.name as int}}

Tenía una explicación y capturas de pantalla, pero no publiqué esa versión y salí de la página ... O eso o publiqué la respuesta en un hilo SO aleatorio sobre la "mejor manera de crear un directorio en Groovy".

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.