Найдите самый маленький файл

19

Цель:

Создайте программу, чтобы найти самый маленький файл в текущей папке.

  • Размер файла может быть измерен в байтах или символах.
  • Если несколько файлов имеют одинаковый размер, вы можете выбрать один или отобразить все из них.
  • Можно предположить, что в папке будет хотя бы один файл, а размер файлов не будет равен 0.
  • Предположим, что все файлы в папке могут быть загружены языком, который вы используете.

  • Предположим, что в текущем каталоге нет папок.

Входные данные:

Программа не должна принимать никаких действий от пользователя, кроме случаев, когда:

  • Если у вашего языка нет «текущей папки», он может запросить у пользователя имя / путь к папке.
  • Если ваш язык не может напрямую обращаться к файлам на вашем компьютере, он может позволить пользователю загружать файлы. (JavaScript, например)

Выход:

Имя самого маленького файла должно отображаться.

  • Допускаются начальные / конечные символы, если ясно, какой файл был выбран.
  • (Печать списка всех файлов противоречит правилам).

Примечания:

  • Стандартные лазейки не допускаются.
  • Вы не можете изменить / создать / удалить файлы в папке, чтобы изменить результат.
  • Это ; кратчайший ответ (в байтах) выигрывает.
12Me21
источник
1
Можем ли мы предположить, что файлы могут иметь размер 0?
Rɪᴋᴇʀ
Кроме того, что означает «предполагается, что все файлы в папке доступны»? Значит ли это, что скрытые файлы не нужно показывать?
17
2
Можно ли предположить, что в текущей папке нет папок? Это имеет значение, если у вас есть языковая функция, которая возвращает файлы и папки, а не только файлы!
Сергей
1
Не обязательно. Вы можете предположить, что в текущем каталоге нет однозначных каталогов , которые не лишают законной силы никакие ответы.
Деннис
1
(извините, я не ответил раньше, мое интернет-соединение было отключено в течение нескольких дней) Проблема, которую я имею, позволяя вам пропускать скрытые файлы, заключается в том, что кажется, что это открывает много лазеек. Если вы пропустите файлы, к которым «немного сложнее получить доступ», люди могут сделать что-то вроде проверки только первых 9 файлов, потому что это экономит несколько байтов.
12Me21

Ответы:

7

Vim 12 байт

