Znajdź najmniejszy plik


19

Cel:

Utwórz program, aby znaleźć najmniejszy plik w bieżącym folderze.

  • Rozmiar pliku może być mierzony w bajtach lub znakach.
  • Jeśli wiele plików ma ten sam rozmiar, możesz wybrać jeden lub wyświetlić wszystkie.
  • Możesz założyć, że w folderze będzie co najmniej jeden plik i żaden plik nie będzie miał rozmiaru 0.
  • Załóżmy, że wszystkie pliki w folderze można załadować według używanego języka.

  • Załóżmy, że w bieżącym katalogu nie ma folderów.

Wejście:

Program nie powinien pobierać żadnych danych od użytkownika, chyba że:

  • Jeśli twój język nie ma „bieżącego folderu”, może poprosić użytkownika o nazwę / ścieżkę folderu.
  • Jeśli twój język nie może uzyskać bezpośredniego dostępu do plików na twoim komputerze, może zezwolić użytkownikowi na przesyłanie plików. (Na przykład JavaScript)

Wynik:

Powinna zostać wyświetlona nazwa najmniejszego pliku.

  • Dopuszczalne są symbole wiodące / końcowe, o ile wiadomo, który plik został wybrany.
  • (Drukowanie listy wszystkich plików jest niezgodne z regułami).

Uwagi:

  • Standardowe luki są niedozwolone.
  • Nie można modyfikować / tworzyć / usuwać plików w folderze, aby zmienić wynik.
  • To jest ; najkrótsza odpowiedź (w bajtach) wygrywa.

1
Czy możemy założyć, że pliki mogą mieć rozmiar 0?
Rɪᴋᴇʀ

Co również oznacza „zakładając, że można uzyskać dostęp do wszystkich plików w folderze”? czy to oznacza, że ​​ukryte pliki nie muszą być pokazywane?
Rɪᴋᴇʀ

2
Czy mogę założyć, że w bieżącym folderze nie ma folderów? To robi różnicę, jeśli masz funkcję języka, która zwraca zarówno pliki, jak i foldery zamiast samych plików!
sergiol

1
Niekoniecznie. Możesz założyć, że w bieżącym katalogu nie ma żadnych katalogów, co jest jednoznaczne i nie unieważnia żadnych odpowiedzi.
Dennis

1
(przepraszam, że nie odpowiedziałem wcześniej, moje połączenie internetowe nie działało przez kilka dni) Problem z pomijaniem ukrytych plików polega na tym, że wydaje się, że powoduje wiele luk. Umożliwienie pomijania plików, do których „dostęp jest nieco trudniejszy” oznaczałoby, że ludzie mogliby zrobić coś takiego jak sprawdzenie tylko pierwszych 9 plików, ponieważ oszczędza to kilka bajtów.
12Me21

Odpowiedzi:


7

Vim 12 bajtów

