Deteksi Urutan Integer Hilang - Filesystem


8

Tantangannya adalah untuk mendeteksi urutan bilangan bulat dari file atau direktori yang hilang. Anda memiliki direktori yang diisi dengan file / direktori yang dinamai integer.

File / direktori dihasilkan dari banyak utas namun pekerjaan tidak selesai - karena itu ada kesenjangan dalam urutan.

Inputnya adalah dua bilangan bulat, awal dan akhir, dan tugas Anda mendeteksi bilangan bulat mulai dari urutan yang hilang berikutnya. Anda dapat menganggap bahwa semua file dan direktori dalam direktori di mana run hanya memiliki file atau direktori bernama integer.

Formulir jawaban yang dapat diterima: fungsi, cuplikan kode - harus dijalankan di baris perintah.
Input awal / akhir yang dapat diterima: termasuk pada baris perintah, variabel env / argv baik-baik saja , parameter berfungsi, input pengguna baik-baik saja .
Kode terpendek menang.

Pembaruan - Meskipun saya berhasil memeras yang ini, ada banyak jawaban menarik. Gagasan dalam jawaban Bash apricotboy digunakan sebagian untuk membantu saya mendesain jawaban Byte Bash 35 Byte saya. Semoga sukses untuk yang berikutnya.

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
Ini benar-benar tantangan bunglon - persyaratan untuk mengambil input sebagai nama file dan / atau direktori membuat tantangan ini lebih banyak tentang bekerja dengan sistem file daripada benar-benar mengisi lubang.
Mego

14
Anda semua mengeluh terlalu banyak setiap kali ada tantangan yang membutuhkan fungsi selain mengocok bilangan bulat atau string di sekitar.
feersum

3
@feersum Kami mengeluh ketika tantangan sewenang-wenang membutuhkan fungsionalitas tambahan (seperti filesystem I / O) yang tidak menambahkan apa pun ke tantangan yang sebenarnya.
Mego

4
@feersum Bagaimana menemukan bilangan bulat yang hilang secara berurutan terkait dengan mencari file di direktori?
Leaky Nun

Jawaban:


5

Python 2, 101 byte

2 byte berkat @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

Saya mendeteksi 2 spasi tambahan setelah Anda import osyang harus Anda keluarkan.
Nilai Tinta

@ KevinLau-notKenny Terima kasih.
Leaky Nun

Saya pikir if~-n!=t:bisa if~t+n:.
xnor

4

Dyalog APL , 25 24 atau 36 byte

Anjuran untuk batas bawah, lalu batas atas.

Tampaknya dari komentar hingga jawaban lain bahwa OP menginginkan sekuens sesingkat mungkin.

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

{
    ⍵/⍨yang
    ~tidak benar
    ⍵∊⍨bahwa himpunan berisi
    ⍵-1pendahulunya
}dari
(
    (⍳⎕)bilangan bulat sampai n
    ~ kecuali
    ⍳⎕-1bilangan bulat sampai n -1
)~kecuali
⍎¨evaluasi dari masing-masing
⎕SH'dir/b'daftar nama kosong di direktori saat ini


Jawaban lama yang mengembalikan urutan panjang-1:

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

(
    representasi string
    ¨dari masing-masing
    (⍳⎕)bilangan bulat sampai n
    ~ kecuali
    ⍳⎕-1bilangan bulat sampai n -1
)~kecuali
⎕SH'dir/b'daftar telanjang file dalam direktori saat ini

Hanya berfungsi di Windows. Solusi lintas platform:

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

0hanya nama file
⎕NINFOdari file Native (s) INFOrmation
⍠1menggunakan wildcard
⊢'*'pada semua file


Saya mendapatkan (⍕¨ (⍳⎕) ~ ⍳⎕-1) ~ 0⎕NINFO⍠1⊢ '*' Karakter APL tidak dikenal: ⍠ (U + 2360) Karakter Non-APL

