Quelle est l'extension du fichier?

10

Votre défi est de trouver l'extension de fichier d'un nom de fichier fourni:

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

Vous devez obtenir le texte de la dernière . ou de la dernière .à la fin de la chaîne. La première correspondance de groupe de capture de l'expression régulière /\.([^.]+)$/fonctionne, tout comme le fractionnement de l'entrée sur .s et le retour de la dernière.

Le nom du fichier en contiendra toujours au moins un ., mais il peut en contenir plusieurs .. (voir exemples)

L'entrée correspondra toujours ^[.a-zA-Z0-9^!\[\]{}@$%+=]+$.

programmer5000
la source
17
Veuillez envisager d'utiliser le bac à sable à l'avenir pour obtenir des commentaires sur vos défis avant de les publier sur le site principal.
Mego
1
codegolf.meta.stackexchange.com/a/12432/59376 - Vous avez cette idée de votre défi.
Urne de poulpe magique
@carusocomputing beau défi!
programmer5000
1
pourquoi les votes négatifs? Ce défi est-il "excessivement trivial"?
Abel Tom
L'historique des modifications @AbelTom suggérerait que les votes négatifs étaient dus au manque de spécifications dans le premier brouillon de cette question.
Patrick Roberts

Réponses:

11

JavaScript (ES6), 19 octets

Renvoie le nom de fichier complet lorsqu'il n'y a pas d'extension de fichier. Je suppose que c'est un comportement non défini acceptable .

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
la source
Le point de comportement indéfini est que tout se passe. Bien que les démons nasaux, bien que leur comportement soit encore indéfini, peuvent échouer à la clause "pas de programmes malveillants".
John Dvorak
10

Mathematica, 13 22 octets

Edit: Je ne sais pas comment j'ai raté le ".bashrc"cas de test. Merci à Artyer de m'avoir gardé honnête.

FileExtension["a"<>#]&

Si l'entrée correspond \.[^.]+, alors FileExtensionrenvoie simplement la chaîne vide, donc nous ajoutons la lettre a. Dans tous les autres cas, le préfixe an'affecte pas la sortie de FileExtension.

ngenisis
la source
11
Un Mathematica intégré ... pas de surprise.
programmer5000
1
Je serais surpris s'il n'y avait pas de buildins mathématique pour une question possible
sagiksp
Je n'ai pas accès à Mathematica, mais je soupçonne que cela .extn'aboutirait à rien, ce qui échoue pour .bashrcavoir besoin de produire bashrc(il échoue en mathématiques )
Artyer
Apparemment ça marche
programmer5000
Mathematica a juste besoin de méta-intégrés Create Built-in XXXXXXXX.
Urne de poulpe magique
7

fonction c, 21

  • 1 octet enregistré grâce à @Dennis.
  • 3 octets enregistrés grâce à @JohanduToit.
  • 2 octets enregistrés grâce à @Neil.
  • 1 octet enregistré grâce à @algmyr.
f(s){s=rindex(s,46);}

Essayez-le en ligne .

Traumatisme numérique
la source
1
Si vous êtes d'accord avec l'utilisation des fonctions POSIX héritées, vous pouvez utiliser rindexpour enregistrer un octet.
algmyr
@algmyr Bien sûr, cela fonctionne très bien sur TIO, donc je vais l'utiliser. Je n'avais jamais entendu parler rindex()auparavant - merci pour le conseil!
Digital Trauma
5

PHP, 21 octets

<?=pathinfo($argn,4);

Essayez-le en ligne!

est une expression plus courte pour

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

pathinfo

PHP, 27 octets

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

exploser

Essayez-le en ligne!

PHP <7,0, 26 octets

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

scission obsolète

Jörg Hülsermann
la source
1
Comptez-vous une nouvelle ligne de fin pour la première? Il devrait être de 27 octets, pas de 28.
Conor O'Brien
@ ConorO'Brien Merci .J'ai compté après copier et coller à partir de la version fractionnée un ``
Jörg Hülsermann
2
La pathinfo()base pourrait être <?=pathinfo($argn,4);.
manatwork
4

Marque GNU , 12 octets

$(suffix $1)

Ne pas utiliser de fonction intégrée, 27 octets:

$(lastword $(subst ., ,$1))
eush77
la source
4

Lot, 10 octets

@echo %~x1

Étrangement compétitif pour une fois.

Neil
la source
4

V , 5 , 3 octets

Puisqu'une plus grande partie de cette réponse n'est pas imprimable qu'imprimable, voici un hexdump:

00000000: cd81 ae                                  ...

Essayez-le en ligne!

Cela utilise l'algorithme de Jan Dvorak , il se trouve que c'est un encodage plus efficace.

Explication:

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

Ancienne solution:

$T.d|
James
la source
Explication s'il vous plait?
Erik the Outgolfer
@EriktheOutgolfer Done
James
Attendre ®signifie suivi d'un point? Lol c'est bizarre.
Erik the Outgolfer
3

Gelée , 4 octets

ṣ”.Ṫ

Un lien monadique prenant le nom du fichier et renvoyant l'extension sans interligne ..

Essayez-le en ligne!

Comment?

Fait littéralement ce qui a été demandé ...

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

Aller , 85 octets

Aller est ... gênant.

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

Essayez-le en ligne!

Un exemple de parenthèses du code:

()(){([])([()])}
totalement humain
la source
2
()(){([])([()])}- est-ce un Brain-Flak valide?
eush77
5
@ eush77 C'est Brain-Flak techniquement valide , car il fonctionnera sans erreur, mais il ne fait rien d'intéressant / utile. C'est juste le littéral 2sans instructions / commandes ou quoi que ce soit ou une boucle infinie qui alloue continuellement plus de mémoire, selon l'entrée.
James
L'utilisation vous filepath.Extfera économiser quelques bouchées
powelles
3

JavaScript (ES6), 33 31 28 octets

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

La modification des spécifications dans les commentaires supprime la nécessité de +1.

-3 octets grâce à nderscore

Stephen
la source
1
-3 avec sliceexécution de chaîne de modèle et:s=>s.slice(s.lastIndexOf`.`)
nderscore
3

Lisp commun, 57 octets

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

Essayez-le en ligne (ajouté quelques octets pour appeler cette fonction anonyme et afficher la chaîne renvoyée)

Explication

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

Je reçois une sous-chaîne de chaîne inversée, à partir de 0, se terminant sur ce


la source
3

Gema, 3 personnages

*.=

Exemple d'exécution:

bash-4.4$ gema '*.=' <<< 'what..is..this..file'
file
homme au travail
la source
3

MATL, 8 7 octets

46&YbO)