!!ls -Sa
Gd{

Попробуйте онлайн!

Объяснение:

!!это команда фильтра . Он передает содержимое текущей строки в произвольную системную команду и отправляет вывод обратно в буфер. Это полезно для использования внешних инструментов для вещей, в которых bash лучше, чем vim, например, !!revдля обращения к текущей строке или !Gxxdдля шестнадцатеричного буфера. В нашем случае буфер пуст, поэтому он эквивалентен :r!ls, который просто передает вывод команды в текущую строку.

Теперь курсор находится в строке 1, и мы хотим удалить каждую строку, кроме последней. Наивный подход

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

Но мы можем сделать лучше. Как я объяснил в этом наконечнике , то {можно , как правило (но не всегда) быть эквивалентны gg. Здесь даже лучше. Поскольку движение персонажа на основе , не построчного как ggесть, мы не должны идти вверх линию первым, оставив нам

Gd{
DJMcMayhem
источник
16

Bash + coreutils, 13 байт

ls -Sar|sed q

Объяснение:

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.         
Rɪᴋᴇʀ
источник
Отправил это как мой собственный ответ, но я думаю, что он слишком похож на ваш. ls -1Sa|tail -1на 3 байта короче и имеет более чистый вывод.
orlp
! @orlp спасибо ..
Rɪᴋᴇʀ
1
Я не думаю, что вам нужно '-1', труба автоматически помещает один файл в строку.
ГБ
@EasterlyIrk Я думаю, что ГБ прав. если lsобнаруживает вывод на терминал, он отформатирует вывод в несколько столбцов. Но если output - это труба, он просто сделает 1 на строку. Сравните lsпротивls|cat
Цифровая травма
На два байта короче:ls -Sar|sed q
Цифровая травма
8

Python 2 3, 94 76 74 54 байта

-18 байт благодаря @orlp
-2 байт благодаря @Jonathan Allan
-20 байт благодаря изменению спецификации вызовов

from os import*
print(min(listdir(),key=path.getsize))
овс
источник
print min(filter(path.isfile,listdir(".")),key=path.getsize)чище и существенно короче
orlp
Сохраните два байта, перемещающихся в Python 3, поскольку "."это значение по умолчанию. print(min(filter(path.isfile,listdir()),key=path.getsize))
Джонатан Аллан
Также я считаю 76, а не 77.
Джонатан Аллан
@JonathanAllan Я измерил байт счетчика счетчик с wcкоторый дал мне 1 байт больше
овс
Посторонний байт будет вызван завершающим переводом строки, который не требуется для Python. Кроме того, поскольку запрос был обновлен, чтобы указать, что подкаталогов нет, весь этот filterбит не нужен. Это также не работает в Python 3, так printкак это функция. Ниже будет работать, и быть существенно короче:print(min(listdir(),key=path.getsize))
Mego
8

PowerShell , 30 24 21 байт

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

Попробуйте онлайн!

lsэто псевдоним для Get-ChildItem. Это связано sort-objectс lengthатрибутом, поэтому файлы сортируются по размеру. Мы индексируем это с помощью, (...)[0]чтобы получить первое (т.е. самое маленькое), а затем берем.Name его. Вывод через неявный Write-Outputпроисходит при завершении программы.

Сохранено 6 байт, поскольку мы гарантируем, что в каталоге существуют только файлы. Сохранено дополнительно 3 благодаря ConnorLSW.

AdmBorkBork
источник
2
Не можете ли вы избавиться от, -fileтак как только файлы находятся в текущем каталоге?
Мутанто
@Mutantoe Да - это было отредактировано в конкурсе после того, как я опубликовал этот ответ. Благодарность!
AdmBorkBork
Вы можете использовать, sort le*чтобы побрить несколько байтов, так как powershell примет это.
colsw
@ConnorLSW Да, конечно. Благодарность!
AdmBorkBork
7

Рубин, 61 40 38 37 байт

Спасибо GB и Value Ink

p Dir[?*,".*"].min_by{|x|File.size x}
dkudriavtsev
источник
Ты можешь использовать ?. вместо Dir.pwd и min_by {}, чтобы получить самый маленький файл. Dir.foreach(?.).min_by{|x|File.size x}получает тот же результат в 38 байтов.
ГБ
@GB Спасибо!
dkudriavtsev
Жаль, что «все» файлы, к которым имеет доступ язык, должны быть просмотрены, потому что они Dir[?*]намного короче, но не включают в себя скрытые файлы Unix, такие как .bash_profile...
Value Ink
Может быть, Дир [? *, ".? *"] Мог бы работать. Я не пробовал И это короче.
GB
@ ГБ Это действительно так Dir[?*,".*"]. Строка глобуса .?*не будет соответствовать файлу, .aесли он существует.
Чернила стоимости
6

Mathematica, 35 байт

FileNames[]~MinimalBy~FileByteCount

FileNames[]создает список имен всех файлов (и каталогов) в текущем каталоге; ~MinimalBy~FileByteCountвыбирает имя файла, чей счетчик байтов наименьший. FileByteCountвыдает кучу ошибок, когда применяется к каталогам, но ошибки не мешают работе программы.

Грег Мартин
источник
6

Java 7, 149 142 байта

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

Попробуйте онлайн!

-7 байт благодаря CAD97

совать
источник
Я думаю, что вы хотите File :: length, а не File :: getTotalSpace
CAD97
Непроверенная Java 8: ()->java.utils.stream(new java.io.File(".").listFiles()).max((a,b)->a.length()-b.length).get().getName()для 104 байтов
CAD97
@ CAD97 Ты прав! О чем я думал ...
Poke
6

SH (Linux / Unix) 15 14 13 14 байт

ls -aS|tail -1

-S сортирует по размеру (по убыванию),

-rпереворачивает и tail -1выводит последний файл в списке.

@ Dennis Спасибо за сохранение 1 байта @Dani_l Спасибо за сохранение 1 байта.

Абель Том
источник
Это находит самый большой файл, нет?
Деннис
Неважно, я устала. Вы можете использовать tailвместо реверсирования, и -1это сокращение для -n1.
Деннис
Обновление @Dennis
Абель Том
@EasterlyIrk Теперь надо :)
Абель Том,
@AbelTom круто, спасибо за исправление.
Rɪᴋᴇʀ
4

MATLAB / Octave, 52 48 байтов

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

объяснение

Это получает список каталогов всех файлов и папок в текущем каталоге, используя dir. Выходной сигнал dirявляется structсодержащий имя файла, будь то каталог или нет, размер (в байтах) и т.д.

Затем мы можем взять массив размеров каждого в байтах [d.bytes]и выполнить поэлементное деление с логическим значением, указывающим, является ли это каталогом или нет, ~[d.isdir]который даст, Infгде это каталог (деление на ноль) и размер в байтах в противном случае (деление на 1).

Мы находим индекс минимума этого массива, используя второй вывод, minи используем его для индексации в исходной структуре и отображения имени сd(n).name

Suever
источник
Вы должны добавить disp(...)вокруг вывода, чтобы правильно распечатать его. В противном случае, если, например, в папке был файл с именем, ansкоторый не является самым маленьким в папке, вывод не будет ясным относительно того, какой файл является самым маленьким для тех, кто не знаком с MATLAB.
Том Карпентер
@TomCarpenter Хммм. Я интерпретировал, что «разрешающие / конечные символы разрешены, если ясно, какой файл был выбран», чтобы означать, что все в ans = порядке
Suever
Я только что понял, что MATLAB добавляет неявные .(текущая папка) и ..(папка выше), поэтому, кажется, не могу удалить проверку каталога. Прости за это.
Том Карпентер
4

Скала, 52 байта

Старая версия, 79 байт

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

Скорректировано в соответствии с рекомендациями jaxad0127. Сейчас это всего 52 байта.

new java.io.File(".").listFiles.sortBy(_.length)head
Топор арии
источник
Использование head вместо apply (0) короче. Кроме того, метод toString в File - это хорошо, не нужно вызывать get name.
jaxad0127
4

Пакет, 43 39 35 байт

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

Выходные данные содержат пробел по некоторым причинам, но, к счастью, это разрешено. Редактировать: теперь при условии, что нет каталогов для сохранения 4 байта.

Нил
источник
О, используя / р, черт возьми, умный!
AdmBorkBork
@AdmBorkBork Ах, я не заметил, что это разрешено, спасибо!
Нил
Вы гарантированно не существует подкаталогов (задача была обновлена), поэтому вы можете устранить /a-d.
AdmBorkBork
4

Perl 6 ,  33 32 31  16 байт

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

Попытайся

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

Попытайся

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

Попытайся

put dir.min: *.s

Попытайся

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
Брэд Гилберт b2gills
источник
Функция по dirумолчанию имеет значение $*CWD, а в описании задачи сказано, что вы можете предположить, что папок не будет, поэтому я думаю, что вы можете сократить это до dir.min(*.s).put.
Смс
Когда я написал это, он сказал, что программа должна игнорировать папки.
Брэд Гилберт b2gills
4

J , 21 20 байт

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

Сохраненный байт благодаря @ Конору .

объяснение

>{.,(/: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 Благодарности
мили
3

Пакетный файл, 77 72 63 байта

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

Там нет прямого эквивалента headили tailв пакетном режиме, по крайней мере, насколько мне известно, так что это грязный обходной путь. (с большой помощью @Neil - спасибо!)

Команда dir, с помощью которой /o-sможно отсортировать файлы по убыванию и /bвывести только имена файлов. Мы перебираем их FOR /F, Fкаждый раз устанавливая переменную в имя файла. Наконец, мы выводим только последний с ECHO %F%.

Сохранено еще 9 байтов благодаря Нейлу и благодаря гарантиям отсутствия каталогов.

AdmBorkBork
источник
1
Ваша FORпеременная требует двух %секунд для работы в скрипте. В противном случае, несколько уловок игры в гольф: 1. Не используйте @ECHO OFFкороткие сценарии, добавляйте @к каждой строке и после DO. 2. Удалите пробел раньше DO. 3. Пробелы и :s не нужны в dirкоманде.
Нил
1
@ Нил Ак, спасибо. Извините, довольно ржавый, так как я делал PowerShell ... Спасибо!
AdmBorkBork
3

PHP, 84 62 байта

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

Так как вопрос был обновлен с предположением, что в текущем каталоге не будет папок, я смог удалить файл проверки файлов и проверить это.


Вот мой старый ответ:

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

Это лучшее, что я мог сделать. Может быть, есть лучший способ, по которому я скучаю.

$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 (используется walk), 114 байт

Игнорировать перевод строки:

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

Это вызывает обходчика, который проходит через текущий каталог ( __dirname) и для каждого файла вызывает функцию со своим stat sи функцию next, n()которая должна быть вызвана для продолжения обхода. Затем в end, он печатает имя файла с sizeнайденным минимумом в байтах. s.size>m.sizeвозвращает falseкогда m.sizeесть undefined, поэтому после первого обратного вызова mон равен первому найденному файлу и продолжает оттуда нормально.

Патрик Робертс
источник
2

R, 36 байт

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

Разъяснения

file.info()Возвращает data.frame«информацию о файле», когда ему дается символ или вектор символов имен файлов / папок, который при использовании в списке файлов / папок в текущем каталоге ( dir()) выглядит примерно так:

                                                               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

Впоследствии у нас просто найти имя файла, для которого sizeстолбец (сокращенно используя $s) является наименьшим. Следовательно, если существует более одного файла с наименьшим размером, все будут возвращены.

Бонус: если мы также хотим игнорировать папки в текущем каталоге, мы можем просто искать размер когда isdir == FALSE: x=file.info(y<-dir());y[x$s==min(x$s[!x$i])]получается 44 байта.

Billywob
источник
Немного поздно, но file.sizeкороче, потому что вы не должны делать $sпотом.
JAD
2

SmileBASIC, 110 байт

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]

Только смотрит на TXT:файлы, так как DAT:файлы не могут быть загружены, если вы уже не знаете их размер, что делает невозможным загрузку случайного.

12Me21
источник
Как вы загружаете DAT: файл? Можете ли вы переборщили каждое имя / размер файла в папке?
Павел
Попытка загрузить 3-мерный DAT:файл в 2-мерный массив (например) вызовет ошибку, поэтому вы не сможете его перебором. Вам просто нужно знать количество измерений заранее, как обычно.
12Me21
Не могли бы вы загрузить 2-й DAT: файл в 3-й массив? Тогда вы можете создать массив максимального размера. А вы никак не можете отловить ошибки?
Павел
Нет, это приведет к ошибке несоответствия типов. И нет возможности ловить ошибки.
12Me21
1

C #, 277 байт

Не самый короткий, но что вы ожидаете от C #?

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())]);
    }
}
Metoniem
источник
1