@ A.Danischewski APL mana yang Anda gunakan?
Adám

3
@ A.Danischewski Dyalog APL
Adám

2
@ A.Danischewski Khususnya versi 15.0+, yang gratis, dan dapat diunduh dengan tautan yang saya berikan.
Adám


4

Ruby, 74 60 45 byte

Input ada di baris perintah, jalankan seperti ruby f.rb 0 20. Hanya berfungsi di direktori saat ini.

-1 byte dari membongkar ARGVvariabel ke dalam, dan -13 byte dari mengganti selectdan grepdengan set pengurangan.

V3: -5 byte dari menggunakan substitusi Dir.globdalam jawaban Ruby lama untuk tantangan filesystem lain , seperti yang disarankan oleh @PatrickOscity. -10 dari mengingat beberapa kebiasaan dalam String#nextfungsi Ruby .

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

4

Perl 6, 47 byte

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

Penjelasan:

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

Mencoba menggunakan sandal jepit. Tidak berhasil: P.


ini sebuah fungsi. cukup beri tanda kurung dengan argumen setelah penutupan }.
Ven

ya :-). berharap dapat melihat lebih banyak orang menggunakan Perl 6 di mana-mana, bahkan dalam bermain golf!
Ven

1

PHP, 64 byte

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

Jalankan seperti ini:

php -f golf.php 1 20

catatan:

  • Hanya direktori saat ini.

  • Tidak ada garis akhir pada output.

  • Ini mengharuskan <?=untuk diizinkan di php.ini. Yang saya pikir adalah default tetapi saya tidak yakin.

Bash, 31 byte

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

Jalankan sebagai a 1 20. Sekali lagi, hanya direktori saat ini.

Bisakah saya mengirim dua? Semoga saja. Ini adalah posting pertama saya ke Code Golf jadi saya tidak terlalu yakin dengan etiketnya. Saya harap saya menghitung byte saya dengan benar juga.


3
Anda dapat mengirimkan beberapa solusi, tetapi kecuali mereka merupakan turunan sepele dari satu sama lain, masing-masing solusi harus dalam jawaban yang terpisah.
Mego

Anda seharusnya hanya mencetak elemen pertama dari setiap rentang yang hilang, tetapi kode PHP sepertinya akan mencetak semua angka yang hilang, apakah ini benar?
feersum

Ah, salahku. Saya salah paham dan hanya bertujuan untuk mendapatkan hasil dalam pertanyaan, tanpa cukup membacanya. Haruskah saya menurunkan kiriman saya?
Apricot boy

1

Saya melihat sekarang ini adalah pertanyaan lama, tapi tetap saja, saya menyukainya ...

PowerShell, 70 byte

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

Jalankan sebagai skrip dari baris perintah, mis. \ Misso.ps1 1 20.


0

PowerShell v4 +, 62 byte

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

Simpan sebagai skrip di direktori yang diinginkan dan panggil secara lokal (lihat contoh di bawah). Mengambil input $xdan $ydan membangun rentang .., lalu mengirimkannya ke Where-Object(yang |?{...}) yang pada dasarnya adalah filter. Di sini kita hanya memilih item mana elemen saat $_ini -notinyang .Namekoleksi direktori saat ini, tetapi elemen sebelumnya adalah -inbahwa pengumpulan (yaitu, hanya awal dari serangkaian hilang).

Ini lsadalah alias untuk Get-ChildItemdan pada dasarnya adalah apa yang Anda harapkan. Membutuhkan v4 untuk enkapsulasi-pilih .Name, jika tidak Anda akan perlu $a=ls ".\"|select Name.

Contoh

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 byte

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

Saya punya penjelasan dan tangkapan layar, tetapi saya tidak memposting versi itu dan meninggalkan halaman ... Entah itu atau saya memposting jawaban ke utas SO acak tentang "cara terbaik untuk membuat direktori di Groovy".

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.