¿Cuál es la extensión del archivo?

10

Su desafío es encontrar la extensión de archivo de un nombre de archivo proporcionado:

hi.txt -> txt or .txt
carrot.meme -> meme or .meme
lol (undefined behavior)
what..is..this..file -> file or .file
.bashrc -> bashrc or .bashrc
[email protected][]h -> h0wC[]h or .h0wC[]h
agent.000 -> 000 or .000

Debe obtener el texto desde el último . o después del último .hasta el final de la cadena. La primera coincidencia de grupo de captura de la expresión regular /\.([^.]+)$/funciona, y también lo hace dividir la entrada en .sy devolver la última.

El nombre del archivo siempre contendrá al menos uno ., pero puede contener varios .. (ver ejemplos)

La entrada siempre coincidirá ^[.a-zA-Z0-9^!\[\]{}@$%+=]+$.

programador 5000
fuente
17
Considere usar Sandbox en el futuro para obtener comentarios sobre sus desafíos antes de publicarlos en el sitio principal.
Mego
1
codegolf.meta.stackexchange.com/a/12432/59376 - Obtuve esta idea de tu desafío.
Magic Octopus Urn
@carusocomputing bonito desafío!
programmer5000
1
¿Por qué los votos negativos? ¿Es este desafío "extremadamente trivial" o algo así?
Abel Tom
El historial de edición de @AbelTom sugeriría que los votos negativos se debían a la falta de especificaciones en el primer borrador de esta pregunta.
Patrick Roberts

Respuestas:

11

JavaScript (ES6), 19 bytes

Devuelve el nombre de archivo completo cuando no hay extensión de archivo. Supongo que este es un comportamiento indefinido aceptable .

let f =

s=>s.split`.`.pop()

console.log(f("hi.txt"))               // -> txt
console.log(f("carrot.meme"))          // -> meme
console.log(f("lol"))                  // -> undefined behavior
console.log(f("what..is..this..file")) // -> file
console.log(f("[email protected][]h")) // -> h0wC[]h
console.log(f(".bashrc")) // -> bashrc

Arnauld
fuente
El punto del comportamiento indefinido es que todo vale. Aunque, los demonios nasales, aunque todavía tienen un comportamiento indefinido, pueden fallar la cláusula de "no hay programas maliciosos".
John Dvorak
10

Mathematica, 13 22 bytes

Editar: No estoy seguro de cómo me perdí el ".bashrc"caso de prueba. Gracias a Artyer por mantenerme honesto.

