Jakie jest rozszerzenie pliku?

10

Twoim wyzwaniem jest znalezienie rozszerzenia podanej nazwy pliku:

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

Musisz pobrać tekst od ostatniego . lub po ostatnim .do końca ciągu. /\.([^.]+)$/Działa pierwsze dopasowanie grupy przechwytywania wyrażenia regularnego , podobnie jak dzielenie danych wejściowych na .s i zwracanie ostatniego.

Nazwa pliku zawsze będzie zawierać co najmniej jeden ., ale może zawierać wiele .. (patrz przykłady)

Dane wejściowe zawsze będą pasować ^[.a-zA-Z0-9^!\[\]{}@$%+=]+$.

programmer5000
źródło
17
Rozważ skorzystanie z piaskownicy w przyszłości, aby uzyskać opinie na temat swoich wyzwań przed opublikowaniem ich na głównej stronie.
Mego
1
codegolf.meta.stackexchange.com/a/12432/59376 - Ten pomysł pochodzi od twojego wyzwania.
Magic Octopus Urn
@carusocomputing ładne wyzwanie!
programator5000
1
dlaczego negatywne głosy? Czy to wyzwanie jest „wyjątkowo trywialne”?
Abel Tom
Historia edycji @AbelTom sugerowałaby, że w pierwszym szkicu tego pytania głosowano za brakiem specyfikacji.
Patrick Roberts

Odpowiedzi:

11

JavaScript (ES6), 19 bajtów

Zwraca pełną nazwę pliku, gdy nie ma rozszerzenia pliku. Przypuszczam, że jest to dopuszczalne niezdefiniowane zachowanie .

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
źródło
Nieokreślone zachowanie polega na tym, że wszystko idzie. Chociaż demony nosowe, choć wciąż nieokreślone zachowanie, mogą nie spełniać klauzuli „brak szkodliwych programów”.
John Dvorak
10

Mathematica, 13 22 bajtów

Edycja: Nie jestem pewien, jak przegapiłem ".bashrc"przypadek testowy. Dziękuję Artyerowi za zachowanie mnie w uczciwości.

