Fehlende Ganzzahlsequenzerkennung - Dateisystem


8

Die Herausforderung besteht darin, fehlende ganzzahlige Sequenzen von Dateien oder Verzeichnissen zu erkennen. Sie haben ein Verzeichnis mit Dateien / Verzeichnissen, die als Ganzzahlen bezeichnet werden.

Die Dateien / Verzeichnisse werden aus mehreren Threads generiert, der Auftrag wurde jedoch nicht abgeschlossen. Daher gibt es Lücken in der Reihenfolge.

Die Eingabe besteht aus zwei Ganzzahlen pro Start und Ende, und Ihre Aufgabe besteht darin, die Start-Ganzzahl der nächsten fehlenden Sequenzen zu ermitteln. Sie können davon ausgehen, dass alle Dateien und Verzeichnisse in dem Verzeichnis, in dem ausgeführt wird, nur ganzzahlige Dateien oder Verzeichnisse haben.

Akzeptable Antwortformulare: Funktionen, Codefragmente - sie müssen in der Befehlszeile ausgeführt werden.
Akzeptable Start / Ende-Eingabe: In der Befehlszeile enthalten, sind env-Variablen / argv in Ordnung , Parameter für Funktionen, Benutzereingaben sind in Ordnung .
Der kürzeste Code gewinnt.

Update - Obwohl ich es geschafft habe, dieses herauszupressen, gab es viele interessante Antworten. Die Idee in Apricotboys Bash-Antwort wurde teilweise verwendet, um mir beim Entwerfen meiner 35-Byte-Bash-Antwort zu helfen. Viel Glück beim nächsten.

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
Dies ist absolut eine Chamäleon-Herausforderung - die Anforderung, Eingaben als Dateinamen und / oder Verzeichnisse zu verwenden, macht diese Herausforderung mehr zur Arbeit mit dem Dateisystem als zum tatsächlichen Ausfüllen der Lücken.
Mego

14
Sie alle beschweren sich zu sehr, wenn es eine Herausforderung gibt, die andere Funktionen als das Mischen von ganzen Zahlen oder Zeichenfolgen erfordert.
Feersum

3
@feersum Wir beschweren uns, wenn Herausforderungen willkürlich zusätzliche Funktionen erfordern (z. B. Dateisystem-E / A), die der eigentlichen Herausforderung nichts hinzufügen.
Mego

4
@feersum Wie hängt das Auffinden fehlender Ganzzahlen in der Reihenfolge mit dem Auffinden von Dateien im Verzeichnis zusammen?
Undichte Nonne

Antworten:


5

Python 2, 101 Bytes

2 Bytes dank @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

Ich habe nach Ihnen 2 Leerzeichen entdeckt import os, die Sie entfernen sollten.
Wert Tinte

@ KevinLau-notKenny Danke.
Undichte Nonne

Ich denke if~-n!=t:kann sein if~t+n:.
xnor

4

Dyalog APL , 25 24 oder 36 Bytes

Fordert zur Untergrenze und dann zur Obergrenze auf.

Aus Kommentaren zu anderen Antworten geht hervor, dass das OP so kurze Sequenzen wie möglich haben wollte.

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

{
    ⍵/⍨diejenigen , bei denen es ist
    ~nicht wahr ,
    ⍵∊⍨dass der Satz enthält
    ⍵-1ihre Vorgänger
}von
(
    (⍳⎕)den ganzen Zahlen bis n
    ~ Ausnahme
    ⍳⎕-1ganzer Zahlen bis n -1
)~außer
⍎¨der Bewertung der einzelnes
⎕SH'dir/b'der bloßen Liste der Namen im aktuellen Verzeichnis


Alte Antwort, die Sequenzen der Länge 1 zurückgibt:

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

(
    Zeichenfolgendarstellung
    ¨jeder
    (⍳⎕)der Ganzzahlen bis n
    ~ außer
    ⍳⎕-1Ganzzahlen bis n -1 mit
)~Ausnahme
⎕SH'dir/b'der bloßen Liste der Dateien im aktuellen Verzeichnis

Funktioniert nur unter Windows. Eine plattformübergreifende Lösung:

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

0Nur die Dateinamen
⎕NINFOder nativen Datei (en) INFOrmation unter
⍠1Verwendung von Platzhaltern
⊢'*'für alle Dateien


