En küçük dosyayı bul


19

Hedef:

Geçerli klasördeki en küçük dosyayı bulmak için bir program oluşturun.

  • Dosya boyutu bayt veya karakter olarak ölçülebilir.
  • Birden fazla dosya aynı boyuta sahipse, birini seçebilir veya tümünü görüntüleyebilirsiniz.
  • Klasörde en az bir dosya olacağını ve hiçbir dosyanın 0 boyutuna sahip olmayacağını varsayabilirsiniz.
  • Klasördeki tüm dosyaların kullandığınız dile göre yüklenebileceğini varsayın.

  • Geçerli dizinde klasör olmadığını varsayalım.

Giriş:

Program, aşağıdakiler dışında kullanıcıdan herhangi bir girdi almamalıdır:

  • Dilinizde "geçerli klasör" yoksa kullanıcıdan klasör adı / yolu istenebilir.
  • Diliniz bilgisayarınızdaki dosyalara doğrudan erişemiyorsa, kullanıcının dosya yüklemesine izin verebilir. (Örneğin JavaScript)

Çıktı:

En küçük dosyanın adı görüntülenmelidir.

  • Hangi dosyanın seçildiği açık olduğu sürece, öndeki / sondaki sembollere izin verilir.
  • (Tüm dosyaların bir listesini yazdırmak kurallara aykırıdır).

Notlar:

  • Standart Loophole'lara izin verilmez.
  • Sonucu değiştirmek için klasördeki dosyaları değiştiremez / oluşturamaz / silemezsiniz.
  • Bu ; en kısa cevap (bayt cinsinden) kazanır.

1
Dosyaların 0 boyutunda olabileceğini varsayabilir miyiz ?
Rɪᴋᴇʀ

Ayrıca, "klasördeki tüm dosyalara erişilebildiğini varsayalım" ne anlama geliyor? bu gizli dosyaların gösterilmesine gerek olmadığı anlamına mı geliyor?
Rɪᴋᴇʀ

2
Geçerli klasörde klasör olmadığını varsayabilir miyim? Sadece dosyalar yerine dosya ve klasörleri döndüren bir dil fonksiyonunuz varsa fark yaratır!
sergiol

1
Şart değil. Geçerli dizinin içinde hiçbir dizin bulunmadığını ve herhangi bir yanıtı geçersiz kılmadığını varsayabilirsiniz .
Dennis

1
(özür dilerim cevap vermedim, internet bağlantım birkaç günlüğüne kesildi) Gizli dosyaları atlamanıza izin vermemle ilgili sorun, çok fazla boşluk açıyor gibi görünüyor. "Erişilmesi biraz daha zor" dosyaları atlamanıza izin vermek, insanların yalnızca ilk 9 dosyayı kontrol etmek gibi bir şey yapabileceği anlamına gelir, çünkü birkaç bayt kaydeder.
12Me21

Yanıtlar:


7

Vim 12 bayt

