Was ist die Dateierweiterung?

10

Ihre Herausforderung besteht darin, die Dateierweiterung eines angegebenen Dateinamens zu finden:

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

Sie müssen den Text vom letzten . oder nach dem letzten .bis zum Ende der Zeichenfolge abrufen. Die erste Erfassungsgruppenübereinstimmung des regulären Ausdrucks /\.([^.]+)$/funktioniert ebenso wie die Aufteilung der Eingabe auf .s und die Rückgabe der letzten.

Der Dateiname enthält immer mindestens einen ., kann jedoch mehrere enthalten .. (siehe Beispiele)

Die Eingabe wird immer übereinstimmen ^[.a-zA-Z0-9^!\[\]{}@$%+=]+$.

programmer5000
quelle
17
Bitte erwägen Sie, die Sandbox in Zukunft zu verwenden, um Feedback zu Ihren Herausforderungen zu erhalten, bevor Sie sie auf der Hauptseite veröffentlichen.
Mego
1
codegolf.meta.stackexchange.com/a/12432/59376 - Diese Idee kam von Ihrer Herausforderung.
Magic Octopus Urn
@carusocomputing schöne Herausforderung!
Programmierer5000
1
Warum die negativen Stimmen? Ist diese Herausforderung "außerordentlich trivial" oder so?
Abel Tom
@AbelTom Bearbeitungsverlauf würde vorschlagen, dass Abstimmungen wegen fehlender Spezifikationen im ersten Entwurf dieser Frage vorgenommen wurden.
Patrick Roberts

Antworten:

11

JavaScript (ES6), 19 Byte

Gibt den vollständigen Dateinamen zurück, wenn keine Dateierweiterung vorhanden ist. Ich nehme an, dies ist ein akzeptables undefiniertes Verhalten .

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
quelle
Der Punkt undefinierten Verhaltens ist, dass alles geht. Obwohl Nasendämonen, obwohl sie noch nicht definiert sind, die Klausel "Keine bösartigen Programme" möglicherweise nicht erfüllen.
John Dvorak
10

Mathematica, 13 22 Bytes

Bearbeiten: Nicht sicher, wie ich den ".bashrc"Testfall verpasst habe. Vielen Dank an Artyer, der mich ehrlich gehalten hat.