FileExtension["a"<>#]&

Jeśli dane wejściowe pasują \.[^.]+, to FileExtensionpo prostu zwraca pusty ciąg, więc poprzedzamy literę a. W każdym innym przypadku poprzedzanie anie wpływa na wynik FileExtension.

ngenisis
źródło
11
Wbudowana matematyka ... nic dziwnego.
programator5000
1
Byłbym zaskoczony, gdyby nie było żadnych wbudowanych funkcji matematycznych dla jakiegokolwiek pytania
sagiksp
Nie mam dostępu do Mathematiki, ale podejrzewałbym, że .extto nic nie da, co nie udaje się z .bashrckoniecznością uzyskania danych wyjściowych bashrc(nie działa w matematyce )
Artyer
Mathematica musi tylko mieć wbudowane meta Create Built-in XXXXXXXX.
Magic Octopus Urn
9

Pure Bash, 13

echo ${1##*.}

Wypróbuj online .

Cyfrowa trauma
źródło
7

funkcja c, 21

  • 1 bajt zapisany dzięki @Dennis.
  • 3 bajty zapisane dzięki @JohanduToit.
  • 2 bajty zapisane dzięki @Neil.
  • 1 bajt zapisany dzięki @algmyr.
f(s){s=rindex(s,46);}

Wypróbuj online .

Cyfrowa trauma
źródło
1
Jeśli nie masz nic przeciwko korzystaniu ze starszych funkcji POSIX, możesz użyć rindexdo zapisania bajtu.
algmyr
@ algmyr Pewnie, działa dobrze na TIO, więc go użyję. Nigdy wcześniej o tym nie słyszałem rindex()- dziękuję za podpowiedź!
Cyfrowa trauma
5

PHP, 21 bajtów

<?=pathinfo($argn,4);

Wypróbuj online!

jest krótszym wyrażeniem dla

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

pathinfo

PHP, 27 bajtów

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

eksplodować

Wypróbuj online!

PHP <7.0, 26 bajtów

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

przestarzały podział

Jörg Hülsermann
źródło
1
Czy liczysz końcowy znak nowej linii? Powinien mieć 27 bajtów, a nie 28.
Conor O'Brien
@ ConorO'Brien Dziękuję. Liczę po skopiowaniu i wklejeniu z wersji podzielonej ``
Jörg Hülsermann
2
pathinfo()Jeden oparty może być <?=pathinfo($argn,4);.
manatwork
4

Marka GNU , 12 bajtów

$(suffix $1)

Nie używa wbudowanego, 27 bajtów:

$(lastword $(subst ., ,$1))
eush77
źródło
4

Partia, 10 bajtów

@echo %~x1

Raz dziwnie konkurencyjny.

Neil
źródło
4

V , 5 , 3 bajty

Ponieważ większej części tej odpowiedzi nie można wydrukować niż wydrukować, oto zrzut heksowy:

00000000: cd81 ae                                  ...

Wypróbuj online!

Korzysta z algorytmu Jana Dvoraka , okazuje się, że jest to bardziej wydajne jego kodowanie.

Wyjaśnienie:

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

Stare rozwiązanie:

$T.d|
James
źródło
Wyjaśnienie proszę?
Erik the Outgolfer
@EriktheOutgolfer Done
James
Oczekiwanie ®oznacza kropkę? Lol, to dziwne.
Erik the Outgolfer
3

Galaretka , 4 bajty

ṣ”.Ṫ

Monadyczny link pobierający nazwę pliku i zwracający rozszerzenie bez wiodącego ..

Wypróbuj online!

W jaki sposób?

Dosłownie robi to, o co poproszono ...

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

Idź , 85 bajtów

Go jest ... kłopotliwy.

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

Wypróbuj online!

Próbka nawiasów z kodu:

()(){([])([()])}
całkowicie ludzki
źródło
2
()(){([])([()])}- czy jest to poprawny Brain-Flak?
eush77
5
@ eush77 To technicznie poprawny Brain-Flak, ponieważ będzie działał bez błędów, ale nie robi nic interesującego / użytecznego. Jest to albo dosłowny 2brak instrukcji / poleceń, albo nieskończona pętla, która stale przydziela więcej pamięci, w zależności od danych wejściowych.
James
Korzystanie filepath.Extzaoszczędzi ci kilka kęsów
powelles
3

JavaScript (ES6), 33 31 28 bajtów

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

Zmiana specyfikacji w komentarzach eliminuje potrzebę +1.

-3 bajty dzięki nderscore

Stephen
źródło
1
-3 z slicewykonaniem łańcucha i szablonu:s=>s.slice(s.lastIndexOf`.`)
nderscore
3

Common Lisp, 57 bajtów

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

Wypróbuj online (dodano kilka bajtów, aby wywołać tę anonimową funkcję i wyświetlić zwrócony ciąg)

Wyjaśnienie

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

Otrzymuję podciąg odwróconego łańcucha, zaczynając od 0, kończąc na tym


źródło
3

Gema, 3 znaki

*.=

Przykładowy przebieg:

bash-4.4$ gema '*.=' <<< 'what..is..this..file'
file
człowiek w pracy
źródło
3

MATL, 8 7 bajtów

46&YbO)

Wypróbuj w MATL Online !

Wyjaśnienie

        % 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
źródło
3

JavaScript (ES5), 38 bajtów

function(s){return s.split(".").pop()}
Zgrzeszyłem
źródło
2
Właśnie dlatego wiesz, że opinia głosowa została automatycznie przesłana przez użytkownika społeczności podczas edytowania Twojej odpowiedzi. Uważam to za błąd .
Dennis
plz napraw to, jeśli potrafisz!
Sinned
3

C #, 33 41 bajtów

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

Edytuj zgodnie z sugestią:

using System.Linq;a=>a.Split('.').Last();
LiefdeWen
źródło
1
Musisz uwzględnić using Sytem.Linq;w swojej liczbie bajtów
TheLethalCoder
A także a=>a.Split('.').Last();niejawny zwrot jest krótszy
TheLethalCoder
@TheLethalCoder Dzięki za sugerowane poprawki, wciąż nowe w tym :)
LiefdeWen
Dziwi mnie, że jest to dłuższe niż moje rozwiązanie, używając Path...
TheLethalCoder
3

