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.