Qual è l'estensione del file?


10

La tua sfida è trovare l'estensione del file di un nome file fornito:

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

È necessario ottenere il testo dall'ultimo . o dall'ultimo .alla fine della stringa. La prima corrispondenza del gruppo di acquisizione dell'espressione regolare /\.([^.]+)$/funziona, così come la suddivisione dell'input su se .la restituzione dell'ultima.

Il nome del file conterrà sempre almeno uno ., ma può contenere più .. (vedi esempi)

L'input corrisponderà sempre ^[.a-zA-Z0-9^!\[\]{}@$%+=]+$.


17
Ti consigliamo di utilizzare Sandbox in futuro per ottenere feedback sulle tue sfide prima di pubblicarle sul sito principale.
Mego,

1
codegolf.meta.stackexchange.com/a/12432/59376 - Hai avuto questa idea dalla tua sfida.
Magic Octopus Urn

@carusocomputing bella sfida!
programmatore

1
perché i voti negativi? Questa sfida è "estremamente banale" o giù di lì?
Abel Tom,

La cronologia delle modifiche di @AbelTom suggerirebbe che i voti negativi erano dovuti alla mancanza di specifiche nella prima bozza di questa domanda.
Patrick Roberts,

Risposte:



11

JavaScript (ES6), 19 byte

Restituisce il nome file completo quando non è presente alcuna estensione. Suppongo che questo sia un comportamento indefinito accettabile .

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("T00M@n3KaPZ.h0wC[]h")) // -> h0wC[]h
console.log(f(".bashrc")) // -> bashrc


Il punto di comportamento indefinito è che tutto va bene. Tuttavia, i demoni nasali, pur essendo un comportamento ancora indefinito, potrebbero non rispettare la clausola "nessun programma dannoso".
John Dvorak,

10

Mathematica, 13 22 byte

Modifica: non sono sicuro di come ho perso il ".bashrc"test case. Grazie ad Artyer per avermi reso onesto.

FileExtension["a"<>#]&

Se l'input corrisponde \.[^.]+, FileExtensionrestituisce solo la stringa vuota, quindi anteponiamo la lettera a. In ogni altro caso, anteporre anon influisce sull'output di FileExtension.


11
Un built-in Mathematica ... nessuna sorpresa.
programmatore

1
Sarei sorpreso se non ci fossero builtin matematica per qualsiasi domanda possibile
sagiksp

Non ho accesso a Mathematica, ma sospetto che .extciò non comporterebbe nulla, il che non riesce per la .bashrcnecessità di produrre bashrc(fallisce in matematica )
Artyer


Mathematica ha solo bisogno di meta built-in Create Built-in XXXXXXXX.
Magic Octopus Urn,




7

funzione c, 21

  • 1 byte salvato grazie a @Dennis.
  • 3 byte salvati grazie a @JohanduToit.
  • 2 byte salvati grazie a @Neil.
  • 1 byte salvato grazie a @algmyr.
f(s){s=rindex(s,46);}

Provalo online .


1
Se stai bene usando le funzioni POSIX legacy puoi usare rindexper salvare un byte.
algmyr,

@algmyr Certo, funziona bene su TIO, quindi lo userò. Non avevo mai sentito parlare rindex()prima - grazie per la punta!
Digital Trauma,

5

PHP, 21 byte

<?=pathinfo($argn,4);

Provalo online!

è un'espressione più breve per

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

pathinfo

PHP, 27 byte

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

esplodere

Provalo online!

PHP <7.0, 26 byte

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

divisione obsoleta


1
Stai contando una nuova riga finale per la prima? Dovrebbero essere 27 byte, non 28.
Conor O'Brien,

@ ConorO'Brien Grazie. Ho contato dopo copia e incolla dalla versione divisa un ``
Jörg Hülsermann

2
Quello pathinfo()basato potrebbe essere <?=pathinfo($argn,4);.
arte


4

GNU Make , 12 byte

$(suffix $1)

Non utilizzando un built-in, 27 byte:

$(lastword $(subst ., ,$1))

4

Lotto, 10 byte

@echo %~x1

Stranamente competitivo per una volta.


4

V , 5 , 3 byte

Poiché più di questa risposta non è stampabile che stampabile, ecco un hexdump:

00000000: cd81 ae                                  ...

Provalo online!

Questo utilizza l'algoritmo di Jan Dvorak , sembra solo essere una sua codifica più efficiente.

Spiegazione:

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

Vecchia soluzione:

$T.d|

Spiegazione per favore?
Erik the Outgolfer,

@EriktheOutgolfer Fatto
James,

Aspettare ®significa seguito da un punto? Lol è strano.
Erik the Outgolfer,


3

Gelatina , 4 byte

ṣ”.Ṫ

Un collegamento monadico che prende il nome del file e restituisce l'estensione senza lead ..

Provalo online!

Come?

Fa letteralmente ciò che è stato chiesto ...

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

3

Vai , 85 byte

Go è ... fastidioso.

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

Provalo online!

Un esempio di parentesi dal codice:

()(){([])([()])}

2
()(){([])([()])}- è un Brain-Flak valido?
eush77,

5
@ eush77 È tecnicamente valido Brain-Flak, poiché funzionerà senza errori, ma non fa nulla di interessante / utile. O è solo il letterale 2senza istruzioni / comandi o altro o un ciclo infinito che alloca continuamente più memoria, a seconda dell'input.
James,

L'uso filepath.Extti farà risparmiare alcuni morsi
Powelles,

3

JavaScript (ES6), 33 31 28 byte

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

La modifica delle specifiche nei commenti elimina la necessità di +1 .

-3 byte grazie a nderscore


1
-3 con sliceed esecuzione della stringa del modello:s=>s.slice(s.lastIndexOf`.`)
nderscore,

3

Lisp comune, 57 byte

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

Provalo online (aggiunti alcuni byte per chiamare questa funzione anonima e visualizzare la stringa restituita)

Spiegazione

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

Ottengo la sottostringa della stringa inversa, a partire da 0, finendo con questo


3

Gema, 3 personaggi

*.=

Esecuzione di esempio:

bash-4.4$ gema '*.=' <<< 'what..is..this..file'
file

3

MATL, 8 7 byte

46&YbO)