!!ls -Sa
Gd{

Çevrimiçi deneyin!

Açıklama:

!!olan filtre komutu. Geçerli satırın içeriğini rasgele bir sistem komutuna bağlar ve çıktıyı arabelleğe geri gönderir. Bash'ı vim'den daha iyi olan şeyler için, örneğin !!revgeçerli satırı tersine çevirmek veya !Gxxdarabelleği alçaltmak için harici araçlar kullanmak yararlıdır . Bizim durumumuzda, arabellek boştur, bu yüzden :r!lskomutun çıktısını mevcut satıra besler.

Şimdi imleç satır 1'de ve son satır hariç her satırı silmek istiyoruz. Saf yaklaşım

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

Ama daha iyisini yapabiliriz. Ben açıklandığı gibi bu uç , {olabilir genellikle (ama her zaman değil) eşdeğer gg. Burada, daha da iyi. Hareket Çünkü karakter tabanlı değil, hat bazlı gibi gg, biz, öncelikle bir çizgi kadar gitmek zorunda bize bırakarak yok

Gd{

16

Bash + coreutils, 13 bayt

ls -Sar|sed q

Açıklama:

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.         

Bunu kendi cevabım olarak yayınladım, ama sanırım seninkine çok benziyor. ls -1Sa|tail -13 byte daha kısadır ve daha temiz çıktıya sahiptir.
orlp

@orlp teşekkürler! ..
Rɪᴋᴇʀ

1
'-1'e ihtiyacınız olduğunu düşünmüyorum, boru otomatik olarak her satıra bir dosya koyar.
GB

@EasterlyIrk Bence GB haklı. eğer lsçıkışın terminale olduğunu algılarsa, çıkışı birden çok sütuna biçimlendirir. Ancak çıktı bir boru ise, hat başına sadece 1 yapacaktır. Karşılaştırma lsvsls|cat
Dijital Travma

İki bayt daha kısa:ls -Sar|sed q
Digital Trauma

8

Python 2 3, 94 76 74 54 bayt

@Jonathan
Allan sayesinde -18 bayt teşekkürler @Jonathan Allan
sayesinde -20 bayt

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

print min(filter(path.isfile,listdir(".")),key=path.getsize)daha temiz ve çok daha kısadır.
orlp

"."Varsayılan olarak Python 3'e taşınan iki bayt kaydedin . print(min(filter(path.isfile,listdir()),key=path.getsize))
Jonathan Allan

Ayrıca 77 değil 76 sayıyorum.
Jonathan Allan

@JonathanAllan wcBana 1 byte daha fazla veren bayt sayımını ölçtüm
ovs

Fazla bayt, Python için gerekli olmayan bir son satırdan kaynaklanır. Ayrıca, meydan okuma, mevcut alt dizin olmadığını belirtmek için güncellendiğinden, tüm filterbit gereksizdir. Bu, Python 3'te de çalışmaz, çünkü printbir işlevdir. Aşağıdakiler işe yarayacak ve önemli ölçüde daha kısa olacaktır:print(min(listdir(),key=path.getsize))
Mego

8

PowerShell , 30 24 21 bayt

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

Çevrimiçi deneyin!

lsiçin bir takma addır Get-ChildItem. Bu sort-object, lengthözniteliğe bağlı olduğundan dosyalar boyutlarına göre sıralanır. Biz (...)[0]ilk (yani, en küçük) almak için endekslemek ve sonra bunları almak .Name. Örtük yoluyla çıktı Write-Output, program tamamlandığında olur.

Dizinde yalnızca dosyaların bulunduğu garanti edildiğinden 6 bayt kaydedildi. ConnorLSW sayesinde 3 ek tasarruf sağladı.


2
-fileŞu anki dizinde sadece dosyalar olduğundan beri kurtulamıyor musunuz?
Mutantoe

@Mutantoe Evet - bu cevabı gönderdikten sonra meydan okumaya düzenlendi. Teşekkürler!
AdmBorkBork

Kullanabileceğiniz sort le*powershell bunu kabul edecek çünkü bazı bayt tıraş için.
colsw

@ConnorLSW Evet, elbette. Teşekkürler!
AdmBorkBork

7

Yakut, 61 40 38 37 bayt

Teşekkürler GB ve Değerli Mürekkep

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

Kullanabilirsiniz ?. En küçük dosyayı almak için Dir.pwd ve min_by {} yerine. Dir.foreach(?.).min_by{|x|File.size x}38 baytta aynı sonucu alır.
GB

@GB teşekkürler!
dkudriavtsev

Çok Dir[?*]daha kısa olduğu gibi gizli Unix dosyalarını içermediğinden , dilin erişebileceği "tüm" dosyalara bakılması çok utanç verici..bash_profile ...
Value Ink

Belki Dir [? *, ".? *"] İşe yarayabilir. Denemedim. Ve daha kısa.
GB

@GB Aslında böyle olurdu Dir[?*,".*"]. Glob dizesi varsa .?*dosyayla eşleşmez .a.
Değer Mürekkebi

6

Mathematica, 35 bayt

FileNames[]~MinimalBy~FileByteCount

FileNames[]geçerli dizindeki tüm dosyaların (ve dizinlerin) adlarının bir listesini üretir; ~MinimalBy~FileByteCountbayt sayısı en küçük olan dosyanın adını seçer. FileByteCountdizinlere uygulandığında bir sürü hata atar, ancak hatalar programı raydan çıkarmaz.


6

Java 7, 149 142 bayt

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

Çevrimiçi deneyin!

CAD97 sayesinde -7 bayt


Sana Dosya :: uzunluk Dosya değil :: getTotalSpace istediğini düşünüyorum
CAD97

Test Edilmemiş Java 8: ()->java.utils.stream(new java.io.File(".").listFiles()).max((a,b)->a.length()-b.length).get().getName()104 bayt için
CAD97

@ CAD97 Haklısın! Ne düşünüyordum ...
Poke

6

SH (Linux / Unix) 15 14 13 14 bayt

ls -aS|tail -1

-S boyuta göre sıralar (azalan),

-rtail -1listedeki son dosyayı tersine çevirir ve çıktısını verir.

@ Dennis 1 bayt kaydettiğiniz için teşekkür ederiz @Dani_l 1 bayt kaydettiğiniz için teşekkür ederiz.


Bu en büyük dosyayı bulur , değil mi?
Dennis

Boşver, yorgunum. tailTersine çevirmek yerine kullanabilirsiniz , ve -1bunun için bir stenondur -n1.
Dennis

@Dennis Güncellendi
Abel Tom

@EasterlyIrk Şimdi olmalı :)
Abel Tom

@AbelTom cool, sabitlediğiniz için teşekkürler.
Rɪᴋᴇʀ

4

MATLAB / Oktav, 52 48 bayt

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

açıklama

Bu, geçerli dizindeki tüm dosya ve klasörleri kullanarak bir dizin listesi alır dir. Çıktısı dira, structo, vb bir dizin ya da değil, (bayt) boyutu olsun, dosya adını içeren

Daha sonra bayt her bir büyüklük dizisi alabilir [d.bytes]ve bir mantıksal bir dizin olsun veya olmasın göstermesi ile öğeye bölme işlemlerini ~[d.isdir]elde edecek Infbir dizin (sıfır ile bölme) ve aksi takdirde bayt boyutu (bölme ile nerede 1).

Bu dizinin minimum dizinini ikinci çıktısını kullanarak buluruz minve bunu ilk yapıya indekslemek ve adıd(n).name


disp(...)Düzgün yazdırmak için çıktının çevresine eklemelisiniz . Aksi takdirde, örneğin ansklasörde en küçük olmayan bir dosya olsaydı, çıktı hangi dosyanın MATLAB'a aşina olmayanlar için en küçük dosya olduğu konusunda net olmazdı.
Tom Carpenter

@TomCarpenter Hmmm "Tamam / sondaki sembollere izin verildiği sürece, hangi dosyanın seçildiği belli olduğu sürece" ans =
yorumunu yaptım

Ben sadece MATLAB örtük .(geçerli klasör) ve ..(yukarıdaki klasör) ekler , bu yüzden görünüyor dizin kontrolünü kaldıramadı fark ettim. Bunun için üzgünüm.
Tom Carpenter

4

Scala, 52 bayt

Eski versiyon, 79 bayt

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

Jaxad0127'nin tavsiyesine göre ayarlanmıştır. Şimdi sadece 52 bayt.

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

Uygula (0) yerine kafa kullanmak daha kısadır. Ayrıca, Dosya'nın toString yöntemi iyidir, get name'i çağırmaya gerek yoktur.
jaxad0127

4

Toplu, 43 39 35 bayt

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

Çıktı bir nedenle önde gelen bir alan içerir, ancak neyse ki buna izin verilir. Düzenleme: Şimdi 4 bayt kaydetmek için hiçbir dizin olduğunu varsayarsak.


Oh, / p'yi böyle kullanmak, zekice!
AdmBorkBork

@AdmBorkBork Ah, izin verildiğini fark etmemiştim, teşekkürler!
Neil

Hiçbir alt dizinin bulunmadığı garanti edilir (meydan okuma güncellendi) /a-d.
AdmBorkBork

4

Perl 6 ,  33 32 31  16 bayt

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

Dene

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

Dene

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

Dene

put dir.min: *.s

Dene

Expanded:

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

dirVarsayılan olarak işlev formu $*CWDve görev açıklaması herhangi bir klasör olmayacağını varsayabileceğinizi söyler, bu yüzden bunu kısaltabileceğinizi düşünüyorum dir.min(*.s).put.
smls

Bunu yazdığımda, programın klasörleri yoksayması gerektiğini söyledi.
Brad Gilbert b2gills

4

J , 21 20 bayt

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

@ Conor sayesinde bir bayt kaydetti .

açıklama

>{.,(/: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 Teşekkürler
mil

3

BATCH Dosyası, 77 72 63 bayt

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

headVeya öğesinin doğrudan eşdeğeri yoktailBATCH'de en azından bildiklerime , bu yüzden burada bir çözüm var. (@Neil'den çok yardım alarak - teşekkürler!)

dirKomut, /o-sazalan dosya boyutu tür ve /bçıkışa sadece dosya adları. FOR /FDeğişkeni Fher seferinde dosya adına ayarlayarak, döngüler arasında dolaşıyoruz . Sonunda, sadece sonuncusunu çıktı ECHO %F%.

Neil ve dizinlerin bulunmadığı garantileri sayesinde 9 bayt daha tasarruf etti.


1
Kişisel FORdeğişken iki ihtiyacı %bir komut işe s. Aksi takdirde, birkaç golf hilesi: 1. @ECHO OFFKısa komut dosyalarında kullanmayın , @her satıra ve sonrasına bir ekleyin DO. 2. Önceki boşluğu silin DO. 3. Komutta boşluk ve :s gerekmez dir.
Neil

1
@Neil Ack, teşekkürler. Üzgünüm, PowerShell yaptığımdan beri oldukça paslı ... Teşekkürler!
AdmBorkBork

3

PHP, 84 62 bayt

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

Soru, geçerli dizinde klasör olmayacağı varsayımıyla güncellendiğinden, dosya kontrol öğelerini kaldırabilir ve bu golfü başardım.


İşte benim eski cevabım:

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

Yapabileceğim en iyisi bu. Belki de kaçırmamın daha iyi bir yolu var.

$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 (kullanılıyor walk), 114 bayt

Yeni satırı yoksay:

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

Bu, geçerli dizinde ( __dirname) dolaşan bir yürüteç çağırır ve her dosya için stat işlevine sahip sbir işlevi n()ve gezintiye devam etmek için çağrılması gereken bir işlevi çağırır . Ardından, en endaz sizebulunan bayt cinsinden bir dosya adı yazdırır . s.size>m.sizedöner falsezaman m.sizeolduğu undefined, bu yüzden ilk callback'inde sonra, milk dosya bulundu eşittir ve normalde oradan devam eder.


2

R, 36 bayt

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

Açıklaması

file.info()data.framegeçerli dizindeki ( dir()) dosya / klasör listesinde kullanıldığında şuna benzer bir dosya / klasör adlarının karakter veya karakter vektörü verildiğinde "dosya bilgileri" ifadesini döndürür :

                                                               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

Daha sonra, sizesütunun (kullanılarak kısaltılmış olan dosyanın adını buluyoruz)$s ) en küçük olduğu . Sonuç olarak, en küçük boyuta sahip birden fazla dosya varsa, tümü döndürülür.

Bonus: Mevcut dizindeki klasörleri de göz ardı etmek istersek, şu durumlarda boyutu arayabiliriz isdir == FALSE: x=file.info(y<-dir());y[x$s==min(x$s[!x$i])]44 bayt olduğu ortaya çıkar.


Biraz geç ama file.sizedaha kısa çünkü daha $ssonra yapmak zorunda değilsiniz .
JAD


2

SmileBASIC, 110 bayt

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]

Yalnızca TXT:dosyalara bakar , çünkü DAT:boyutlarını zaten bilmiyorsanız dosyalar yüklenemez, bu da rastgele bir dosya yüklenmesini imkansız hale getirir.


Bir DAT: dosyayı nasıl yüklersiniz? Klasördeki her ad / dosya boyutunu kaba kuvvet uygulayabilir misiniz?
Pavel

3 boyutlu bir DAT:dosyayı 2 boyutlu bir diziye (örneğin) yüklemeye çalışmak hataya neden olur, bu yüzden onu zorlayamazsınız. Önceden, normalde yapacağınız boyut sayısını bilmeniz gerekir.
12Me21

DAT: 3 boyutlu diziye 2 boyutlu bir dosya yükleyebilir misiniz ? Sonra bir maksimum boyut dizisi oluşturabilirsiniz. Ve hiçbir şekilde hata yakalayamazsınız?
Pavel

Hayır, bu Tür uyumsuzluğuna neden olur. Ve hataları yakalamanın da bir yolu yok.
12Me21


1

C #, 277 bayt

En kısa değil, ama C #'dan ne beklersiniz?

golfed

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())]);}}

