Objetivo:
Cree un programa para encontrar el archivo más pequeño en la carpeta actual.
- El tamaño del archivo puede medirse en bytes o caracteres.
- Si varios archivos tienen el mismo tamaño, puede elegir uno o mostrarlos todos.
- Puede suponer que habrá al menos un archivo en la carpeta y que ningún archivo tendrá un tamaño de 0.
- Suponga que todos los archivos de la carpeta se pueden cargar por el idioma que está utilizando. 
- Suponga que no hay carpetas en el directorio actual.
Entrada:
El programa no debe recibir ninguna entrada del usuario, a menos que:
- Si su idioma no tiene una "carpeta actual", puede pedirle al usuario un nombre / ruta de carpeta.
- Si su idioma no puede acceder directamente a los archivos en su computadora, puede permitir que el usuario cargue archivos. (JavaScript, por ejemplo)
Salida:
Se debe mostrar el nombre del archivo más pequeño.
- Los símbolos iniciales / finales están permitidos, siempre que esté claro qué archivo se ha elegido.
- (Imprimir una lista de todos los archivos está en contra de las reglas).
Notas:
- Las lagunas estándar no están permitidas.
- No puede modificar / crear / eliminar archivos en la carpeta para cambiar el resultado.
- Este es el código de golf ; la respuesta más corta (en bytes) gana.
                    
                        code-golf
                                file-system
                                
                    
                    
                        12Me21
fuente
                
                fuente