FileExtension["a"<>#]&

Wenn die Eingabe übereinstimmt \.[^.]+, wird FileExtensionnur die leere Zeichenfolge zurückgegeben, sodass der Buchstabe vorangestellt wird a. In jedem anderen Fall wirkt sich adas Voranstellen nicht auf die Ausgabe von aus FileExtension.

Genisis
quelle
11
Eine eingebaute Mathematica ... keine Überraschung.
Programmierer5000
1
Ich wäre überrascht, wenn es keine mathematischen Einbauten für eine mögliche Frage
gäbe
Ich habe keinen Zugriff auf Mathematica, aber ich würde vermuten, dass .extdies zu nichts führen würde, was fehlschlägt, wenn .bashrceine Ausgabe erforderlich ist bashrc(es schlägt in Mathematik fehl )
Artyer
Mathematica muss nur Meta-Einbauten Create Built-in XXXXXXXX.
Magic Octopus Urn
7

c Funktion, 21

  • 1 Byte dank @Dennis gespeichert.
  • 3 Bytes dank @JohanduToit gespeichert.
  • 2 Bytes dank @Neil gespeichert.
  • 1 Byte dank @algmyr gespeichert.
f(s){s=rindex(s,46);}

Probieren Sie es online aus .

Digitales Trauma
quelle
1
Wenn Sie mit der Verwendung älterer POSIX-Funktionen einverstanden sind, können Sie rindexein Byte speichern.
Algmyr
@algmyr Sicher, es funktioniert gut auf TIO, also werde ich es verwenden. Ich hatte noch nie davon gehört rindex()- danke für den Tipp!
Digitales Trauma
5

PHP, 21 Bytes

<?=pathinfo($argn,4);

Probieren Sie es online aus!

ist ein kürzerer Ausdruck für

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

pathinfo

PHP, 27 Bytes

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

explodieren

Probieren Sie es online aus!

PHP <7,0, 26 Bytes

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

veralteter Split

Jörg Hülsermann
quelle
1
Zählen Sie eine nachfolgende Newline für die erste? Es sollte 27 Bytes sein, nicht 28.
Conor O'Brien
@ ConorO'Brien Danke. Ich habe nach dem Kopieren und Einfügen aus der geteilten Version ein `` gezählt
Jörg Hülsermann
2
Der pathinfo()Basierte könnte sein <?=pathinfo($argn,4);.
Manatwork
4

GNU Make , 12 Bytes

$(suffix $1)

Keine eingebaute, 27 Bytes:

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

Stapel, 10 Bytes

@echo %~x1

Ausnahmsweise einmal wettbewerbsfähig.

Neil
quelle
4

V , 5 , 3 Bytes

Da mehr von dieser Antwort nicht druckbar als druckbar ist, ist hier ein Hexdump:

00000000: cd81 ae                                  ...

Probieren Sie es online aus!

Dies verwendet den Algorithmus von Jan Dvorak , es ist einfach eine effizientere Codierung davon.

Erläuterung:

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

Alte Lösung:

$T.d|
James
quelle
Erklärung bitte?
Erik der Outgolfer
@EriktheOutgolfer Fertig
James
Warten ®heißt gefolgt von einem Punkt? Lol das ist komisch.
Erik der Outgolfer
3

Gelee , 4 Bytes

ṣ”.Ṫ

Ein monadischer Link, der den Dateinamen übernimmt und die Erweiterung ohne führenden Namen zurückgibt ..

Probieren Sie es online aus!

Wie?

Tut buchstäblich was gefragt wurde ...

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

Los , 85 Bytes

Go ist ... mühsam.

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

Probieren Sie es online aus!

Ein Beispiel für Klammern aus dem Code:

()(){([])([()])}
total menschlich
quelle
2
()(){([])([()])}- Ist es ein gültiger Brain-Flak?
Eush77
5
@ eush77 Es ist technisch gültig Brain-Flak, da es fehlerfrei läuft, aber nichts Interessantes / Nützliches tut. Es ist entweder nur das Literal 2ohne Anweisungen / Befehle oder irgendetwas oder eine Endlosschleife, die je nach Eingabe kontinuierlich mehr Speicher zuweist.
James
Die Verwendung filepath.Ext
erspart
3

JavaScript (ES6), 33 31 28 Byte

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

Durch die Änderung der Spezifikation in Kommentaren entfällt die Notwendigkeit +1.

-3 Bytes dank nderscore

Stephen
quelle
1
-3 mit sliceund Vorlage String Ausführung:s=>s.slice(s.lastIndexOf`.`)
Nderscore
3

Common Lisp, 57 Bytes

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

Probieren Sie es online aus (einige Bytes wurden hinzugefügt, um diese anonyme Funktion aufzurufen und die zurückgegebene Zeichenfolge anzuzeigen).

Erläuterung

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

Ich erhalte einen Teilstring eines umgekehrten Strings, der bei 0 beginnt und damit endet


quelle
3

Gema, 3 Zeichen

*.=

Probelauf:

bash-4.4$ gema '*.=' <<< 'what..is..this..file'
file
Mann bei der Arbeit
quelle
3

MATL, 8 7 Bytes

46&YbO)

Probieren Sie es bei MATL Online aus !

Erläuterung

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

Javascript (ES5), 38 Bytes

function(s){return s.split(".").pop()}
Gesündigt
quelle
2
Damit Sie wissen, wurde die Abwertung automatisch vom Community-Benutzer abgegeben, als Ihre Antwort bearbeitet wurde. Ich halte das für einen Fehler .
Dennis
Bitte beheben Sie das, wenn Sie können!
Sinned
3

C #, 33 41 Bytes

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

Bearbeiten wie vorgeschlagen:

