Temukan file terkecil


19

Tujuan:

Buat program untuk menemukan file terkecil di folder saat ini.

  • Ukuran file dapat diukur dalam byte atau karakter.
  • Jika beberapa file memiliki ukuran yang sama, Anda dapat memilih satu atau menampilkan semuanya.
  • Anda dapat mengasumsikan akan ada setidaknya satu file di folder, dan tidak ada file yang memiliki ukuran 0.
  • Asumsikan semua file dalam folder dapat dimuat oleh bahasa yang Anda gunakan.

  • Asumsikan bahwa tidak ada folder di direktori saat ini.

Memasukkan:

Program tidak boleh mengambil input apa pun dari pengguna, kecuali:

  • Jika bahasa Anda tidak memiliki "folder saat ini", ia mungkin menanyakan nama / jalur folder kepada pengguna.
  • Jika bahasa Anda tidak dapat secara langsung mengakses file di komputer Anda, itu memungkinkan pengguna untuk mengunggah file. (JavaScript, misalnya)

Keluaran:

Nama file terkecil harus ditampilkan.

  • Leading / trailing simbol diperbolehkan, selama jelas file mana yang telah dipilih.
  • (Mencetak daftar semua file melanggar aturan).

Catatan:

  • Celah Standar tidak diizinkan.
  • Anda tidak dapat memodifikasi / membuat / menghapus file di folder untuk mengubah hasilnya.
  • Ini adalah ; jawaban terpendek (dalam byte) menang.

1
Bisakah kita menganggap file dapat memiliki ukuran 0?
Rɪᴋᴇʀ

Juga, apa artinya "berasumsi bahwa semua file dalam folder dapat diakses"? apakah itu berarti file tersembunyi tidak perlu ditampilkan?
Rɪᴋᴇʀ

2
Dapatkah saya berasumsi tidak ada folder di folder saat ini? Itu membuat semua perbedaan jika Anda memiliki fungsi bahasa yang mengembalikan file dan folder bukan hanya file!
sergiol

1
Belum tentu. Anda dapat berasumsi bahwa tidak ada direktori di dalam direktori saat ini yang tidak ambigu dan tidak membatalkan jawaban apa pun.
Dennis

1
(maaf saya belum menjawab lebih cepat, koneksi internet saya turun selama beberapa hari) Masalah yang saya miliki dengan memungkinkan Anda untuk melewatkan file tersembunyi adalah tampaknya membuka banyak celah. Mengizinkan Anda melompati file yang "sedikit lebih sulit diakses" berarti orang dapat melakukan sesuatu seperti hanya memeriksa 9 file pertama karena menghemat beberapa byte.
12Me21

Jawaban:


7

Vim 12 byte