Ungolfed

//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 bayt

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

Geçerli dizindeki dosyaları dosya uzunluğuna göre sıralayan ve ardından ilk dosyayı seçen anonim bir işlevdir. pull .

Şöyle kullanın: main{ {ls""|sort key=fileLength|pull} }


Görünüşe göre aynı şekilde ls""çalışıyor ls".". Sanırım bundan bir bayt kaydedebilirsin
Kritixi Lithos

@KritixiLithos Öyle görünüyor. Teşekkürler!
fergusq

0

SmileBASIC 3, 105 bayt (rakip?)

Beats 12Me21 yanıtını ama yine DAT dosyaları yüklemek için yetersizlik muzdarip (şartlar dikkate alınarak disqualifying edilecek çok acımasız hissediyor.)

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]

Yukarıdaki daha kısa sürüm can sıkıcıdır ve her dosyayı yüklemenizi ister, ancak çalışır. İki bayt daha fazla bilgi istemini bastırabilirsiniz; 2. satırı buna değiştirin:

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

0

Toplu Dosya, 33 bayt

Toplu iş dosyaları bu sefer orta derecede rekabetçi, garip bir şekilde.

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

Çıktı

resim açıklamasını buraya girin


qÖnceki öğelerin oluşturulmasını durdurmanın bir yolunu bulundir/os/bÇalıştırılmadan ve çıktı dosyasını ayrı bir dizine koymanıza gerek kalmadan maksimum 6 bayt tasarruf edersiniz.

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

Her zaman qen küçük dosya olarak (başka bir 0 bayt dosya için bağlanmadığı sürece) çıktılar , çünkü dosya dir/b/oslistesini almadan önce boş bir dosya olarak oluşturulur .


0

C ++ 17 (gcc) , 180 bayt

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

Çevrimiçi deneyin!

Uygulayan yeni bir standart kitaplık gerektirir std::filesystem.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.