using System.Linq;a=>a.Split('.').Last();
LiefdeWen
quelle
1
Sie müssen using Sytem.Linq;in Ihre
Byteanzahl aufnehmen
Und auch die a=>a.Split('.').Last();implizite Rückkehr ist kürzer
TheLethalCoder
@ TheLethalCoder Vielen Dank für die vorgeschlagenen Korrekturen, noch neu in diesem :)
LiefdeWen
Ich bin überrascht, dass dies länger ist als meine Lösung mit Path...
TheLethalCoder
3

Awk, 14 13 Zeichen

( 10 9 Zeichen Code + 4 Zeichen Befehlszeilenoption.)

{$0=$NF}1

Dank an:

  • Robert Benson für das Erkennen des unnötigen Semikolons (-1 Zeichen)

Probelauf:

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
Mann bei der Arbeit
quelle
Das brauchst du nicht ;. und nur zu Ihrer Information, awk '{$0=$NF}1 funktioniert, keine Befehlszeilenoption erforderlich. Oh ... ich muss müde sein. Ich sehe, was du dort getan hast. Sie benötigen die Befehlszeilenoption.
Robert Benson
1
Vielen Dank, @RobertBenson. Ich habe keine Ahnung, warum ich das ;dort abgelegt habe .
Manatwork
3

Lua , 53 30 Bytes

Ersetzt alles bis zum letzten .durch die leere Zeichenfolge'' .

Doppelte Klammer, um nur den ersten Rückgabewert von auszuwählen gsub .

Alle Golftipps sind willkommen, ich bin rostig in Lua ...

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

Probieren Sie es online aus!

Felipe Nardi Batista
quelle
3

Java 8, 52 27 Bytes

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

Probieren Sie es hier aus.

Ersetzen Sie alles vor dem letzten Punkt (und dem Punkt selbst) durch nichts.

Dies ist kürzer als bei Verwendung von split ( s->s.split("\\.")[s.split("\\.").length-1];) oder substring ( s->s.substring(s.lastIndexOf('.'));).

Kevin Cruijssen
quelle
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.

Probieren Sie es online aus!

Das Taxi hat keine Rückwärtsfunktion, daher stieg diese ziemlich schnell an. Die Logik lautet:

  1. Teilen Sie die Zeichenfolge in Zeichen auf
  2. Kehren Sie das Array um
  3. Durchlaufen Sie jeden Punkt, bis ein Punkt gefunden ist, und speichern Sie ihn in einem FIFO-Array
  4. Leeren Sie das Array (da nur ein LIFO-Array verfügbar ist)
  5. Speichern Sie das FIFO-Array im LIFO-Array
  6. Verketten Sie das LIFO-Array und die Ausgabe
Ingenieur Toast
quelle
3

Vim, 5 Bytes

$F.d0

Erläuterung: Finde die letzte .Zeile und lösche alles davor

Ein weiterer, längerer, aber meiner Meinung nach immer noch interessanter Ansatz mit 9 Bytes (beachten Sie die nachfolgende neue Zeile)

d/.*\./e

Dieser funktioniert ähnlich, 5 Bytes (wieder nachfolgende neue Zeile):

d?\.

Oktupol
quelle
2

Brain-Flak , 84 Bytes

Beinhaltet +2 für -rc

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

Probieren Sie es online aus!

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

Japt , 6 5 Bytes

q'. o

Probieren Sie es online aus!

Erläuterung

 q'. o
Uq'. o
Uq'.    # Split the input at "."
     o # Return the last item
Luke
quelle
Wenn Sie nur das letzte Element eines Arrays zurückgeben müssen, können Sie es oanstelle von verwenden gJ. (Habe diesen Trick vor einiger Zeit von @obarakon gelernt)
ETHproductions
2

jq, 15 14 Zeichen

( 11 10 Zeichen Code + 4 Zeichen Befehlszeilenoptionen.)

./"."|last

Probelauf:

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

Online-Test

Mann bei der Arbeit
quelle
2

Oktave, 24 Bytes

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

Erstellt eine anonyme Funktion mit dem Namen, ansdie eine Zeichenfolge als Eingabe akzeptieren kann

Online-Demo

Suever
quelle