Respuestas:
Vim 12 bytes
Pruébalo en línea!
Explicación:
!!es el comando de filtro Canaliza el contenido de la línea actual a un comando del sistema arbitrario y envía la salida de vuelta al búfer. Es útil para usar herramientas externas para cosas en las que bash es mejor que vim, por ejemplo,!!revpara revertir la línea actual o!Gxxdpara hexadecitar el búfer. En nuestro caso, el búfer está vacío, por lo que es equivalente a:r!ls, que solo alimenta la salida del comando en la línea actual.Ahora el cursor está en la línea 1, y queremos eliminar todas las líneas menos la última. El enfoque ingenuo es
Pero lo podemos hacer mejor. Como expliqué en este consejo , generalmente
{puede (pero no siempre) ser equivalente a . Aquí, es aún mejor. Debido a que el movimiento se basa en caracteres , no en líneas como es, no tenemos que subir una línea primero, dejándonos conggggfuente
Bash + coreutils, 13 bytes
Explicación:
fuente
ls -1Sa|tail -1es 3 bytes más corto y tiene una salida más limpia.lsdetecta que la salida es al terminal, formateará la salida en varias columnas. Pero si la salida es una tubería, solo hará 1 por línea. Compararlsvsls|catls -Sar|sed qPython
23,94767454 bytes-18 bytes gracias a @orlp
-2 bytes gracias a @Jonathan Allan
-20 bytes gracias a un cambio en las especificaciones de desafío
fuente
print min(filter(path.isfile,listdir(".")),key=path.getsize)Es más limpio y sustancialmente más corto."."es el valor predeterminado.print(min(filter(path.isfile,listdir()),key=path.getsize))wcque me dio 1 byte másfilterbit es innecesario. Esto tampoco funciona en Python 3, ya queprintes una función. Lo siguiente funcionaría, y sería sustancialmente más corto:print(min(listdir(),key=path.getsize))PowerShell ,
302421 bytesPruébalo en línea!
lses un alias paraGet-ChildItem. Eso se canalizasort-objectcon ellengthatributo, por lo que los archivos se ordenan por tamaño. Lo indexamos con el(...)[0]para obtener el primero (es decir, el más pequeño), y luego tomamos el.Namemismo. La salida a través de lo implícitoWrite-Outputocurre al finalizar el programa.Guardamos 6 bytes ya que estamos garantizados de que solo existen archivos en el directorio. Ahorró 3 adicionales gracias a ConnorLSW.
fuente
-fileya que solo los archivos están en el directorio actual?sort le*para afeitar algunos bytes ya que powershell lo aceptará.Ruby,
61403837 bytesGracias GB y Value Ink
fuente
Dir.foreach(?.).min_by{|x|File.size x}obtiene el mismo resultado en 38 bytes.Dir[?*]es mucho más corto pero no incluye archivos Unix ocultos como.bash_profile...Dir[?*,".*"]. La cadena global.?*no coincidirá con el archivo.asi existe.Mathematica, 35 bytes
FileNames[]produce una lista de nombres de todos los archivos (y directorios) en el directorio actual;~MinimalBy~FileByteCountselecciona el nombre del archivo cuyo número de bytes es el más pequeño.FileByteCountarroja un montón de errores cuando se aplica a los directorios, pero los errores no descarrilan el programa.fuente
Java 7,
149142 bytesPruébalo en línea!
-7 bytes gracias a CAD97
fuente
()->java.utils.stream(new java.io.File(".").listFiles()).max((a,b)->a.length()-b.length).get().getName()para 104 bytesSH (Linux / Unix)
15141314 bytes-Sordena por tamaño (descendente),-rinviertetail -1genera el último archivo de la lista.@ Dennis Gracias por guardar 1 byte @Dani_l Gracias por guardar 1 byte.
fuente
tailembargo, podría usar en lugar de invertir, y-1es una abreviatura de-n1.MATLAB / Octave,
5248 bytesExplicación
Esto obtiene una lista de directorio de todos los archivos y carpetas en el directorio actual usando
dir. La salida de contienedirunstructnombre de archivo, ya sea un directorio o no, el tamaño (en bytes), etc.Luego podemos tomar una matriz de los tamaños de cada uno en bytes
[d.bytes]y realizar una división por elementos con un valor booleano que indica si es un directorio o no, lo~[d.isdir]que dará lugarInfdonde es un directorio (división por cero) y el tamaño en bytes de lo contrario (división por 1)Encontramos el índice del mínimo de esta matriz usando la segunda salida
miny la usamos para indexar en la estructura inicial y mostrar el nombre cond(n).namefuente
disp(...)alrededor de la salida para imprimirla correctamente. De lo contrario, si por ejemplo hubiera un archivo llamadoansque no sea el más pequeño en la carpeta, la salida no sería clara en cuanto a qué archivo es el más pequeño para cualquier persona que no esté familiarizada con MATLAB.ans =está bien.(carpeta actual) y..(carpeta anterior), por lo que no puedo eliminar la comprobación del directorio que parece. Lo siento por eso.Scala, 52 bytes
Versión anterior, 79 bytes
Ajustado de acuerdo con los consejos de jaxad0127. Ahora solo tiene 52 bytes.
fuente
Lote,
433935 bytesLa salida incluye un espacio líder por alguna razón, pero afortunadamente está permitido. Editar: ahora suponiendo que no haya directorios para guardar 4 bytes.
fuente
/a-d.Perl 6 ,
33 32 3116 bytesIntentalo
Intentalo
Intentalo
Intentalo
Expandido:
fuente
dirpredeterminada$*CWD, y la descripción de la tarea dice que puede asumir que no habrá carpetas, por lo que creo que puede acortar esodir.min(*.s).put.J ,
2120 bytesSalvó un byte gracias a @ Conor .
Explicación
fuente
Archivo BATCH,
777263 bytesNo hay un equivalente directo de
headotailen BATCH, al menos que yo sepa, así que aquí hay una solución alternativa. (con mucha ayuda de @Neil, ¡gracias!)El
dircomando, con/o-sordenar en tamaño de archivo descendente, y/bgenerar solo los nombres de archivo. Recorremos aquellos conFOR /F, configurando la variableFcon el nombre del archivo cada vez. Finalmente, sacamos solo el último conECHO %F%.Ahorré 9 bytes más gracias a Neil y gracias a las garantías de que no hay directorios presentes.
fuente
FORvariable necesita dos%s para funcionar en un script. De lo contrario, algunos trucos de golf: 1. No lo use@ECHO OFFen guiones cortos, agregue un@a cada línea y despuésDO. 2. Eliminar el espacio anteriorDO. 3. Los espacios:ys no son necesarios en eldircomando.PHP
8462 bytesComo la pregunta se actualizó con la suposición de que no habrá carpetas en el directorio actual, pude eliminar las cosas de verificación de archivos y reducir esto.
Aquí está mi vieja respuesta:
Esto es lo mejor que pude hacer. Tal vez hay una mejor manera en que me estoy perdiendo.
fuente
Node.js (usando
walk), 114 bytesIgnorar nueva línea:
Esto invoca un andador que atraviesa el directorio actual (
__dirname) y para cada archivo llama a una función con su estadísticasy una función siguienten()que debe invocarse para continuar el recorrido. Luego en elend, imprime un nombre de archivo con el mínimosizeen bytes encontrados.s.size>m.sizeregresafalsecuandom.sizeesundefined, entonces después de la primera devolución de llamada,mes igual al primer archivo encontrado, y continúa desde allí normalmente.fuente
R, 36 bytes
Explicado
file.info()devuelve unadata.frame"información de archivo" cuando se le da un carácter o vector de caracteres de nombres de archivo / carpeta que, cuando se usa en la lista de archivos / carpetas en el directorio actual (dir()), se parece a:Posteriormente solo tenemos que encontrar el nombre del archivo para el que la
sizecolumna (abreviada usando$s) es la más pequeña. En consecuencia, si hay más de un archivo con el tamaño más pequeño, se devolverán todos.Bonificación: si también quisiéramos ignorar las carpetas en el directorio actual, simplemente podríamos buscar el tamaño cuando
isdir == FALSE:x=file.info(y<-dir());y[x$s==min(x$s[!x$i])]que resulta ser 44 bytes.fuente
file.sizees más corto porque no tienes que hacerlo$sdespués.Tcl , 88 bytes
Pruébalo en línea!
fuente
SmileBASIC, 110 bytes
Solo mira los
TXT:archivos, ya que losDAT:archivos no se pueden cargar a menos que ya conozca su tamaño, lo que hace imposible cargar uno aleatorio.fuente
DAT:archivo? ¿Podría forzar la fuerza bruta de cada nombre / tamaño de archivo en la carpeta?DAT:archivo tridimensional en una matriz bidimensional (por ejemplo) causará un error, por lo que no puede forzarlo. Solo tiene que saber el número de dimensiones de antemano, lo que normalmente haría.DAT:archivo 2-d en una matriz 3-d? Entonces podría crear una matriz de tamaño máximo. ¿Y no puedes detectar errores de ninguna manera?Groovy , 49 bytes
Pruébalo en línea!
Cierre, uso:
m(new File("location"))fuente
C #, 277 bytes
No es el más corto, pero ¿qué esperarías de C #?
Golfed
Sin golf
fuente
Röda ,
3231 bytesEs una función anónima que clasifica los archivos en el directorio actual por longitud de archivo y luego selecciona el primer archivo con
pull.Úselo así:
main{ {ls""|sort key=fileLength|pull} }fuente
ls""funciona tan bien comols".". Creo que puedes salvar un byte de esoSmileBASIC 3, 105 bytes (¿compitiendo?)
Supera la respuesta de 12Me21 pero aún sufre la incapacidad de cargar archivos DAT (lo que se siente muy cruel por ser descalificador teniendo en cuenta las circunstancias).
La versión más corta anterior es molesta y le solicita que cargue cada archivo, pero funciona. Para dos bytes más, puede suprimir la solicitud; cambie la línea 2 a esto:
fuente
Archivo por lotes, 33 bytes
Los archivos por lotes son moderadamente competitivos esta vez, por extraño que parezca.
Salida
Encuentre una manera de detener la creación
qantes dedir/os/bejecutarse y ahorrará un máximo de 6 bytes al no tener que colocar el archivo de salida en un directorio separado.Siempre saldrá
qcomo el archivo más pequeño (a menos que esté vinculado por otro archivo de 0 bytes) ya que se crea como un archivo vacío antes dedir/b/osreunir una lista de archivos.fuente
C ++ 17 (gcc) , 180 bytes
Pruébalo en línea!
Requiere una biblioteca estándar reciente que implemente
std::filesystem.fuente
Zsh ,
1814 bytesPruébalo en línea!Pruébalo en línea!(D)archivos dot de globos(oL)ordena por tamaño[1]selecciona el primer partidofuente