Qual é a extensão do arquivo?

10

Seu desafio é encontrar a extensão do arquivo de um nome de arquivo fornecido:

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

Você deve obter o texto do último . ou do último .até o final da string. A primeira correspondência de grupo de captura da expressão regular /\.([^.]+)$/funciona, assim como dividir a entrada em se .retornar a última.

O nome do arquivo sempre conterá pelo menos um ., mas pode conter vários .. (veja exemplos)

A entrada sempre corresponderá ^[.a-zA-Z0-9^!\[\]{}@$%+=]+$.

programmer5000
fonte
17
Considere usar o Sandbox no futuro para obter feedback sobre seus desafios antes de publicá-los no site principal.
Mego 16/05
1
codegolf.meta.stackexchange.com/a/12432/59376 - Entendi essa ideia do seu desafio.
Magic Octopus Urn
@carusocomputing nice challenge!
Programmer5000
1
por que os votos negativos? Esse desafio é "extremamente trivial" ou algo assim?
Abel Tom
O histórico de edições do @AbelTom sugere que os votos negativos foram causados ​​pela falta de especificações no primeiro rascunho desta pergunta.
Patrick Roberts

Respostas:

11

JavaScript (ES6), 19 bytes

Retorna o nome do arquivo completo quando não há extensão de arquivo. Suponho que esse seja um comportamento indefinido aceitável .

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
fonte
O objetivo do comportamento indefinido é que vale tudo. Embora os demônios nasais, embora ainda tenham comportamento indefinido, possam falhar na cláusula "sem programas maliciosos".
John Dvorak
10

Mathematica, 13 22 bytes

Edit: Não tenho certeza de como eu perdi o ".bashrc"caso de teste. Agradeço a Artyer por me manter honesto.

