10
\$\begingroup\$

The challenge is to detect missing integer sequences of files or directories. You have a directory filled with files/directories that are named as integers.

The files/directories are generated from multiple threads yet the job did not complete - there are therefore gaps in the sequence.

The input is two integers a start and an end, and your task is detect the starting integer of the next missing sequences. You may presume that all files and directories in the directory where run have only integer named files or directories.

Acceptable answer forms: functions, code snippets - they must run on the command line.
Acceptable start/end input: included on the command line, env variables/argv are okay, parameters to functions, user input is okay.
Shortest code wins.

Update -- Although I managed to squeeze out this one, there were many interesting answers. The idea in apricotboy's Bash answer was used in part to help me design my 35 Byte Bash answer. Best of luck on the next one.

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
Dennis
212k41 gold badges379 silver badges829 bronze badges
asked Jul 26, 2016 at 2:12
\$\endgroup\$
13
  • 5
    \$\begingroup\$ It seems a rather pointless extra requirement to me. \$\endgroup\$ Commented Jul 26, 2016 at 2:18
  • 4
    \$\begingroup\$ This is absolutely a chameleon challenge - the requirement to take input as file names and/or directories makes this challenge more about working with the filesystem than actually filling in the holes. \$\endgroup\$ Commented Jul 26, 2016 at 2:53
  • 14
    \$\begingroup\$ You all complain too much whenever there's a challenge requiring any functionalities other than shuffling integers or strings around. \$\endgroup\$ Commented Jul 26, 2016 at 2:56
  • 3
    \$\begingroup\$ @feersum We complain when challenges arbitrarily require extra functionality (like filesystem I/O) that don't add anything to the actual challenge. \$\endgroup\$ Commented Jul 26, 2016 at 2:57
  • 4
    \$\begingroup\$ @feersum How is finding missing integers in sequence related to finding files in directory? \$\endgroup\$ Commented Jul 26, 2016 at 4:52

8 Answers 8

5
\$\begingroup\$

Python 2, 101 bytes

2 bytes thanks to @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
answered Jul 26, 2016 at 5:32
\$\endgroup\$
3
  • \$\begingroup\$ I detected 2 trailing spaces after your import os that you should take out. \$\endgroup\$ Commented Jul 26, 2016 at 5:36
  • \$\begingroup\$ @KevinLau-notKenny Thanks. \$\endgroup\$ Commented Jul 26, 2016 at 5:37
  • \$\begingroup\$ I think if~-n!=t: can be if~t+n:. \$\endgroup\$ Commented Jul 26, 2016 at 5:42
4
\$\begingroup\$

Dyalog APL, (削除) 25 (削除ここまで) 24 or 36 bytes

Prompts for lower bound, then upper bound.

It seems from comments to other answers that the OP wanted as short sequences as possible.

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

{
⍵/⍨ those where it is
~ not true
⍵∊⍨ that the set contains
⍵-1 their predecessor
} of
(
(⍳⎕) of the integers until n
~ except
⍳⎕-1 integers until n-1
)~ except
⍎ ̈ the evaluation of each of
⎕SH'dir/b' the bare list of names in the current directory


Old answer which returns length-1 sequences:

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

(
string representation
̈ of each
(⍳⎕) of the integers until n
~ except
⍳⎕-1 integers until n-1
)~ except
⎕SH'dir/b' the bare list of files in current directory

Only works on Windows. A cross platform solution:

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

0 just the filename(s)
⎕NINFO of the Native file(s) INFOrmation
⍠1 using wildcards
⊢'*' on all files

answered Jul 26, 2016 at 5:46
\$\endgroup\$
6
  • \$\begingroup\$ I'm getting (⍕¨(⍳⎕)~⍳⎕-1)~0⎕NINFO⍠1⊢'*' Unknown APL character: ⍠ (U+2360) Non-APL character \$\endgroup\$ Commented Jul 26, 2016 at 6:16
  • \$\begingroup\$ @A.Danischewski Which APL are you using? \$\endgroup\$ Commented Jul 26, 2016 at 6:17
  • 3
    \$\begingroup\$ @A.Danischewski Dyalog APL \$\endgroup\$ Commented Jul 26, 2016 at 6:21
  • 2
    \$\begingroup\$ @A.Danischewski Specifically version 15.0+, which is free, and downloadable with the link I provided. \$\endgroup\$ Commented Jul 26, 2016 at 6:22
  • \$\begingroup\$ Let us continue this discussion in chat. \$\endgroup\$ Commented Jul 26, 2016 at 14:18