Essayez-le sur MATL Online !

Explication

        % 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
la source
3

Javascript (ES5), 38 octets

function(s){return s.split(".").pop()}
Sinned
la source
2
Juste pour que vous le sachiez, le downvote a été automatiquement casté par l'utilisateur de la communauté lorsque votre réponse a été modifiée. Je considère cela comme un bug .
Dennis
plz corriger cela si vous le pouvez!
Péché
3

C #, 33 41 octets

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

Modifiez comme suggéré:

using System.Linq;a=>a.Split('.').Last();
LiefdeWen
la source
1
Vous devez inclure using Sytem.Linq;dans votre nombre d'octets
TheLethalCoder
Et le a=>a.Split('.').Last();retour implicite est également plus court
TheLethalCoder
@TheLethalCoder Merci pour les correctifs suggérés, encore nouveau pour cela :)
LiefdeWen
Je suis surpris que ce soit plus long que ma solution en utilisant Path...
TheLethalCoder
3

Awk, 14 13 caractères

( Code de 10 9 caractères + option de ligne de commande de 4 caractères.)

{$0=$NF}1

Grâce à:

  • Robert Benson pour avoir repéré le point-virgule inutile (-1 caractère)

Exemple d'exécution:

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
homme au travail
la source
Vous n'en avez pas besoin ;. et juste FYI, awk '{$0=$NF}1 fonctionne, aucune option de ligne de commande nécessaire. Oh ... je dois être fatigué. Je vois ce que tu as fait là. Vous avez besoin de l'option de ligne de commande.
Robert Benson
1
Merci, @RobertBenson. Je ne sais pas pourquoi je mets ça ;là.
manatwork
3

Lua , 53 30 octets

Remplace tout jusqu'au dernier . par la chaîne vide ''.

Double parenthèse pour sélectionner uniquement la première valeur de retour de gsub .

Tous les conseils de golf sont les bienvenus, je suis rouillé à Lua ...

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

Essayez-le en ligne!

Felipe Nardi Batista
la source
3

Java 8, 52 27 octets

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

Essayez-le ici.

Remplacez tout avant le dernier point (et le point lui-même) par rien.

C'est plus court que d'utiliser split ( s->s.split("\\.")[s.split("\\.").length-1];) ou substring ( s->s.substring(s.lastIndexOf('.'));).

Kevin Cruijssen
la source
3

Taxi , 1397 octets

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.

Essayez-le en ligne!

Le taxi n'a pas de fonction inverse, donc ce ballon a volé assez rapidement. La logique est:

  1. Divisez la chaîne en caractères
  2. Inverser le tableau
  3. Itérer à travers chacun jusqu'à ce qu'une période soit trouvée, en stockant chacun dans un tableau FIFO
  4. Vider le tableau (car il n'y a qu'un seul tableau LIFO disponible)
  5. Vider le tableau FIFO dans le tableau LIFO
  6. Concaténer le tableau LIFO et la sortie
Ingénieur Toast
la source
3

Vim, 5 octets

$F.d0

Explication: rechercher la dernière .ligne, supprimer tout avant

Une autre approche, plus longue, mais à mon avis toujours intéressante avec 9 octets (remarquez la nouvelle ligne de fin)

d/.*\./e

Celui-ci fonctionne de manière similaire, 5 octets (encore une fois, la nouvelle ligne de fin):

d?\.

oktupol
la source
2

Brain-Flak , 84 octets

Comprend +2 pour -rc

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

Essayez-le en ligne!

# 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
la source
2

Japt , 6 5 octets

q'. o

Essayez-le en ligne!

Explication

 q'. o
Uq'. o
Uq'.    # Split the input at "."
     o # Return the last item
Luc
la source
Lorsque vous devez uniquement renvoyer le dernier élément d'un tableau, vous pouvez utiliser oà la place de gJ. (J'ai appris ce truc de @obarakon il y a quelque temps)
ETHproductions
2

jq, 15 14 caractères

( 11 code de 10 caractères + 4 options de ligne de commande de caractères.)

./"."|last

Exemple d'exécution:

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

Test en ligne

homme au travail
la source
2

Octave, 24 octets

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

Crée une fonction anonyme nommée ans qui peut accepter une chaîne en entrée

Démo en ligne

Suever
la source