Ich erhalte (⍕¨ (⍳⎕) ~ ⍳⎕-1) ~ 0⎕NINFO⍠1⊢ '*' Unbekanntes APL-Zeichen: ⍠ (U + 2360) Nicht-APL-Zeichen

@ A.Danischewski Welche APL verwenden Sie?
Adám

3
@ A.Danischewski Dyalog APL
Adám

2
@ A.Danischewski Speziell Version 15.0+, die kostenlos ist und über den von mir angegebenen Link heruntergeladen werden kann.
Adám


4

Ruby, 74 60 45 Bytes

Die Eingabe erfolgt in der Befehlszeile. Führen Sie sie wie folgt aus ruby f.rb 0 20. Funktioniert nur im aktuellen Verzeichnis.

-1 Byte beim Entpacken der ARGVVariablen und -13 Byte beim Ersetzen des selectund grepdurch eine festgelegte Subtraktion.

V3: -5 Bytes von der Verwendung einer Ersetzung für Dir.globin einer alten Ruby-Antwort auf eine andere Dateisystem-Herausforderung , wie von @PatrickOscity vorgeschlagen. -10 von der Erinnerung an einige Macken in Rubys String#nextFunktion.

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}

Erläuterung:

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

Versucht, Flipflops zu verwenden. Hat es nicht geschafft: P.


Das ist eine Funktion. Setzen Sie nach dem Schließen einfach Klammern mit den Argumenten }.
Ven

yep :-). Ich hoffe, mehr Leute zu sehen, die Perl 6 überall benutzen, sogar beim Golfen!
Ven

1

PHP, 64 Bytes

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

Laufen Sie so:

php -f golf.php 1 20

Hinweis:

  • Nur das aktuelle Verzeichnis.

  • Kein nachfolgender Zeilenumbruch in der Ausgabe.

  • Dies setzt <?=voraus, dass das in php.ini erlaubt ist. Was ich für Standard halte, bin mir aber nicht sicher.

Bash, 31 Bytes

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

Ausführen als a 1 20. Wieder nur das aktuelle Verzeichnis.

Kann ich zwei einreichen? Ich hoffe. Dies ist mein erster Beitrag zu Code Golf, daher bin ich mir der Etikette nicht sicher. Ich hoffe, ich zähle auch meine Bytes richtig.


3
Sie können mehrere Lösungen einreichen. Sofern es sich nicht um triviale Ableitungen handelt, sollte jede Lösung in einer separaten Antwort enthalten sein.
Mego

Sie sollten nur das erste Element jedes fehlenden Bereichs drucken, aber der PHP-Code sieht so aus, als würde er alle fehlenden Zahlen drucken. Ist das richtig?
Feersum

Ah, mein schlechtes. Ich habe es falsch verstanden und wollte nur die Ausgabe in die Frage bringen, ohne genug darin zu lesen. Soll ich meine Einreichung ablehnen?
Aprikosenjunge

1

Ich sehe jetzt, dass dies eine alte Frage ist, aber trotzdem gefällt es mir ...

PowerShell, 70 Byte

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

Führen Sie es als Skript über die Befehlszeile aus, z. B. \ misso.ps1 1 20.


0

PowerShell v4 +, 62 Byte

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

Speichern Sie es als Skript im gewünschten Verzeichnis und rufen Sie es lokal auf (siehe Beispiel unten). Nimmt Eingabe $xund$y einen Bereich ..und leitet diesen an einen Where-Object(den |?{...}) weiter, der im Grunde genommen ein Filter ist. Hier sind wir nur Elemente auswählen , wo das aktuelle Element $_ist -notindie .NameSammlung des aktuellen Verzeichnisses, aber das vorherige Element ist , -indass Sammlung (dh nur der Anfang eines fehlenden Bereichs).

Das lsist ein Alias ​​für Get-ChildItemund ist im Grunde das, was Sie erwarten würden. Benötigt v4 für die Kapselungsauswahl von .Name, sonst würden Sie benötigen $a=ls ".\"|select Name.

Beispiel

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

Ich hatte eine Erklärung und Screenshots, aber ich habe diese Version nicht gepostet und die Seite verlassen ... Entweder das oder ich habe die Antwort in einem zufälligen SO-Thread über den "besten Weg, ein Verzeichnis in Groovy zu statisieren" gepostet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.