Awk, 14 13 znaków

( Kod 10 9 znaków + opcja wiersza poleceń 4 znaki.)

{$0=$NF}1

Dzięki:

Przykładowy przebieg:

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
człowiek w pracy
źródło
Nie potrzebujesz ;. i po prostu FYI, awk '{$0=$NF}1 działa, nie wymaga opcji wiersza poleceń. Och ... muszę być zmęczony. Widzę, co tu zrobiłeś. Potrzebujesz opcji wiersza polecenia.
Robert Benson
1
Dziękuję, @RobertBenson. Nie mam pojęcia, dlaczego to ;tam umieściłem .
manatwork
3

Lua , 53 30 bajtów

Zastępuje wszystko do ostatniego . pustym ciągiem ''.

Podwójny nawias, aby wybrać tylko pierwszą wartość zwracaną gsub .

Wszelkie wskazówki dotyczące golfa są mile widziane, jestem zardzewiały w lua ...

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

Wypróbuj online!

Felipe Nardi Batista
źródło
3

Java 8, 52 27 bajtów

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

Wypróbuj tutaj.

Zastąp wszystko przed ostatnią kropką (i samą kropką) niczym.

Jest to krótsze niż użycie split ( s->s.split("\\.")[s.split("\\.").length-1];) lub substring ( s->s.substring(s.lastIndexOf('.'));).

Kevin Cruijssen
źródło
3

Taxi , 1397 bajtów

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.

Wypróbuj online!

Taksówka nie ma funkcji cofania, więc balon szybko się zwiększył. Logika jest następująca:

  1. Podziel ciąg na znaki
  2. Odwróć tablicę
  3. Iteruj przez każdy z nich, aż do znalezienia kropki, przechowując każdą w tablicy FIFO
  4. Opróżnij tablicę (ponieważ dostępna jest tylko jedna tablica LIFO)
  5. Zrzuć tablicę FIFO do tablicy LIFO
  6. Połącz tablicę i dane wyjściowe LIFO
Inżynier Toast
źródło
3

Vim, 5 bajtów

$F.d0

Objaśnienie: znajdź ostatni . wiersz, usuń wszystko przed nim

Kolejne, dłuższe, ale moim zdaniem wciąż interesujące podejście z 9 bajtami (zauważ końcową nową linię)

d/.*\./e

Ten działa podobnie, 5 bajtów (ponownie, końcowy nowy wiersz):

d?\.

oktupol
źródło
2

Brain-Flak , 84 bajtów

Obejmuje +2 za -rc

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

Wypróbuj 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
źródło
2

Japt , 6 5 bajtów

q'. o

Wypróbuj online!

Wyjaśnienie

 q'. o
Uq'. o
Uq'.    # Split the input at "."
     o # Return the last item
Łukasz
źródło
Gdy potrzebujesz tylko zwrócić ostatni element tablicy, możesz użyć ozamiast gJ. (Nauczyłem się tej sztuczki od @obarakon jakiś czas temu)
ETHproductions
2

jq, 15 14 znaków

( 11 10 znaków kodowych + 4 znaki opcji wiersza poleceń).

./"."|last

Przykładowy przebieg:

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

Test online

człowiek w pracy
źródło
2

Oktawa, 24 bajty

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

Tworzy anonimową funkcję o nazwie ans która może zaakceptować ciąg jako dane wejściowe

Demo online

Suever
źródło