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,!!rev
para revertir la línea actual o!Gxxd
para 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 congg
gg
fuente
Bash + coreutils, 13 bytes
Explicación:
fuente
ls -1Sa|tail -1
es 3 bytes más corto y tiene una salida más limpia.ls
detecta 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. Compararls
vsls|cat
ls -Sar|sed q
Python
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))
wc
que me dio 1 byte másfilter
bit es innecesario. Esto tampoco funciona en Python 3, ya queprint
es 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!
ls
es un alias paraGet-ChildItem
. Eso se canalizasort-object
con ellength
atributo, 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.Name
mismo. La salida a través de lo implícitoWrite-Output
ocurre 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
-file
ya 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.a
si existe.Mathematica, 35 bytes
FileNames[]
produce una lista de nombres de todos los archivos (y directorios) en el directorio actual;~MinimalBy~FileByteCount
selecciona el nombre del archivo cuyo número de bytes es el más pequeño.FileByteCount
arroja 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-S
ordena por tamaño (descendente),y-r
inviertetail -1
genera el último archivo de la lista.@ Dennis Gracias por guardar 1 byte @Dani_l Gracias por guardar 1 byte.
fuente
tail
embargo, podría usar en lugar de invertir, y-1
es 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 contienedir
unstruct
nombre 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á lugarInf
donde 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
min
y la usamos para indexar en la estructura inicial y mostrar el nombre cond(n).name
fuente
disp(...)
alrededor de la salida para imprimirla correctamente. De lo contrario, si por ejemplo hubiera un archivo llamadoans
que 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
dir
predeterminada$*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
head
otail
en BATCH, al menos que yo sepa, así que aquí hay una solución alternativa. (con mucha ayuda de @Neil, ¡gracias!)El
dir
comando, con/o-s
ordenar en tamaño de archivo descendente, y/b
generar solo los nombres de archivo. Recorremos aquellos conFOR /F
, configurando la variableF
con 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
FOR
variable necesita dos%
s para funcionar en un script. De lo contrario, algunos trucos de golf: 1. No lo use@ECHO OFF
en guiones cortos, agregue un@
a cada línea y despuésDO
. 2. Eliminar el espacio anteriorDO
. 3. Los espacios:
ys no son necesarios en eldir
comando.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ísticas
y una función siguienten()
que debe invocarse para continuar el recorrido. Luego en elend
, imprime un nombre de archivo con el mínimosize
en bytes encontrados.s.size>m.size
regresafalse
cuandom.size
esundefined
, entonces después de la primera devolución de llamada,m
es 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
size
columna (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.size
es más corto porque no tienes que hacerlo$s
despué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
q
antes dedir/os/b
ejecutarse y ahorrará un máximo de 6 bytes al no tener que colocar el archivo de salida en un directorio separado.Siempre saldrá
q
como 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/os
reunir 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