FileExtension["a"<>#]&

Si la entrada coincide \.[^.]+, FileExtensionsolo devuelve la cadena vacía, por lo que anteponemos la letra a. En cualquier otro caso, el pre-pendiente ano afecta la salida de FileExtension.

ngenisis
fuente
11
Un Mathematica incorporado ... no es de extrañar.
programador
1
Me sorprendería si no había órdenes internas de Mathematica para cualquier pregunta posible
sagiksp
No tengo acceso a Mathematica, pero sospecharía que eso .extno resultaría en nada, lo que falla por la .bashrcnecesidad de salir bashrc(falla en matemáticas )
Artyer
Mathematica solo necesita meta-incorporados Create Built-in XXXXXXXX.
Urna de pulpo mágico
7

Japt , 3 bytes

2 bytes de código, +1 para la hbandera.

q.

Explicación:

q.       Split the input by `.`
   -h    Return the last item

Pruébalo en línea!

Oliver
fuente
7

función c, 21

  • 1 byte guardado gracias a @Dennis.
  • 3 bytes guardados gracias a @JohanduToit.
  • 2 bytes guardados gracias a @Neil.
  • 1 byte guardado gracias a @algmyr.
f(s){s=rindex(s,46);}

Pruébalo en línea .

Trauma digital
fuente
1
Si está de acuerdo con el uso de funciones POSIX heredadas, puede usar rindexpara guardar un byte.
algmyr
@algmyr Claro, funciona bien en TIO, así que lo usaré. Nunca había oído hablar rindex()antes, ¡gracias por el consejo!
Trauma digital
5

PHP, 21 bytes

<?=pathinfo($argn,4);

Pruébalo en línea!

es una expresión más corta para

<?=pathinfo($argn)[extension];

pathinfo

PHP, 27 bytes

<?=end(explode(".",$argn));

explotar

Pruébalo en línea!

PHP <7.0, 26 bytes

<?=end(split("\.",$argn));

división en desuso

Jörg Hülsermann
fuente
1
¿Estás contando una nueva línea final para la primera? Debería tener 27 bytes, no 28.
Conor O'Brien
@ ConorO'Brien Gracias. Tengo cuenta después de copiar y pegar desde la versión dividida a ``
Jörg Hülsermann
2
El pathinfo()basado podría ser <?=pathinfo($argn,4);.
manatwork
4

Marca GNU , 12 bytes

$(suffix $1)

Sin usar un incorporado, 27 bytes:

$(lastword $(subst ., ,$1))
eush77
fuente
4

Lote, 10 bytes.

@echo %~x1

Extrañamente competitivo por una vez.

Neil
fuente
4

V , 5 , 3 bytes

Como más de esta respuesta no se puede imprimir que imprimir, aquí hay un hexdump:

00000000: cd81 ae                                  ...

Pruébalo en línea!

Esto usa el algoritmo de Jan Dvorak , simplemente resulta ser una codificación más eficiente.

Explicación:

Í       " Remove all occurrences of:
 0x81   "   Anything (greedy)
     ®  "   Followed by a dot 

Vieja solución:

$T.d|
James
fuente
¿Explicación por favor?
Erik the Outgolfer
@EriktheOutgolfer Hecho
James
Esperar ®significa seguido de un punto? Jajaja eso es raro.
Erik the Outgolfer
3

Jalea , 4 bytes

ṣ”.Ṫ

Un enlace monádico que toma el nombre del archivo y devuelve la extensión sin encabezado ..

Pruébalo en línea!

¿Cómo?

Literalmente hace lo que se le pidió ...

ṣ”.Ṫ - Main link: list of characters, f
 ”.  - literal '.'
ṣ    - split f at occurrences of '.'
   Ṫ - tail (get the last chunk)
Jonathan Allan
fuente
3

Go , 85 bytes

Ir es ... problemático.

import(."fmt"
."os"
."strings")
func main(){s:=Split(Args[1],".");Print(s[len(s)-1])}

Pruébalo en línea!

Una muestra de paréntesis del código:

()(){([])([()])}
totalmente humano
fuente
2
()(){([])([()])}- ¿Es un Brain-Flak válido?
eush77
55
@ eush77 Es Brain-Flak técnicamente válido , ya que se ejecutará sin errores, pero no hace nada interesante / útil. Es solo el literal 2sin instrucciones / comandos ni nada o un bucle infinito que asigna continuamente más memoria, dependiendo de la entrada.
James
El uso filepath.Extle ahorrará algunos bocados
Powelles
3

JavaScript (ES6), 33 31 28 bytes

s=>s.slice(s.lastIndexOf`.`)

El cambio de especificación en los comentarios elimina la necesidad de +1.

-3 bytes gracias a nderscore

Stephen
fuente
1
-3 con slicey ejecución de cadena de plantilla:s=>s.slice(s.lastIndexOf`.`)
nderscore
3

Lisp común, 57 bytes

(lambda(s)(#1=reverse(subseq #2=(#1# s)0(search"."#2#))))

Pruébelo en línea (agregó algunos bytes para llamar a esta función anónima y mostrar la cadena devuelta)

Explicación

(#1=reverse ...)     ;reverse is now accessible with #1# - saves 1 byte. I 
                     ;also need to reverse output of function inside to 
                     ;get extension in correct order
#2=(#1# s)           ;reverse of input string is now accessible with #2#
(search"."#2#)       ;I take reversed string and search for "." to get position of 
                     ;first instance of "." in string from the end of it
(subseq ... 0 ...)   ;get part of reversed string, 
                     ;starting from first character and ending just 
                     ;before first occurance of "."
                     ;this gives reversed extension

Obtengo una subcadena de cadena invertida, comenzando desde 0, terminando en esto


fuente
3

Gema, 3 personajes

*.=

Ejecución de muestra:

bash-4.4$ gema '*.=' <<< 'what..is..this..file'
file
hombre trabajando
fuente
3

MATL, 8 7 bytes

46&YbO)

¡Pruébalo en MATL Online !

Explicación

        % Implicitly grab input as string
46      % ASCII for '.'
&Yb     % Split the input string at the '.' characters
O)      % Retrieve just the last part
        % Implicitly print the result
Suever
fuente
3

Javascript (ES5), 38 bytes

function(s){return s.split(".").pop()}
Pecado
fuente
2
Para que lo sepas, el usuario de la comunidad emitió automáticamente el voto negativo cuando se editó tu respuesta. Considero que esto es un error .
Dennis
por favor arregla eso si puedes!
Pecó
3

C #, 33 41 bytes

a=>a.Split('.').Last();

Editar como se sugiere:

using System.Linq;a=>a.Split('.').Last();
LiefdeWen
fuente
1
using Sytem.Linq;
Debe
Y también el a=>a.Split('.').Last();retorno implícito es más corto
TheLethalCoder
@TheLethalCoder Gracias por las soluciones sugeridas, todavía nuevo en esto :)
LiefdeWen
Me sorprende que esto sea más largo que mi solución usando Path...
TheLethalCoder
3

Awk, 14 13 caracteres

( Código de 10 9 caracteres + opción de línea de comando de 4 caracteres).

{$0=$NF}1

Gracias a:

  • Robert Benson por detectar el punto y coma innecesario (carácter -1)

Ejecución de muestra:

bash-4.4$ awk -F. '{$0=$NF}1' <<< $'hi.txt\ncarrot.meme\nlol\nwhat..is..this..file\n.bashrc\[email protected][]h'
txt
meme
lol
file
bashrc
h0wC[]h
hombre trabajando
fuente
No necesitas el ;. y solo para su información, awk '{$0=$NF}1 funciona, no se necesita opción de línea de comando Oh ... debo estar cansado. Veo lo que hiciste alli. Necesitas la opción de línea de comando.
Robert Benson
1
Gracias, @RobertBenson. No tengo idea de por qué puse eso ;allí.
manatwork
3

Lua , 53 30 bytes

Reemplaza todo hasta el último .con la cadena vacía ''.

Paréntesis doble para seleccionar solo el primer valor de retorno de gsub.

Cualquier consejo de golf es bienvenido, estoy oxidado en lua ...

print(((...):gsub('.*%.','')))

Pruébalo en línea!

Felipe Nardi Batista
fuente
3

Java 8, 52 27 bytes

s->s.replaceAll(".*\\.","")

Pruébalo aquí.

Reemplace todo antes del último punto (y el punto mismo) con nada.

Esto es más corto que usar split ( s->s.split("\\.")[s.split("\\.").length-1];) o substring ( s->s.substring(s.lastIndexOf('.'));).

Kevin Cruijssen
fuente
3

Taxi , 1397 bytes

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.[a]Pickup a passenger going to Narrow Path Park.Go to Narrow Path Park:n 1 l 1 r 1 l.Go to Chop Suey:e 1 r 1 l 1 r.Switch to plan "b" if no one is waiting.Switch to plan "a".[b]Go to The Babelfishery:n 1 l 1 l.[c]Go to Fueler Up:n.Go to Joyless Park:n 2 r.Go to Narrow Path Park:w 1 r 3 l.Pickup a passenger going to Cyclone.Go to Cyclone:w 1 l 1 r 2 l.Pickup a passenger going to Crime Lab.Pickup a passenger going to Joyless Park.'.' is waiting at Writer's Depot.Go to Writer's Depot:s.Pickup a passenger going to Crime Lab.Go to Crime Lab:n 1 r 2 r 2 l.Switch to plan "c" if no one is waiting.Go to Narrow Path Park:n 5 l.[d]Pickup a passenger going to Chop Suey.Go to Chop Suey:e 1 r 1 l 1 r.Go to Narrow Path Park:n 1 l 1 r 1 l.Switch to plan "e" if no one is waiting.Switch to plan "d".[e]Go to Joyless Park:e 1 r 3 l.Switch to plan "f" if no one is waiting.Pickup a passenger going to Narrow Path Park.Go to Fueler Up:w 1 l.Go to Narrow Path Park:n 4 l.Switch to plan "e".[f]Go to Narrow Path Park:w 1 r 3 l.[g]Switch to plan "h" if no one is waiting.Pickup a passenger going to KonKat's.Go to KonKat's:e 1 r.Pickup a passenger going to KonKat's.Go to Narrow Path Park:n 2 l.Switch to plan "g".[h]Go to KonKat's:e 1 r.Pickup a passenger going to Post Office.Go to Post Office:s 3 r 1 l.

Pruébalo en línea!

El taxi no tiene una función inversa, por lo que se disparó rápidamente. La lógica es:

  1. Romper la cadena en caracteres
  2. Invertir la matriz
  3. Iterar a través de cada uno hasta que se encuentre un período, almacenando cada uno en una matriz FIFO
  4. Vacíe la matriz (porque solo hay una matriz LIFO disponible)
  5. Volcar la matriz FIFO en la matriz LIFO
  6. Concatenar la matriz LIFO y la salida
Tostadas de ingeniero
fuente
3

Vim, 5 bytes

$F.d0

Explicación: encuentre el último .en la línea, elimine todo antes

Otro enfoque más largo, pero en mi opinión sigue siendo interesante con 9 bytes (observe la nueva línea final)

d/.*\./e

Este funciona de manera similar, 5 bytes (nuevamente, siguiendo una nueva línea):

d?\.

oktupol
fuente
2

Brain-Flak , 84 bytes

Incluye +2 para -rc

(()){{}([((((()()()){}())()){}{}){}]({}<>)<>)({()(<{}>)}{})}{}{{}}<>{}{({}<>)<>}<>

Pruébalo en línea!

# Push 1 to start the loop
(())

# Start loop
{{}

  # If TOS == 46 i.e. '.'
  ([((((()()()){}())()){}{}){}]({}<>)<>)({()(<{}>)}{})
  # ^------------------------^ ^-------^ 
  #           This is 46         Also, copy TOS to other stack

# End loop after the first '.'
}{}

# Delete everything from this stack
{{}}

# Delete the '.' that got copied
<>{}

# Copy everything back to reverse it to the correct order
{({}<>)<>}<>
Riley
fuente
2

Japt , 6 5 bytes

q'. o

Pruébalo en línea!

Explicación

 q'. o
Uq'. o
Uq'.    # Split the input at "."
     o # Return the last item
Luke
fuente
Cuando solo necesita devolver el último elemento de una matriz, puede usarlo oen lugar de gJ. (Aprendí ese truco de @obarakon hace un tiempo)
ETHproductions
2

jq, 15 14 caracteres

( 11 10 caracteres de código + 4 caracteres de opciones de línea de comando).

./"."|last

Ejecución de muestra:

bash-4.4$ jq -Rr './"."|last' <<< 'what..is..this..file'
file

Prueba en línea

hombre trabajando
fuente
2

Octava, 24 bytes

@(x)strsplit(x,'.'){end}

Crea una función anónima llamada ansque puede aceptar una cadena como entrada

Demo en línea

Suever
fuente