Phần mở rộng tập tin là gì?


10

Thử thách của bạn là tìm phần mở rộng tập tin của một tên tệp được cung cấp:

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

Bạn phải lấy văn bản từ cuối cùng . hoặc sau cuối .đến cuối chuỗi. Khớp nhóm bắt đầu tiên của biểu thức chính quy /\.([^.]+)$/hoạt động và do đó, tách đầu vào trên .s và trả về cái cuối cùng.

Tên tệp sẽ luôn chứa ít nhất một ., nhưng nó có thể chứa nhiều .. (xem ví dụ)

Đầu vào sẽ luôn khớp ^[.a-zA-Z0-9^!\[\]{}@$%+=]+$.


17
Vui lòng xem xét việc sử dụng Sandbox trong tương lai để nhận phản hồi về các thách thức của bạn trước khi đăng chúng lên trang web chính.
Mego

1
codegolf.meta.stackexchange.com/a/12432/59376 - Có ý tưởng này từ thử thách của bạn.
Bạch tuộc ma thuật Urn

@carusocomputing thử thách tốt đẹp!
lập trình

1
Tại sao các phiếu bầu tiêu cực? Thử thách này có "quá tầm thường" hay không?
Abel Tom

Lịch sử chỉnh sửa @AbelTom sẽ đề xuất các downvote vì thiếu thông số kỹ thuật trong bản thảo đầu tiên của câu hỏi này.
Patrick Roberts

Câu trả lời:



11

JavaScript (ES6), 19 byte

Trả về tên tệp đầy đủ khi không có phần mở rộng tập tin. Tôi cho rằng đây là một hành vi không xác định được chấp nhận .

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


Điểm của hành vi không xác định là bất cứ điều gì đi. Mặc dù, quỷ mũi, trong khi vẫn chưa xác định hành vi, có thể thất bại trong điều khoản "không có chương trình độc hại".
John Dvorak

10

Toán học, 13 22 byte

Chỉnh sửa: Không chắc chắn làm thế nào tôi bỏ lỡ ".bashrc"trường hợp thử nghiệm. Cảm ơn Artyer đã giữ cho tôi trung thực.

FileExtension["a"<>#]&

Nếu đầu vào khớp \.[^.]+, thì FileExtensionchỉ trả về chuỗi trống, vì vậy chúng tôi thêm vào chữ cái a. Trong mọi trường hợp khác, việc trả trước akhông ảnh hưởng đến đầu ra của FileExtension.


11
Một Mathicala dựng sẵn ... không có gì bất ngờ.
lập trình

1
Tôi sẽ ngạc nhiên nếu không có bất kỳ nội dung toán học nào cho bất kỳ câu hỏi nào có thể
sagiksp

Tôi không có quyền truy cập vào .extMathicala , nhưng tôi nghi ngờ điều đó sẽ không dẫn đến kết quả gì, điều đó không thành công vì .bashrccần phải xuất bashrc(Nó thất bại trong Toán học )
Artyer


Mathematica chỉ cần meta dựng sẵn Create Built-in XXXXXXXX.
Bạch tuộc ma thuật Urn




7

chức năng c, 21

  • Lưu 1 byte nhờ @Dennis.
  • 3 byte được lưu nhờ @JohanduToit.
  • Lưu 2 byte nhờ @Neil.
  • 1 byte được lưu nhờ vào @ achmyr.
f(s){s=rindex(s,46);}

Hãy thử trực tuyến .


1
Nếu bạn ổn với việc sử dụng các hàm POSIX cũ, bạn có thể sử dụng rindexđể lưu một byte.
algmyr

@ achmyr Chắc chắn, nó hoạt động tốt trên TIO, vì vậy tôi sẽ sử dụng nó. Tôi chưa bao giờ nghe nói rindex()trước đây - cảm ơn vì tiền boa!
Chấn thương kỹ thuật số

5

PHP, 21 byte

<?=pathinfo($argn,4);

Hãy thử trực tuyến!

là một biểu thức ngắn hơn cho

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

đường dẫn

PHP, 27 byte

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

nổ tung

Hãy thử trực tuyến!

PHP <7.0, 26 byte

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

NỮA split


1
Bạn đang đếm một dòng mới cho cái đầu tiên? Nó phải là 27 byte, không phải 28.
Conor O'Brien

@ ConorO'Brien Cảm ơn bạn. Tôi đã đếm sau khi sao chép và dán từ phiên bản phân tách a ``
Jörg Hülsermann

2
Một pathinfo()trong những dựa trên có thể được <?=pathinfo($argn,4);.
thao tác


4

GNU Make , 12 byte

$(suffix $1)

Không sử dụng nội dung, 27 byte:

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

4

Mẻ, 10 byte

@echo %~x1

Cạnh tranh kỳ lạ cho một lần.


4

V , 5 , 3 byte

Vì nhiều câu trả lời này không thể in được hơn là có thể in được, nên đây là một hexdump:

00000000: cd81 ae                                  ...

Hãy thử trực tuyến!

Điều này sử dụng thuật toán của Jan Dvorak , nó thực sự là một mã hóa hiệu quả hơn của nó.

Giải trình:

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

Giải pháp cũ:

$T.d|

Xin giải thích?
Erik the Outgolfer

@EriktheOutgolfer Xong
James

Chờ ®có nghĩa là theo sau bởi một dấu chấm? Lol thật lạ.
Erik the Outgolfer


3

Thạch , 4 byte

ṣ”.Ṫ

Một liên kết đơn âm lấy tên tệp và trả lại phần mở rộng không có hàng đầu ..

Hãy thử trực tuyến!

Làm sao?

Nghĩa đen là những gì được hỏi ...

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

3

Đi , 85 byte

Đi là ... rắc rối.

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

Hãy thử trực tuyến!

Một mẫu dấu ngoặc đơn từ mã:

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

2
()(){([])([()])}- nó có phải là một Brain-Flak hợp lệ không?
eush77

5
@ eush77 Đó là Brain-Flak hợp lệ về mặt kỹ thuật , vì nó sẽ chạy mà không có lỗi, nhưng nó không làm gì thú vị / hữu ích. Đó chỉ là nghĩa đen 2không có hướng dẫn / lệnh hoặc bất cứ điều gì hoặc một vòng lặp vô hạn liên tục phân bổ nhiều bộ nhớ hơn, tùy thuộc vào đầu vào.
James

Sử dụng filepath.Extsẽ giúp bạn tiết kiệm một vài vết cắn
powelles

3

JavaScript (ES6), 33 31 28 byte

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

Spec thay đổi trong ý kiến ​​loại bỏ sự cần thiết cho +1.

-3 byte nhờ nderscore


1
-3 với slicevà thực hiện chuỗi mẫu:s=>s.slice(s.lastIndexOf`.`)
nderscore

3

Lisp thông thường, 57 byte

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

Dùng thử trực tuyến (đã thêm một số byte để gọi hàm ẩn danh này và hiển thị chuỗi trả về)

Giải trình

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

Tôi nhận được chuỗi con của chuỗi đảo ngược, bắt đầu từ 0, kết thúc bằng chuỗi này


3

Gema, 3 nhân vật

*.=

Chạy mẫu:

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

3

MATL, 8 7 byte

46&YbO)