!!ls -Sa
Gd{

Wypróbuj online!

Wyjaśnienie:

!!to polecenie filtru . Potokuje zawartość bieżącego wiersza do dowolnego polecenia systemowego i wysyła dane wyjściowe z powrotem do bufora. Jest to przydatne do używania zewnętrznych narzędzi do rzeczy, w których bash jest lepszy niż vim, na przykład !!revdo odwrócenia bieżącej linii lub !Gxxddo heksdumpa bufora. W naszym przypadku bufor jest pusty, więc jest równoważny z :r!ls, który po prostu podaje dane wyjściowe polecenia do bieżącego wiersza.

Teraz kursor znajduje się na linii 1 i chcemy usunąć każdą linię oprócz ostatniej. Naiwnym podejściem jest

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

Ale możemy zrobić lepiej. Jak wyjaśniłem w tym poradniku , zwykle{ może (ale nie zawsze) być równoważne . Tutaj jest jeszcze lepiej. Ponieważ ruch jest znakowym , a nie linia oparte jak jest, nie musimy iść w górę linię pierwszy, zostawiając nas zgggg

Gd{

16

Bash + coreutils, 13 bajtów

ls -Sar|sed q

Wyjaśnienie:

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.         

Wysłałem to jako własną odpowiedź, ale myślę, że jest zbyt podobne do twojej. ls -1Sa|tail -1jest 3 bajty krótszy i ma czystszy wynik.
orlp

@orlp dzięki! ..
Rɪᴋᴇʀ

1
Nie sądzę, żebyś potrzebował „-1”, potok automatycznie umieszcza jeden plik w linii.
GB

@EasterlyIrk Myślę, że GB ma rację. jeśli lswykryje wyjście do terminala, sformatuje dane wyjściowe w wiele kolumn. Ale jeśli wyjście jest potokiem, wykona tylko 1 na linię. Porównaj lsvsls|cat
Digital Trauma

Dwa bajty krótsze:ls -Sar|sed q
Cyfrowy uraz

8

Python 2 3, 94 76 74 54 bajtów

-18 bajtów dzięki @orlp
-2 bajtów dzięki @Jathanathan Allan
-20 bajtów dzięki zmianie specyfikacji wyzwania

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

print min(filter(path.isfile,listdir(".")),key=path.getsize)jest czystszy i znacznie krótszy.
orlp

Zaoszczędź dwa bajty przechodząc do Pythona 3, ponieważ "."jest to ustawienie domyślne. print(min(filter(path.isfile,listdir()),key=path.getsize))
Jonathan Allan

Również liczę 76, a nie 77.
Jonathan Allan

@JonathanAllan Zmierzyłem liczbę bajtów, dzięki wcczemu otrzymałem 1 bajt więcej
dniu

Zewnętrzny bajt byłby spowodowany końcowym znakiem nowej linii, który nie jest wymagany w Pythonie. Ponadto, ponieważ wyzwanie zostało zaktualizowane, aby stwierdzić, że nie ma żadnych podkatalogów, cały filterbit jest niepotrzebny. To również nie działa w Pythonie 3, ponieważ printjest funkcją. Następujące elementy działałyby i były znacznie krótsze:print(min(listdir(),key=path.getsize))
Mego

8

PowerShell , 30 24 21 bajtów

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

Wypróbuj online!

lsjest pseudonimem dla Get-ChildItem. Jest to powiązane sort-objectz lengthatrybutem, więc pliki są sortowane według rozmiaru. Indeksujemy to za pomocą, (...)[0]aby uzyskać pierwszy (tzn. Najmniejszy), a następnie wziąć to .Name. Wyjście za pośrednictwem niejawnego Write-Outputnastępuje po zakończeniu programu.

Zapisano 6 bajtów, ponieważ mamy gwarancję, że w katalogu istnieją tylko pliki. Zapisano dodatkowe 3 dzięki ConnorLSW.


2
Nie możesz się tego pozbyć, -fileponieważ tylko pliki znajdują się w bieżącym katalogu?
Mutantoe

@Mutantoe Tak - to było edytowane w wyzwaniu po opublikowaniu tej odpowiedzi. Dzięki!
AdmBorkBork

możesz użyć sort le*do golenia niektórych bajtów, ponieważ PowerShell je zaakceptuje.
colsw

@ConnorLSW Tak, oczywiście. Dzięki!
AdmBorkBork

7

Rubin, 61 40 38 37 bajtów

Dzięki GB i Value Ink

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

Możesz użyć ?. zamiast Dir.pwd i min_by {}, aby uzyskać najmniejszy plik. Dir.foreach(?.).min_by{|x|File.size x}otrzymuje ten sam wynik w 38 bajtach.
GB

@GB Dzięki!
dkudriavtsev

Szkoda, że ​​„wszystkie” pliki, do których język ma dostęp, muszą być przeglądane, ponieważ Dir[?*]są znacznie krótsze, ale nie obejmują ukrytych plików uniksowych, takich jak .bash_profile...
Value Ink

Może Dir [? *, ".? *"] Może działać. Nie próbowałem I jest krótszy.
GB

@GB Tak by było Dir[?*,".*"]. Ciąg glob .?*nie będzie pasował do pliku, .ajeśli istnieje.
Wartość tuszu

6

Mathematica, 35 bajtów

FileNames[]~MinimalBy~FileByteCount

FileNames[]tworzy listę nazw wszystkich plików (i katalogów) w bieżącym katalogu; ~MinimalBy~FileByteCountwybiera nazwę pliku, którego liczba bajtów jest najmniejsza. FileByteCountzgłasza wiele błędów, gdy jest stosowana do katalogów, ale błędy nie wykoleją programu.


6

Java 7, 149 142 bajty

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

Wypróbuj online!

-7 bajtów dzięki CAD97


Myślę, że chcesz File :: długość nie File :: getTotalSpace
CAD97

Nieprzetestowana Java 8: ()->java.utils.stream(new java.io.File(".").listFiles()).max((a,b)->a.length()-b.length).get().getName()dla 104 bajtów
CAD

@ CAD97 Masz rację! O czym myślałem ...
Poke

6

SH (Linux / Unix) 15 14 13 14 bajtów

ls -aS|tail -1

-S sortuje według rozmiaru (malejąco),

-rodwraca i tail -1wyświetla ostatni plik na liście.

@ Dennis Dzięki za zapisanie 1 bajtu @Dani_l Dzięki za zapisanie 1 bajtu.


Znajduje największy plik, nie?
Dennis

Nieważne, jestem zmęczony. Możesz użyć tailzamiast cofania i -1jest to skrót -n1.
Dennis

@Dennis Zaktualizowano
Abel Tom

@EasterlyIrk Teraz powinno :)
Abel Tom

@AbelTom spoko, dzięki za naprawę.
Rɪᴋᴇʀ

4

MATLAB / Octave, 52 48 bajtów

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

Wyjaśnienie

Otrzymuje listę wszystkich plików i folderów w bieżącym katalogu za pomocą dir. Wyjście dirjest structzawierający nazwę pliku, czy jest to katalog lub nie, rozmiar (w bajtach), etc.

Następnie możemy pobrać tablicę rozmiarów każdego z bajtów [d.bytes]i wykonać podział elementowy za pomocą logicznej wartości logicznej wskazującej, czy jest to katalog, czy nie, ~[d.isdir]która zwróci Infkatalog, w którym jest katalog (dzielenie przez zero), a wielkość w bajtach w przeciwnym razie (dzielenie przez 1).

Znajdujemy indeks minimum tej tablicy za pomocą drugiego wyniku mini używamy go do indeksowania do początkowej struktury i wyświetlania nazwy za pomocąd(n).name


Powinieneś dodać disp(...)wokół wyjścia, aby poprawnie go wydrukować. W przeciwnym razie, jeśli na przykład ansbyłby plik o nazwie, który nie jest najmniejszy w folderze, dane wyjściowe nie byłyby jasne, który plik jest najmniejszy dla każdego, kto nie zna MATLAB.
Tom Carpenter

@TomCarpenter Hmmm Zinterpretowałem „Symbole wiodące / końcowe są dozwolone, o ile jest jasne, który plik został wybrany”, co oznacza, że ans = jest w porządku
Suever

Właśnie zdałem sobie sprawę, że MATLAB dodaje niejawne .(bieżący folder) i ..(folder powyżej), więc nie mogę usunąć sprawdzania katalogu. Przepraszam za to.
Tom Carpenter

4

Scala, 52 bajty

Stara wersja, 79 bajtów

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

Dostosowano zgodnie z radą jaxad0127. Teraz ma tylko 52 bajty.

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

Używanie głowy zamiast zastosowania (0) jest krótsze. Również metoda toString pliku jest w porządku, nie trzeba wywoływać get name.
jaxad0127

4

Partia, 43 39 35 bajtów

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

Dane wyjściowe zawierają z jakiegoś powodu wiodącą przestrzeń, ale na szczęście jest to dozwolone. Edycja: Teraz zakładając, że nie ma katalogów do zapisania 4 bajtów.


Och, używając takiego / p, cholernie sprytny!
AdmBorkBork

@AdmBorkBork Ach, nie zauważyłem, że było to dozwolone, dzięki!
Neil

Masz gwarancję, że nie istnieją podkatalogi (wyzwanie zostało zaktualizowane), dzięki czemu możesz go wyeliminować /a-d.
AdmBorkBork

4

Perl 6 ,  33 32 31  16 bajtów

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

Spróbuj

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

Spróbuj

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

Spróbuj

put dir.min: *.s

Spróbuj

Rozszerzony:

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

dirDomyślna forma funkcji to $*CWD, a opis zadania mówi, że możesz założyć, że nie będzie żadnych folderów, więc myślę, że możesz to skrócić dir.min(*.s).put.
sml,

Kiedy to napisałem, napisałem, że program musi ignorować foldery.
Brad Gilbert b2gills 29.01.17

4

J , 21 20 bajtów

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

Zapisano bajt dzięki @ Conor .

Wyjaśnienie

>{.,(/: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 Dzięki
mile

3

Plik BATCH, 77 72 63 bajtów

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

Nie ma bezpośredniego odpowiednika headlub tailw BATCH, przynajmniej o ile mi wiadomo, więc tutaj jest nieprzyzwoite obejście. (przy dużej pomocy @Neil - dzięki!)

Komenda ta dirsłuży /o-sdo sortowania według malejącego rozmiaru pliku i /bdo wyświetlania tylko nazw plików. Przechodzimy przez te z FOR /F, ustawiając zmienną Fna nazwę pliku za każdym razem. Na koniec wypisujemy tylko ostatnią z ECHO %F%.

Zaoszczędził jeszcze 9 bajtów dzięki Neilowi ​​i dzięki gwarancjom, że nie ma żadnych katalogów.


1
Twoja FORzmienna potrzebuje dwóch %s do pracy w skrypcie. W przeciwnym razie kilka sztuczek golfowych: 1. Nie używaj @ECHO OFFkrótkich skryptów, dodaj @do każdej linii i po niej DO. 2. Usuń wcześniej spację DO. 3. Spacje i :s nie są potrzebne w dirpoleceniu.
Neil

1
@Neil Ack, dzięki. Przepraszam, dość zardzewiały, odkąd robię PowerShell ... Dzięki!
AdmBorkBork

3

PHP, 84 62 bajty

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

Ponieważ pytanie zostało zaktualizowane przy założeniu, że w bieżącym katalogu nie będzie folderów, mogłem usunąć sprawdzanie plików i zagrać w golfa.


Oto moja stara odpowiedź:

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

To najlepsze, co mogłem zrobić. Może brakuje mi lepszego sposobu.

$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 (za pomocą walk), 114 bajtów

Zignoruj ​​nowy wiersz:

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

To wywołuje walkera, który przegląda bieżący katalog ( __dirname) i dla każdego pliku wywołuje funkcję ze swoją stat soraz funkcję, n()którą należy wywołać, aby kontynuować przechodzenie. Następnie enddrukuje nazwę pliku z minimalną liczbą sizeznalezionych bajtów. s.size>m.sizezwraca falsekiedy m.sizejest undefined, więc po pierwszym wywołaniu zwrotnym mjest równe pierwszemu znalezionemu plikowi, i kontynuuje stamtąd normalnie.


2

R, 36 bajtów

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

Wyjaśniono

file.info()zwraca a data.frame„informacji o pliku”, gdy otrzyma znak lub wektor znaków w nazwach plików / folderów, który, gdy jest używany na liście plików / folderów w bieżącym katalogu ( dir()), wygląda mniej więcej tak:

                                                               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

Następnie musimy po prostu znaleźć nazwę pliku, dla którego sizekolumna (w skrócie używając $s) jest najmniejsza. W związku z tym, jeśli istnieje więcej niż jeden plik o najmniejszym rozmiarze, wszystkie zostaną zwrócone.

Bonus: jeśli chcielibyśmy również zignorować foldery w bieżącym katalogu, moglibyśmy po prostu wyszukać rozmiar, gdy isdir == FALSE: x=file.info(y<-dir());y[x$s==min(x$s[!x$i])]co okazuje się mieć 44 bajty.


Trochę za późno, ale file.sizejest krótszy, ponieważ nie musisz $spóźniej robić .
JAD


2

SmileBASIC, 110 bajtów

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]

Patrzy tylko na TXT:pliki, ponieważ DAT:plików nie można załadować, chyba że znasz już ich rozmiar, co uniemożliwia załadowanie losowego.


Jak ładujesz DAT: plik? Czy możesz użyć brutalnej siły dla każdej nazwy / rozmiaru pliku w folderze?
Pavel

Próba załadowania 3-wymiarowego DAT:pliku do 2-wymiarowej tablicy (na przykład) spowoduje błąd, więc nie możesz go brutalnie wymusić. Musisz tylko znać wcześniej liczbę wymiarów, co normalnie byś zrobił.
12Me21

Czy można załadować plik 2-d DAT: do tablicy 3-d? Następnie możesz utworzyć tablicę o maksymalnym rozmiarze. I nie możesz w żaden sposób złapać błędów?
Pavel

Nie, spowoduje to błąd niedopasowania typu. Nie ma też sposobu na wyłapanie błędów.
12Me21


1

C #, 277 bajtów

Nie najkrótszy, ale czego można oczekiwać od C #?

Grał w golfa

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

Nie golfił

//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 bajtów

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

Jest to anonimowa funkcja, która sortuje pliki w bieżącym katalogu według długości pliku i wybiera pierwszy plik za pomocą pull .

Użyj tego w ten sposób: main{ {ls""|sort key=fileLength|pull} }


Najwyraźniej ls""działa równie dobrze, jak ls".". Myślę, że możesz uratować bajt od tego
Kritixi Lithos

@KritixiLithos Wydaje się, że tak. Dzięki!
fergusq

0

SmileBASIC 3, 105 bajtów (konkuruje?)

Bije odpowiedź 12Me21 za ale nadal cierpi z powodu niemożności załadowania plików DAT (który czuje się bardzo okrutny być dyskwalifikujące biorąc pod uwagę okoliczności.)

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]

Krótsza wersja powyżej jest denerwująca i wyświetla monit o załadowanie każdego pliku, ale działa. Dla dwóch bajtów więcej możesz pominąć monit; zmień wiersz 2 na to:

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

0

Plik wsadowy, 33 bajty

Tym razem pliki wsadowe są umiarkowanie konkurencyjne.

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

Wynik

wprowadź opis zdjęcia tutaj


Znajdź sposób, aby zatrzymać tworzenie qprzed dir/os/buruchomieniem, a zaoszczędzisz maksymalnie 6 bajtów, nie musisz umieszczać pliku wyjściowego w osobnym katalogu.

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

Zawsze będzie wyprowadzany qjako najmniejszy plik (chyba że zostanie powiązany z innym plikiem 0-bajtowym), ponieważ jest tworzony jako pusty plik przed dir/b/oszebraniem listy plików.


0

C ++ 17 (gcc) , 180 bajtów

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

Wypróbuj online!

Wymaga najnowszej standardowej biblioteki, która się implementuje std::filesystem.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.