4
\$\begingroup\$

Ruby, (削除) 74 (削除ここまで) (削除) 60 (削除ここまで) 45 bytes

Input is in command line, run it like ruby f.rb 0 20. Only works in current directory.

-1 byte from unpacking the ARGV into variables, and -13 bytes from replacing the select and grep with a set subtraction.

V3: -5 bytes from using a substitution for Dir.glob in an old Ruby answer to another filesystems challenge, as suggested by @PatrickOscity. -10 from remembering some quirks in Ruby's String#next function.

a,b=$*
f=[*a..b]-Dir[?*]
puts f-f.map(&:next)
answered Jul 26, 2016 at 2:54
\$\endgroup\$
0
4
\$\begingroup\$

Perl 6, 47 bytes

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

Explanation:

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

Tried to use flipflops. Didn't manage to :P.

answered Jul 26, 2016 at 7:49
\$\endgroup\$
2
  • \$\begingroup\$ this is a function. just put parentheses with the arguments after the closing }. \$\endgroup\$ Commented Jul 26, 2016 at 21:15
  • \$\begingroup\$ yep :-). hoping to see more people using Perl 6 everywhere, even in golfing! \$\endgroup\$ Commented Jul 26, 2016 at 21:59
1
\$\begingroup\$

PHP, 64 bytes

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

Run like this:

php -f golf.php 1 20

Note:

  • Only does the current directory.

  • No trailing newline on the output.

  • This requires the <?= to be allowed in php.ini. Which I think is default but I'm not sure.

Bash, 31 bytes

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

Run as a 1 20. Again, only does the current dir.

Can I submit two? Hope so. This is my first post to Code Golf so I'm not too sure of the etiquette. Hope I'm counting my bytes correctly, too.

answered Jul 26, 2016 at 6:43
\$\endgroup\$
3
  • 3
    \$\begingroup\$ You can submit multiple solutions, but unless they are trivial derivatives of each other, each solution should be in a separate answer. \$\endgroup\$ Commented Jul 26, 2016 at 7:06
  • \$\begingroup\$ You're only supposed to print the first element of each missing range, but the PHP code looks like it would print all of the missing numbers, is this correct? \$\endgroup\$ Commented Jul 26, 2016 at 7:07
  • \$\begingroup\$ Ah, my bad. I misunderstood it and just aimed to get the output in the question, without reading into it enough. Should I take my submission down? \$\endgroup\$ Commented Jul 27, 2016 at 4:36
1
\$\begingroup\$

I see now this is an old question, but still, I like it...

PowerShell, 70 bytes

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

Run as a script from the command line, eg .\misso.ps1 1 20.

answered Jan 19, 2017 at 20:46
\$\endgroup\$
0
\$\begingroup\$

PowerShell v4+, 62 bytes

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

Save as a script in the desired directory and call it locally (see example below). Takes input $x and $y and constructs a range .., then pipes that to a Where-Object (the |?{...}) which is basically a filter. Here we're only selecting items where the current element $_ is -notin the .Name collection of the current directory, but the previous element is -in that collection (i.e., only the start of a missing range).

The ls is an alias for Get-ChildItem and is basically what you'd expect. Requires v4 for the encapsulation-select of .Name, otherwise you'd need $a=ls ".\"|select Name.

Example

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
answered Jul 26, 2016 at 13:23
\$\endgroup\$
0
\$\begingroup\$

Groovy, 53 bytes

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

I had an explanation and screenshots, but I didn't post that version and left the page... Either that or I posted the answer to a random S.O. thread about the "best way to stat a directory in Groovy".

answered Jan 19, 2017 at 18:10
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.