!!ls -Sa
Gd{

Cobalah online!

Penjelasan:

!!adalah perintah filter . Ini mengirimkan konten dari baris saat ini ke perintah sistem arbitrer, dan mengirimkan output kembali ke buffer. Ini berguna untuk menggunakan alat eksternal untuk hal-hal yang bash lebih baik daripada vim, misalnya !!revuntuk membalikkan garis saat ini, atau !Gxxduntuk hexdump buffer. Dalam kasus kami, buffer kosong sehingga setara dengan :r!ls, yang hanya mengumpankan output dari perintah ke baris saat ini.

Sekarang kursor ada di baris 1, dan kami ingin menghapus setiap baris kecuali yang terakhir. Pendekatan naif adalah

G       " Go to the last line
 k      " Go up one line
  d     " Delete:
   gg   "   Everything up to the first line

Tapi kita bisa berbuat lebih baik. Seperti yang saya jelaskan dalam tip ini , biasanya{ bisa (tetapi tidak selalu) setara dengan . Di sini, bahkan lebih baik. Karena gerakannya berbasis karakter , bukan berbasis garis seperti ini, kita tidak harus naik garis terlebih dahulu, meninggalkan kitagggg

Gd{

16

Bash + coreutils, 13 byte

ls -Sar|sed q

Penjelasan:

ls -Sar|sed q
ls            # list files
   -S         # sorted, biggest first
     a        # show hidden files
      r       # reversed (smallest first)
       |sed q # q is quit at first line that matches given regex, 
              # given regex is empty so guaranteed match.         

Diposting ini sebagai jawaban saya sendiri, tetapi saya pikir ini terlalu mirip dengan jawaban Anda. ls -1Sa|tail -1lebih pendek 3 byte dan memiliki output yang lebih bersih.
orlp

@ orl, terima kasih! ..
R

1
Saya tidak berpikir Anda memerlukan '-1', pipa secara otomatis menempatkan satu file per baris.
GB

@ EasterlyIrk saya pikir GB benar. jika lsmendeteksi keluaran ke terminal, ia akan memformat keluaran menjadi beberapa kolom. Tetapi jika output adalah pipa, itu hanya akan melakukan 1 per baris. Bandingkan lsvsls|cat
Digital Trauma

Dua byte lebih pendek:ls -Sar|sed q
Trauma Digital

8

Python 2 3, 94 76 74 54 byte

-18 byte terima kasih kepada @orlp
-2 byte terima kasih kepada @Jonathan Allan
-20 byte berkat perubahan dalam spesifikasi tantangan

from os import*
print(min(listdir(),key=path.getsize))

print min(filter(path.isfile,listdir(".")),key=path.getsize)lebih bersih dan jauh lebih pendek.
orlp

Simpan dua byte pindah ke Python 3 karena "."ini adalah default. print(min(filter(path.isfile,listdir()),key=path.getsize))
Jonathan Allan

Saya juga menghitung 76 bukan 77.
Jonathan Allan

@ Jonathan Allan Saya mengukur jumlah hitungan byte wcyang memberi saya 1 byte lebih banyak
ovs

Byte asing akan disebabkan oleh baris baru yang tertinggal, yang tidak diperlukan untuk Python. Selain itu, karena tantangan telah diperbarui untuk menyatakan bahwa tidak ada subdirektori yang hadir, keseluruhan filterbit tidak diperlukan. Ini juga tidak berfungsi di Python 3, karena printmerupakan fungsi. Yang berikut ini akan berfungsi, dan jauh lebih singkat:print(min(listdir(),key=path.getsize))
Mego

8

PowerShell , 30 24 21 byte

(ls|sort le*)[0].Name

Cobalah online!

lsadalah alias untuk Get-ChildItem. Itu disalurkan ke sort-objectdengan lengthatribut, sehingga file diurutkan berdasarkan ukuran. Kami mengindeks dengan yang (...)[0]untuk mendapatkan yang pertama (yaitu, terkecil), dan kemudian mengambilnya .Name. Output melalui implisit Write-Outputterjadi pada penyelesaian program.

Disimpan 6 byte karena kami dijamin hanya file yang ada di direktori. Menyimpan 3 tambahan berkat ConnorLSW.


2
Tidak bisakah Anda menyingkirkan -filekarena hanya file yang ada di direktori saat ini?
Mutantoe

@Mutantoe Ya - itu diedit menjadi tantangan setelah saya memposting jawaban ini. Terima kasih!
AdmBorkBork

Anda dapat menggunakan sort le*untuk mencukur beberapa byte karena PowerShell akan menerimanya.
colsw

@ConnorLSW Ya, tentu saja. Terima kasih!
AdmBorkBork

7

Ruby, 61 40 38 37 byte

Terima kasih GB dan Value Ink

p Dir[?*,".*"].min_by{|x|File.size x}

Kamu bisa memakai ?. alih-alih Dir.pwd, dan min_by {} untuk mendapatkan file terkecil. Dir.foreach(?.).min_by{|x|File.size x}mendapat hasil yang sama dalam 38 byte.
GB

@GB Terima kasih!
dkudriavtsev

Sayang sekali bahwa "semua" file yang dapat diakses oleh bahasa harus dilihat, karena Dir[?*]jauh lebih pendek tetapi tidak termasuk file Unix tersembunyi seperti .bash_profile...
Value Ink

Mungkin Dir [? *, ".? *"] Bisa bekerja. Saya belum mencoba. Dan itu lebih pendek.
GB

@ GB Sebenarnya Dir[?*,".*"]. String global .?*tidak akan cocok dengan file .ajika ada.
Nilai Tinta

6

Mathematica, 35 byte

FileNames[]~MinimalBy~FileByteCount

FileNames[]menghasilkan daftar nama semua file (dan direktori) di direktori saat ini; ~MinimalBy~FileByteCountmemilih nama file dengan jumlah byte terkecil. FileByteCountmelempar banyak kesalahan ketika diterapkan ke direktori, tetapi kesalahan tidak menggagalkan program.


6

Java 7, 149 142 byte

String f(){String n="";long s=-1>>>1,p;for(java.io.File f:new java.io.File(".").listFiles())if((p=f.length())<s){n=f.getName();s=p;}return n;}

Cobalah online!

-7 byte berkat CAD97


Saya pikir Anda ingin File :: panjang tidak Berkas :: getTotalSpace
CAD97

Java 8 yang belum diuji: ()->java.utils.stream(new java.io.File(".").listFiles()).max((a,b)->a.length()-b.length).get().getName()untuk 104 byte
CAD97

@ CAD97 Kamu benar! Apa yang saya pikirkan ...
Poke

6

SH (Linux / Unix) 15 14 13 14 byte

ls -aS|tail -1

-S mengurutkan berdasarkan ukuran (turun),

-rmembalikkan dan tail -1menampilkan file terakhir dalam daftar.

@ Dennis Terima kasih telah menyimpan 1 byte @Dani_l Terima kasih telah menyimpan 1 byte.


Itu menemukan file terbesar , bukan?
Dennis

Tidak apa-apa, saya lelah. Anda bisa menggunakan, tailalih-alih membalikkan, dan -1merupakan singkatan untuk -n1.
Dennis

@Dennis Diperbarui
Abel Tom

@EasterlyIrk Sekarang seharusnya :)
Abel Tom

@AbelTom keren, terima kasih sudah memperbaikinya.
Rɪᴋᴇʀ

4

MATLAB / Oktaf, 52 48 byte

d=dir;[~,n]=min([d.bytes]./~[d.isdir]);d(n).name

Penjelasan

Ini mendapatkan daftar direktori dari semua file dan folder di direktori saat ini menggunakan dir. Output daridir adalah structberisi nama file, apakah itu direktori atau tidak, ukuran (dalam byte), dll.

Kita kemudian dapat mengambil array ukuran masing-masing dalam byte [d.bytes]dan melakukan pembagian elemen dengan boolean yang menunjukkan apakah itu direktori atau tidak~[d.isdir] yang akan menghasilkan di Infmana itu direktori (pembagian dengan nol) dan ukuran dalam byte jika tidak (pembagian oleh 1).

Kami menemukan indeks minimum array ini menggunakan output kedua mindan menggunakannya untuk mengindeks ke struct awal dan menampilkan nama dengand(n).name


Anda harus menambahkan disp(...)sekitar output untuk mencetaknya dengan benar. Kalau tidak, jika misalnya ada file yang disebut ansbukan yang terkecil di folder, hasilnya tidak akan jelas untuk file mana yang terkecil bagi siapa pun yang tidak terbiasa dengan MATLAB.
Tom Carpenter

@TomCarpenter Hmmm Saya menafsirkan "Leading / trailing simbol diperbolehkan, selama itu jelas file mana yang telah dipilih" yang berarti tidak apa- ans = apa
Suever

Saya baru sadar MATLAB menambahkan implisit .(folder saat ini) dan ..(folder di atas), jadi jangan hapus direktori periksa sepertinya. Maaf soal itu.
Tom Carpenter

4

Scala, 52 byte

Versi lama, 79 byte

new java.io.File(".").listFiles.map(a=>a.getName->a.length)sortBy(_._2)apply(0)

Disesuaikan sesuai dengan saran jaxad0127. Sekarang hanya 52 byte.

new java.io.File(".").listFiles.sortBy(_.length)head

Menggunakan kepala alih-alih menerapkan (0) lebih pendek. Juga, metode toString dari File baik-baik saja, tidak perlu memanggil nama get.
jaxad0127

4

Batch, 43 39 35 byte

@dir/b/os|(set/pf=&call echo %%f%%)

Keluaran mencakup ruang terkemuka untuk beberapa alasan, tetapi untungnya itu diizinkan. Sunting: Sekarang dengan asumsi tidak ada direktori untuk menyimpan 4 byte.


Oh, menggunakan / p seperti itu, pintar dang!
AdmBorkBork

@ AdmBorkBork Ah, saya tidak memperhatikan bahwa itu diizinkan, terima kasih!
Neil

Anda dijamin tidak ada subdirektori (tantangannya diperbarui) sehingga Anda dapat menghilangkannya /a-d.
AdmBorkBork

4

Perl 6 ,  33 32 31  16 byte

'.'.IO.dir.grep(*.f).min(*.s).put

Cobalah

put '.'.IO.dir.min:{try .s//Inf}

Cobalah

put $*CWD.dir.min:{try .s//Inf}

Cobalah

put dir.min: *.s

Cobalah

Diperluas:

put        # print with trailing newline
dir        # the list of files in the current directory
.min:      # find the minimum by
  *.s      # calling the `s` method (size) in a Whatever lambda

Bentuk fungsi dari dirdefault adalah $*CWD, dan deskripsi tugas mengatakan Anda dapat berasumsi tidak akan ada folder, jadi saya pikir Anda dapat mempersingkat menjadi dir.min(*.s).put.
smls

Ketika saya menulis ini, katanya program harus mengabaikan folder.
Brad Gilbert b2gills

4

J , 21 20 byte

>{.,(/:2&{"1)1!:0'*'

Menyimpan satu byte berkat @ Conor .

Penjelasan

>{.,(/:2&{"1)1!:0'*'
                 '*' Glob all files in current directory
             1!:0    Table of file metadata in that directory
       2&{"1         Get the file size of each
     /:              Sort the files by that
   ,                 Flatten
 {.                  Get the first value
>                    Unbox

@ ConorO'Brien Terima kasih
mil

3

BATCH File, 77 72 63 byte

@FOR /F "tokens=*" %%G IN ('dir/o-s/b') DO @SET F=%%G
@ECHO %F%

Tidak ada yang setara langsung dengan headatau taildi BATCH, setidak-tidaknya setahu saya, jadi inilah cara penyelesaiannya. (dengan banyak bantuan dari @Neil - terima kasih!)

The dirperintah, dengan /o-ske semacam di turun ukuran file, dan /boutput hanya nama file. Kami mengulanginya dengan FOR /F, mengatur variabel Fke nama file setiap kali. Akhirnya, kami hanya menampilkan yang terakhir denganECHO %F% .

Disimpan 9 byte lebih banyak berkat Neil dan terima kasih untuk jaminan bahwa tidak ada direktori.


1
FORVariabel Anda membutuhkan dua %s untuk berfungsi dalam skrip. Jika tidak, beberapa trik bermain golf: 1. Jangan gunakan @ECHO OFFpada skrip pendek, tambahkan a @untuk setiap baris dan setelah DO. 2. Hapus spasi sebelumnya DO. 3. Spasi dan :s tidak diperlukan dalam dirperintah.
Neil

1
@Neil Ack, terima kasih. Maaf, cukup berkarat karena saya sudah melakukan PowerShell ... Terima kasih!
AdmBorkBork

3

PHP, 84 62 byte

$t=array_map(filesize,$g=glob('*'));asort($t);echo$g[key($t)];

Karena pertanyaan telah diperbarui dengan asumsi bahwa tidak akan ada folder di direktori saat ini, saya dapat menghapus hal-hal pemeriksaan file dan menurunkan ini.


Ini jawaban lama saya:

$t=array_map(filesize,$g=array_filter(glob('*'),is_file));asort($t);echo$g[key($t)];

Ini yang terbaik yang bisa saya lakukan. Mungkin ada cara yang lebih baik saya hilang.

$t=array_map(              # visit each array element and...
    filesize,              # map each filename to its filesize...
    $g=array_filter(       # using an array of...
        glob('*'),         # all files and directories...
        is_file            # filtered by files...
    )                      # 
);                         # 
asort($t);                 # sort the array of filesizes, then...
echo$g[key($t)];           # print element from the array of files using the first key of the sorted array as an index

2

Node.js (menggunakan walk), 114 byte

Abaikan baris baru:

require('walk').walk(__dirname).on('file',(r,s,n)=>
(m=s.size>m.size?m:s,n()),m=0).on('end',_=>console.log(m.name))

Ini memanggil walker yang melintasi direktori saat ini ( __dirname) dan untuk setiap file memanggil fungsi dengan statnya sdan fungsi berikutnya n()yang harus dipanggil untuk melanjutkan traversal. Kemudian pada end, ia mencetak nama file dengan minimum sizedalam byte yang ditemukan. s.size>m.sizekembali falseketika m.sizeadalah undefined, sehingga setelah callback pertama, madalah sama dengan file pertama ditemukan, dan terus dari sana biasanya.


2

R, 36 byte

x=file.info(y<-dir())$s;y[x==min(x)]

Dijelaskan

file.info()mengembalikan data.frame"informasi file" ketika diberi karakter atau vektor karakter dari nama file / folder yang ketika digunakan pada daftar file / folder di direktori saat ini ( dir()), terlihat seperti:

                                                               size isdir mode               mtime               ctime               atime exe
Polyspace_Workspace                                               0  TRUE  777 2014-11-28 17:29:25 2014-11-28 17:29:25 2014-11-28 17:29:25  no
Python Scripts                                                    0  TRUE  777 2016-03-21 23:59:41 2016-03-21 23:59:41 2016-03-21 23:59:41  no
R                                                                 0  TRUE  777 2015-12-23 20:11:02 2015-12-23 20:11:02 2015-12-23 20:11:02  no
Rockstar Games                                                    0  TRUE  777 2015-04-14 12:23:05 2015-04-14 12:23:03 2015-04-14 12:23:05  no
TrackmaniaTurbo                                                   0  TRUE  777 2016-03-24 17:15:05 2016-03-24 13:13:48 2016-03-24 17:15:05  no
ts3_clientui-win64-1394624943-2014-06-11 03_18_47.004772.dmp 314197 FALSE  666 2014-06-11 02:18:47 2014-06-11 02:18:47 2014-06-11 02:18:47  no

Selanjutnya kita baru saja menemukan nama file yang sizekolomnya (disingkat menggunakan$s ) adalah yang terkecil. Akibatnya, jika ada lebih dari satu file dengan ukuran terkecil, semua akan dikembalikan.

Bonus: jika kita juga ingin mengabaikan folder di direktori saat ini kita bisa mencari ukuran kapan isdir == FALSE: x=file.info(y<-dir());y[x$s==min(x$s[!x$i])]yang ternyata 44 byte.


Agak terlambat, tetapi file.sizelebih pendek karena Anda tidak harus melakukannya $ssesudahnya.
JAD


2

SmileBASIC, 110 byte

DIM F$[0]FILES"TXT:",F$FOR I=0TO LEN(F$)-1F$[I][0]="TXT:
S=LEN(LOAD(F$[I],0))IF!Z||S<Z THEN Z=S:B=I
NEXT?F$[B]

Hanya melihat TXT:file, karena DAT:file tidak dapat dimuat kecuali Anda sudah tahu ukurannya, sehingga tidak mungkin memuat file secara acak.


Bagaimana cara Anda memuat DAT: file? Bisakah Anda memaksa setiap nama / ukuran file dalam folder?
Pavel

Mencoba memuat file 3 dimensi DAT:ke dalam array 2 dimensi (misalnya) akan menyebabkan kesalahan, jadi Anda tidak dapat dengan paksa memaksanya. Anda hanya perlu mengetahui jumlah dimensi sebelumnya, yang biasanya Anda lakukan.
12Me21

Bisakah Anda memuat file 2-d DAT: ke array 3-d? Kemudian Anda bisa membuat array ukuran maksimum. Dan Anda tidak dapat menangkap kesalahan dengan cara apa pun?
Pavel

Tidak, itu akan menyebabkan kesalahan Ketidakcocokan Jenis. Dan tidak ada cara untuk menangkap kesalahan juga.
12Me21


1

C #, 277 byte

Bukan yang terpendek, tapi apa yang Anda harapkan dari C #?

Golf

using System.Linq;using static System.IO.Directory;class P{static void Main(){var x=GetFiles(GetCurrentDirectory());var d=new long[]{}.ToList();foreach(var s in x){var b=new System.IO.FileInfo(s).Length;if(!d.Contains(b))d.Add(b);}System.Console.Write(x[d.IndexOf(d.Min())]);}}

Tidak disatukan

//Linq using for List.Min()
using System.Linq;
//Static using to save bytes on GetCurrentDirectory() and GetFiles()
using static System.IO.Directory;

class P
{
    static void Main()
    {
        //String array containing file paths
        var x = GetFiles(GetCurrentDirectory());
        //Creating a Long array and converting it to a list, less bytes than "new System.Collections.Generic.List<long>()"
        var d = new long[] { }.ToList();
        foreach (var s in x) //Loop through all file paths
        {
            //Getting file size in bytes
            var b = new System.IO.FileInfo(s).Length;
            if (!d.Contains(b))
                //If there isn't already a file with this size in our List, add the file path to list
                d.Add(b);

        }
        //Get index of the smallest Long in our List, which is also the index of the file path to the smallest file, then write that path
        System.Console.Write(x[d.IndexOf(d.Min())]);
    }
}

1

Röda , 32 31 byte

{ls""|sort key=fileLength|pull}

Ini adalah fungsi anonim yang mengurutkan file dalam direktori saat ini berdasarkan panjang file dan memilih file pertama pull.

Gunakan seperti ini: main{ {ls""|sort key=fileLength|pull} }


Tampaknya ls""berfungsi dengan baik ls".". Saya pikir Anda dapat menyimpan byte dari itu
Kritixi Lithos

@KritixiLithos Sepertinya. Terima kasih!
fergusq

0

SmileBASIC 3, 105 byte (bersaing?)

Mengalahkan jawaban 12Me21 tetapi masih menderita ketidakmampuan untuk memuat file DAT (yang terasa sangat kejam untuk didiskualifikasi mengingat keadaan.)

DIM F$[0],T[0]FILES"TXT:",F$FOR I=0TO LEN(F$)-1F$[I][0]="TXT:
PUSH T,LEN(LOAD(F$[I]))NEXT
SORT T,F$?F$[0]

Versi pendek di atas menjengkelkan dan meminta Anda pada setiap file untuk memuat, tetapi itu berhasil. Untuk dua byte lebih, Anda dapat menekan prompt; ubah baris 2 menjadi ini:

PUSH T,LEN(LOAD(F$[I],0))NEXT

0

File Batch, 33 byte

File batch cukup kompetitif kali ini, anehnya.

@dir/os/b>..\q&set/pa=<..\q&"%a%.

Keluaran

masukkan deskripsi gambar di sini


Temukan cara untuk menghentikan pembuatan qsebelum dir/os/bdijalankan dan Anda akan menyimpan maksimum 6 byte dengan tidak perlu meletakkan file output di direktori yang terpisah.

@dir/os/b>q&set/pa=<q&"%a%

Akan selalu menampilkan qsebagai file terkecil (kecuali terikat untuk file 0 byte lainnya) karena dibuat sebagai file kosong sebelum dir/b/osmengumpulkan daftar file.


0

C ++ 17 (gcc) , 180 byte

#include<filesystem>
using namespace std::filesystem;auto f(){std::error_code e;path r;size_t m=-1,s;for(auto&p:directory_iterator(".")){s=file_size(p,e);if(s<m)m=s,r=p;}return r;}

Cobalah online!

Membutuhkan pustaka standar terbaru yang mengimplementasikan std::filesystem.


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.