Hãy thử nó tại MATL Online !

Giải trình

        % 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

C #, 33 41 byte

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

Chỉnh sửa theo đề xuất:

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

1
Bạn cần đưa using Sytem.Linq;vào số byte của mình
TheLethalCoder

a=>a.Split('.').Last();lợi nhuận ngầm cũng ngắn hơn
TheLethalCoder

@TheLethalCoder Cảm ơn các bản sửa lỗi được đề xuất, vẫn còn mới đối với điều này :)
LiefdeWen

Tôi ngạc nhiên rằng nó dài hơn giải pháp của tôi khi sử dụng Path...
TheLethalCoder

3

Awk, 14 13 ký tự

( 10 mã 9 ký tự + tùy chọn dòng lệnh 4 ký tự.)

{$0=$NF}1

Nhờ vào:

  • Robert Benson đã phát hiện ra dấu chấm phẩy không cần thiết (ký tự -1)

Chạy mẫu:

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

Bạn không cần ;. và chỉ FYI, awk '{$0=$NF}1 hoạt động, không cần tùy chọn dòng lệnh. Ồ ... tôi phải mệt mỏi. Tôi thấy những gì bạn đã làm ở đó. Bạn cần tùy chọn dòng lệnh.
Robert Benson

1
Cảm ơn bạn, @RobertBenson. Tôi không biết tại sao tôi lại đặt nó ;ở đó.
thao tác

3

Lua , 53 30 byte

Thay thế mọi thứ cho đến cuối cùng .bằng chuỗi trống ''.

Dấu ngoặc kép để chỉ chọn giá trị trả về đầu tiên của gsub.

Bất kỳ lời khuyên chơi gôn nào đều được chào đón, tôi đang hoen rỉ ...

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

Hãy thử trực tuyến!


3

Java 8, 52 27 byte

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

Hãy thử nó ở đây.

Thay thế mọi thứ trước dấu chấm cuối cùng (và chính dấu chấm đó) bằng không có gì.

Điều này ngắn hơn so với sử dụng split ( s->s.split("\\.")[s.split("\\.").length-1];) hoặc chuỗi con ( 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.

Hãy thử trực tuyến!

Taxi không có chức năng đảo ngược nên bóng bay này khá nhanh. Logic là:

  1. Chia chuỗi thành các ký tự
  2. Đảo ngược mảng
  3. Lặp lại qua từng lần cho đến khi tìm thấy một khoảng thời gian, lưu trữ từng khoảng trong một mảng FIFO
  4. Làm trống mảng (vì chỉ có một mảng LIFO khả dụng)
  5. Kết xuất mảng FIFO vào mảng LIFO
  6. Nối mảng LIFO và đầu ra

3

Vim, 5 byte

$F.d0

Giải thích: tìm .dòng cuối cùng , xóa mọi thứ trước khi nó

Một cách khác, dài hơn, nhưng theo tôi vẫn là cách tiếp cận thú vị với 9 byte (chú ý dòng mới theo dõi)

d/.*\./e

Cái này hoạt động tương tự, 5 byte (một lần nữa, theo dõi dòng mới):

d?\.


2

Brain-Flak , 84 byte

Bao gồm +2 cho -rc

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

Hãy thử trực tuyến!

# 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

Hãy thử trực tuyến!

Giải trình

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

Khi bạn chỉ cần trả về mục cuối cùng của một mảng, bạn có thể sử dụng othay thế gJ. (Đã học được mẹo đó từ @obarakon một thời gian trước)
ETHproductions


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.