Röda , 32 31 байт

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

Это анонимная функция, которая сортирует файлы в текущем каталоге по длине файла и затем выбирает первый файл pull.

Используйте это так: main{ {ls""|sort key=fileLength|pull} }

fergusq
источник
Видимо ls""работает так же хорошо, как ls".". Я думаю, что вы можете сохранить байт от этого
Kritixi Lithos
@KritixiLithos Кажется, чтобы. Благодарность!
fergusq
0

SmileBASIC 3, 105 байт (конкурирует?)

Beats ответа 12Me21 в но по- прежнему страдает от невозможности загрузки DAT файлов (которые чувствуют себя очень жестоко быть дисквалифицирующими с учетом обстоятельств.)

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]

Более короткая версия выше раздражает и запрашивает каждый файл для загрузки, но это работает. Еще на два байта вы можете подавить подсказку; измените строку 2 на это:

PUSH T,LEN(LOAD(F$[I],0))NEXT
snail_
источник
0

Пакетный файл, 33 байта

Пакетные файлы на этот раз умеренно конкурентоспособны, как ни странно.

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

Выход

введите описание изображения здесь


Найдите способ остановить создание qдо dir/os/bзапуска, и вы сэкономите максимум 6 байтов, не помещая выходной файл в отдельный каталог.

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

Будет всегда выводить q как наименьший файл (если он не связан с другим 0-байтовым файлом), так как он создается как пустой файл до того, как dir/b/osсоберет список файлов.

БДМ
источник
0

C ++ 17 (gcc) , 180 байт

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

Попробуйте онлайн!

Требуется новая стандартная библиотека, которая реализует std::filesystem.

Г. Слипен
источник