Detecção de Sequência Inteira em Falta - Sistema de Arquivos


8

O desafio é detectar seqüências inteiras ausentes de arquivos ou diretórios. Você tem um diretório preenchido com arquivos / diretórios nomeados como números inteiros.

Os arquivos / diretórios são gerados a partir de vários encadeamentos, mas o trabalho não foi concluído - portanto, existem lacunas na sequência.

A entrada é dois números inteiros, um início e um fim, e sua tarefa é detectar o número inteiro inicial das próximas seqüências ausentes. Você pode presumir que todos os arquivos e diretórios no diretório em que são executados possuem apenas arquivos ou diretórios nomeados inteiros.

Formulários de resposta aceitáveis: funções, trechos de código - eles devem ser executados na linha de comando.
Entrada inicial / final aceitável: incluídas na linha de comando, as variáveis ​​env / argv estão corretas , os parâmetros para funções, a entrada do usuário está correta .
O menor código vence.

Atualização - Embora eu tenha conseguido extrair essa, havia muitas respostas interessantes. A idéia na resposta Bash do apricotboy foi usada em parte para me ajudar a criar minha resposta de 35 Byte Bash. Boa sorte no 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


4
Isso é absolutamente um desafio para os camaleões - o requisito de receber entradas como nomes de arquivos e / ou diretórios torna esse desafio mais sobre trabalhar com o sistema de arquivos do que realmente preencher os buracos.
Mego

14
Todos vocês reclamam demais sempre que há um desafio que exige outras funcionalidades além de embaralhar números inteiros ou seqüências de caracteres.
feersum

3
@feersum Nós reclamamos quando desafios arbitrariamente exigem funcionalidade extra (como E / S do sistema de arquivos) que não adiciona nada ao desafio real.
Mego

4
@feersum Como a localização de números inteiros ausentes na sequência está relacionada à localização de arquivos no diretório?
Freira vazando

Respostas:


5

Python 2, 101 bytes

2 bytes graças 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

Eu detectei 2 espaços à direita depois do seu import osque você deveria tirar.
Value Ink

@ KevinLau-notKenny Obrigado.
Freira vazando

Eu acho que if~-n!=t:pode ser if~t+n:.
Xnor

4

Dyalog APL , 25 24 ou 36 bytes

Solicita o limite inferior e o limite superior.

Parece que de comentários a outras respostas o OP queria o mais breve possível.

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

{
    ⍵/⍨aqueles em que
    ~não é verdade
    ⍵∊⍨que o conjunto contém
    ⍵-1seu predecessor
}de
(
    (⍳⎕)números inteiros até n,
    ~ exceto
    ⍳⎕-1números inteiros até n -1,
)~exceto
⍎¨a avaliação de cada uma das
⎕SH'dir/b'listas simples de nomes no diretório atual


Resposta antiga que retorna seqüências de comprimento 1:

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

(
    representação
    ¨de sequência de cada um
    (⍳⎕)dos números inteiros até n,
    ~ exceto
    ⍳⎕-1números inteiros até n -1,
)~exceto
⎕SH'dir/b'a lista simples de arquivos no diretório atual

Só funciona no Windows. Uma solução multiplataforma:

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

0apenas o (s) nome (s)
⎕NINFOdo (s) arquivo (s) nativo (s) INFOrmation
⍠1usando curingas
⊢'*'em todos os arquivos


Estou recebendo (⍕¨ (⍳⎕) ~ ⍳⎕-1) ~ 0⎕NINFO⍠1⊢ '*' Caractere APL desconhecido: ⍠ (U + 2360) Caractere não APL

@ A.Danischewski Qual APL você está usando?
Adám 26/07/16

3
@ A.Danischewski Dyalog APL
Adám

2
@ A.Danischewski Especificamente, a versão 15.0+, que é gratuita e pode ser baixada com o link que forneci.
Adám 26/07/16


4

Ruby, 74 60 45 bytes

A entrada está na linha de comando, execute-a como ruby f.rb 0 20. Funciona apenas no diretório atual.

-1 byte de descompactar as ARGVvariáveis ​​into e -13 bytes de substituição de selecte greppor uma subtração de conjunto.

V3: -5 bytes do uso de uma substituição Dir.globem uma resposta antiga do Ruby para outro desafio do sistema de arquivos , conforme sugerido por @PatrickOscity. -10 de lembrar algumas peculiaridades na String#nextfunção 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}

Explicação:

{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)

Tentei usar chinelos. Não conseguiu: P.


isso é uma função. basta colocar parênteses com os argumentos após o fechamento }.
Ven

Sim :-). esperando ver mais pessoas usando o Perl 6 em todos os lugares, mesmo no golfe!
Ven

1

PHP, 64 bytes

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

Execute assim:

php -f golf.php 1 20

Nota:

  • Somente o diretório atual.

  • Nenhuma nova linha à direita na saída.

  • Isso requer <?=que seja permitido no php.ini. O que eu acho que é o padrão, mas não tenho certeza.

Bash, 31 bytes

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

Executar como a 1 20. Novamente, apenas o diretório atual.

Posso enviar dois? Espero que sim. Este é o meu primeiro post no Code Golf, então não tenho muita certeza da etiqueta. Espero que eu esteja contando meus bytes corretamente também.


3
Você pode enviar várias soluções, mas, a menos que sejam derivadas triviais uma da outra, cada solução deve estar em uma resposta separada.
Mego 26/07

Você deve imprimir apenas o primeiro elemento de cada intervalo ausente, mas o código PHP parece que imprimiria todos os números ausentes, isso está correto?
feersum

Ah, meu mal. Eu o entendi mal e apenas pretendi obter o resultado da pergunta, sem ler o suficiente. Devo retirar minha inscrição?
menino de damasco

1

Vejo agora que esta é uma pergunta antiga, mas ainda assim, eu gosto ...

PowerShell, 70 bytes

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

Execute como um script na linha de comando, por exemplo, \ misso.ps1 1 20.


0

PowerShell v4 +, 62 bytes

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

Salve como um script no diretório desejado e chame-o localmente (veja o exemplo abaixo). Toma entrada $xe $ye constrói um intervalo .., então tubos que para um Where-Object(a |?{...}), que é basicamente um filtro. Aqui, estamos apenas selecionando itens onde o elemento atual $_é -notina .Namecoleção do diretório atual, mas o elemento anterior é -inessa coleção (ou seja, apenas o início de um intervalo ausente).

O lsé um alias para Get-ChildIteme é basicamente o que você esperaria. Requer v4 para a seleção de encapsulamento de .Name, caso contrário, você precisaria $a=ls ".\"|select Name.

Exemplo

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

Eu tive uma explicação e capturas de tela, mas não publiquei essa versão e saí da página ... Ou então, postei a resposta em um tópico aleatório do SO sobre a "melhor maneira de definir um diretório no Groovy".

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.