FileExtension["a"<>#]&

Se a entrada corresponder \.[^.]+, FileExtensionbasta retornar a string vazia, portanto, acrescentamos a letra a. Em qualquer outro caso, a adição anão afeta a saída de FileExtension.

ngenisis
fonte
11
Um Mathematica embutido ... nenhuma surpresa.
Programmer5000 #
1
Eu ficaria surpreso se não houvesse nenhum builtins mathematica para qualquer pergunta possível
sagiksp
Eu não tenho acesso a Mathematica, mas eu suspeito que .extresultaria em nada, o que failes para .bashrca necessidade de saída bashrc(Ele falhar em Mathics )
Artyer
O Mathematica precisa apenas de meta-built-ins Create Built-in XXXXXXXX.
Magic Octopus Urn
9

Festa pura, 13

echo ${1##*.}

Experimente online .

Trauma Digital
fonte
7

Japonês , 3 bytes

2 bytes de código, +1 para o hsinalizador.

q.

Explicação:

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

Experimente online!

Oliver
fonte
7

função c, 21

  • 1 byte salvo graças a @Dennis.
  • 3 bytes salvos graças a @JohanduToit.
  • 2 bytes salvos graças ao @Neil.
  • 1 byte salvo graças a @algmyr.
f(s){s=rindex(s,46);}

Experimente online .

Trauma Digital
fonte
1
Se você estiver bem com o uso de funções POSIX herdadas, poderá usar rindexpara salvar um byte.
algmyr
@algmyr Claro, ele funciona bem no TIO, então eu vou usá-lo. Eu nunca tinha ouvido falar rindex()antes - obrigado pela dica!
Digital Trauma
5

PHP, 21 bytes

<?=pathinfo($argn,4);

Experimente online!

é uma expressão mais curta para

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

pathinfo

PHP, 27 bytes

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

explodir

Experimente online!

PHP <7.0, 26 bytes

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

divisão preterida

Jörg Hülsermann
fonte
1
Você está contando uma nova linha à direita para a primeira? Deveria ter 27 bytes, não 28.
Conor O'Brien
@ ConorO'Brien Obrigado. Tenho contagem após copiar e colar da versão dividida um ``
Jörg Hülsermann
2
O pathinfo()baseado poderia ser <?=pathinfo($argn,4);.
Manatwork 17/05/19
4

Marca GNU , 12 bytes

$(suffix $1)

Não usando um builtin, 27 bytes:

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

Lote, 10 bytes

@echo %~x1

Estranhamente competitivo pela primeira vez.

Neil
fonte
4

V , 5 , 3 bytes

Como mais desta resposta é imprimível do que imprimível, aqui está um hexdump:

00000000: cd81 ae                                  ...

Experimente online!

Isso usa o algoritmo de Jan Dvorak , por acaso é uma codificação mais eficiente.

Explicação:

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

Solução antiga:

$T.d|
James
fonte
Explicação, por favor?
Erik the Outgolfer
@EriktheOutgolfer Done
James
Wait ®significa seguido por um ponto? Lol isso é estranho.
Erik the Outgolfer
3

Gelatina , 4 bytes

ṣ”.Ṫ

Um link monádico que pega o nome do arquivo e retorna a extensão sem avanço ..

Experimente online!

Quão?

Literalmente faz o que foi pedido ...

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

Go , 85 bytes

Ir é ... problemático.

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

Experimente online!

Uma amostra de parênteses do código:

()(){([])([()])}
totalmente humano
fonte
2
()(){([])([()])}- é um Brain-Flak válido?
Eush77 16/05
5
@ eush77 É tecnicamente válido o Brain-Flak, pois será executado sem erros, mas não faz nada de interessante / útil. É apenas o literal 2sem instruções / comandos ou qualquer coisa ou um loop infinito que aloca continuamente mais memória, dependendo da entrada.
James
Usando filepath.Extvai poupar algumas mordidas
powelles
3

JavaScript (ES6), 33 31 28 bytes

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

A alteração de especificação nos comentários elimina a necessidade +1.

-3 bytes graças a nderscore

Stephen
fonte
1
-3 com sliceexecução de cadeia de caracteres e modelo:s=>s.slice(s.lastIndexOf`.`)
nderscore 16/05
3

Lisp comum, 57 bytes

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

Experimente online (adicionou alguns bytes para chamar essa função anônima e exibir a string retornada)

Explicação

(#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

Eu recebo substring de string invertida, começando em 0, terminando neste


fonte
3

Gema, 3 caracteres

*.=

Exemplo de execução:

bash-4.4$ gema '*.=' <<< 'what..is..this..file'
file
homem a trabalhar
fonte
3

MATL, 8 7 bytes

46&YbO)

Experimente no MATL Online !

Explicação

        % 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
fonte
3

Javascript (ES5), 38 bytes

function(s){return s.split(".").pop()}
Pecado
fonte
2
Para que você saiba, o voto negativo foi convertido automaticamente pelo usuário da Comunidade quando sua resposta foi editada. Eu considero isso um bug .
Dennis
por favor conserte isso se puder!
Sinned
3

C #, 33 41 bytes

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

Edite conforme sugerido:

using System.Linq;a=>a.Split('.').Last();
LiefdeWen
fonte
1
Você precisa incluir using Sytem.Linq;na sua contagem de bytes
TheLethalCoder 17/17/17
E também a=>a.Split('.').Last();retorno implícito é mais curto
TheLethalCoder
Graças @TheLethalCoder para correções sugeridas, ainda novos a este :)
LiefdeWen
Estou surpreso este é mais do que a minha solução usando Path...
TheLethalCoder
3

Awk, 14 13 caracteres

( Código de 10 9 caracteres + opção de linha de comando de 4 caracteres.)

{$0=$NF}1

Graças a:

  • Robert Benson por detectar o ponto e vírgula desnecessário (caractere -1)

Exemplo de execução:

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
homem a trabalhar
fonte
Você não precisa do ;. e apenas para sua informação, awk '{$0=$NF}1 funciona, nenhuma opção de linha de comando é necessária. Oh ... eu devo estar cansado. Eu vi o que você fez lá. Você precisa da opção de linha de comando.
Robert Benson
1
Obrigado, @RobertBenson. Eu não tenho idéia do por que coloquei isso ;lá.
Manatwork 17/05/19
3

Lua , 53 30 bytes

Substitui tudo até o último .pela string vazia'' .

Parêntese duplo para selecionar apenas o primeiro valor de retorno de gsub .

Quaisquer dicas de golfe são bem-vindas, estou enferrujado na lua ...

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

Experimente online!

Felipe Nardi Batista
fonte
3

Java 8, 52 27 bytes

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

Experimente aqui.

Substitua tudo antes do último ponto (e o próprio ponto) por nada.

Isso é mais curto do que usar split ( s->s.split("\\.")[s.split("\\.").length-1];) ou substring ( s->s.substring(s.lastIndexOf('.'));).

Kevin Cruijssen
fonte
3

Táxi , 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.

Experimente online!

O táxi não tem uma função reversa, então isso aumentou rapidamente. A lógica é:

  1. Quebrar a corda em caracteres
  2. Inverter a matriz
  3. Itere cada um até que um período seja encontrado, armazenando cada um em uma matriz FIFO
  4. Esvazie a matriz (porque há apenas uma matriz LIFO disponível)
  5. Despejar a matriz FIFO na matriz LIFO
  6. Concatene a matriz e a saída LIFO
Engenheiro Toast
fonte
3

Vim, 5 bytes

$F.d0

Explicação: find last . da fila, exclua tudo antes dele

Outro, mais longo, mas na minha opinião ainda abordagem interessante com 9 bytes (observe a nova linha à direita)

d/.*\./e

Este funciona da mesma forma, 5 bytes (novamente, seguindo uma nova linha):

d?\.

oktupol
fonte
2

Flacidez Cerebral , 84 bytes

Inclui +2 para -rc

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

Experimente online!

# 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
fonte
2

Japonês , 6 5 bytes

q'. o

Experimente online!

Explicação

 q'. o
Uq'. o
Uq'.    # Split the input at "."
     o # Return the last item
Lucas
fonte
Quando você só precisa retornar o último item de uma matriz, pode usar ono lugar de gJ. (Aprendi esse truque de @obarakon uma volta enquanto)
ETHproductions
2

jq, 15 14 caracteres

( Código de 11 10 caracteres + opções de linha de comando de 4 caracteres.)

./"."|last

Exemplo de execução:

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

Teste on-line

homem a trabalhar
fonte
2

Oitava, 24 bytes

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

Cria uma função anônima chamada ans que pode aceitar uma string como entrada

Demo Online

Suever
fonte