Provalo su MATL Online !

Spiegazione

        % 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

3

Javascript (ES5), 38 byte

function(s){return s.split(".").pop()}

2
Proprio per questo sai, il downvote è stato lanciato automaticamente dall'utente della Community quando la tua risposta è stata modificata. Lo considero un bug .
Dennis,

per favore risolvilo se puoi!
Sinned,

3

C #, 33 41 byte

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

Modifica come suggerito:

using System.Linq;a=>a.Split('.').Last();

1
Devi includere using Sytem.Linq;nel conteggio dei byte
TheLethalCoder

E anche il a=>a.Split('.').Last();ritorno implicito è più breve
TheLethalCoder

@TheLethalCoder Grazie per le correzioni suggerite, ancora nuovo a questo :)
LiefdeWen

Sono sorpreso che questo sia più lungo della mia soluzione usando Path...
TheLethalCoder

3

Awk, 14 13 caratteri

(Codice da 10 9 caratteri + opzione riga di comando da 4 caratteri).

{$0=$NF}1

Grazie a:

  • Robert Benson per aver individuato il punto e virgola non necessario (-1 carattere)

Esecuzione di esempio:

bash-4.4$ awk -F. '{$0=$NF}1' <<< $'hi.txt\ncarrot.meme\nlol\nwhat..is..this..file\n.bashrc\nT00M@n3KaPZ.h0wC[]h'
txt
meme
lol
file
bashrc
h0wC[]h

Non hai bisogno del ;. e solo FYI, awk '{$0=$NF}1 funziona, nessuna opzione da riga di comando necessaria. Oh ... devo essere stanco. Vedo quello che hai fatto lì. È necessaria l'opzione della riga di comando.
Robert Benson,

1
Grazie, @RobertBenson. Non ho idea del perché l'ho messo ;lì.
arte

3

Lua , 53 30 byte

Sostituisce tutto fino all'ultimo . con la stringa vuota ''.

Doppia parentesi per selezionare solo il primo valore restituito di gsub .

Tutti i consigli per il golf sono i benvenuti, sono arrugginito a Lua ...

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

Provalo online!


3

Java 8, 52 27 byte

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

Provalo qui.

Sostituisci tutto prima dell'ultimo punto (e il punto stesso) con niente.

È più breve rispetto all'uso di split ( s->s.split("\\.")[s.split("\\.").length-1];) o sottostringa ( s->s.substring(s.lastIndexOf('.'));).


3

Taxi , 1397 byte

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.

Provalo online!

Il taxi non ha una funzione di retromarcia, quindi è molto veloce. La logica è:

  1. Rompere la stringa in caratteri
  2. Invertire l'array
  3. Scorrere fino a quando non viene trovato un punto, memorizzandoli in un array FIFO
  4. Svuotare l'array (perché è disponibile un solo array LIFO)
  5. Dump dell'array FIFO nell'array LIFO
  6. Concatenare l'array e l'output LIFO

3

Vim, 5 byte

$F.d0

Spiegazione: trova l'ultimo . in linea, elimina tutto prima di esso

Un altro approccio più lungo, ma secondo me ancora interessante con 9 byte (notare la nuova riga finale)

d/.*\./e

Questo funziona in modo simile, 5 byte (di nuovo, trascinando una nuova riga):

d?\.


2

Brain-Flak , 84 byte

Include +2 per -rc

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

Provalo 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
{({}<>)<>}<>

2

Japt , 6 5 byte

q'. o

Provalo online!

Spiegazione

 q'. o
Uq'. o
Uq'.    # Split the input at "."
     o # Return the last item

Quando è necessario solo restituire l'ultimo elemento di un array, è possibile utilizzare oal posto di gJ. (Ho imparato quel trucco da @obarakon qualche tempo fa)
ETHproductions

2

jq, 15 14 caratteri

( 11 codice di 10 caratteri + 4 opzioni di riga di comando.)

./"."|last

Esecuzione di esempio:

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

Test online


2

Ottava, 24 byte

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

Crea una funzione anonima denominata ansche può accettare una stringa come input

Demo online

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.