นามสกุลไฟล์คืออะไร?


10

ความท้าทายของคุณคือการค้นหานามสกุลไฟล์ของชื่อไฟล์ที่ให้:

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

คุณจะต้องได้รับข้อความจากข้อความสุดท้าย. หรือหลังจากข้อความสุดท้าย.จนถึงตอนท้ายของสตริง การจับคู่กลุ่มแรกของนิพจน์ทั่วไป/\.([^.]+)$/ทำงานได้ดังนั้นจึงแยกอินพุต.และส่งคืนล่าสุด

ชื่อไฟล์จะมีอย่างน้อยหนึ่ง.ชื่อ แต่อาจมีหลาย.ชื่อ (ดูตัวอย่าง)

^[.a-zA-Z0-9^!\[\]{}@$%+=]+$การป้อนข้อมูลมักจะตรงกับ


17
โปรดพิจารณาใช้แซนด์บ็อกซ์ในอนาคตเพื่อรับข้อเสนอแนะเกี่ยวกับความท้าทายของคุณก่อนโพสต์ลงในเว็บไซต์หลัก
Mego

1
codegolf.meta.stackexchange.com/a/12432/59376 - รับแนวคิดนี้จากการท้าทายของคุณ
Magic Octopus Urn

@carusocomputing ความท้าทายที่ดี!
programmer5000

1
ทำไมคะแนนลบ ความท้าทายนี้เป็น "เรื่องเล็กน้อย" หรือมากกว่านั้นใช่ไหม
Abel Tom

@AbelTom ประวัติการแก้ไขจะแนะนำให้ลงคะแนนเพราะขาดข้อกำหนดในร่างแรกของคำถามนี้
Patrick Roberts

คำตอบ:



11

JavaScript (ES6), 19 ไบต์

ส่งคืนชื่อไฟล์แบบเต็มเมื่อไม่มีนามสกุลไฟล์ ฉันคิดว่านี้เป็นที่ยอมรับไม่ได้กำหนดพฤติกรรม

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


ประเด็นของพฤติกรรมที่ไม่ได้กำหนดคือทุกสิ่งที่เกิดขึ้น แม้ว่าจมูกปีศาจในขณะที่ยังไม่ได้กำหนดพฤติกรรมอาจล้มเหลวประโยค "ไม่มีโปรแกรมที่เป็นอันตราย"
John Dvorak

10

Mathematica, 13 22 ไบต์

แก้ไข: ไม่แน่ใจว่าฉันพลาด".bashrc"กรณีทดสอบไปได้อย่างไร ขอบคุณ Artyer ที่ทำให้ฉันซื่อสัตย์

FileExtension["a"<>#]&

หากตรงกับการป้อนข้อมูล\.[^.]+แล้วเพียงแค่ส่งกลับสตริงที่ว่างเปล่าดังนั้นเราจึงย่อหน้าตัวอักษรFileExtension aในกรณีอื่น ๆ prepending ไม่ได้ส่งผลกระทบต่อการส่งออกของaFileExtension


11
นักคณิตศาสตร์ในตัว ... ไม่แปลกใจ
programmer5000

1
ฉันต้องการจะประหลาดใจถ้ามีไม่ builtins Mathematica ใด ๆ สำหรับคำถามใด ๆ ที่เป็นไปได้
sagiksp

ฉันไม่ได้มีการเข้าถึง Mathematica แต่ผมจะสงสัยว่า.extจะส่งผลให้ไม่มีอะไรซึ่ง failes สำหรับ.bashrcจำเป็นต้องส่งออกbashrc(มันล้มเหลวในการMathics )
Artyer


Mathematica Create Built-in XXXXXXXXเพียงแค่ต้องการให้เมตาตัว
Magic Octopus Urn




7

ฟังก์ชั่น c, 21

  • บันทึก 1 ไบต์ขอบคุณ @Dennis
  • บันทึก 3 ไบต์ด้วย @JohanduToit
  • บันทึก 2 ไบต์ด้วย @Neil
  • บันทึก 1 ไบต์ด้วย @algmyr
f(s){s=rindex(s,46);}

ลองมันออนไลน์


1
หากคุณตกลงกับการใช้ฟังก์ชั่น POSIX แบบดั้งเดิมคุณสามารถใช้rindexเพื่อบันทึกไบต์
algmyr

@algmyr แน่นอนว่ามันใช้งานได้ดีบน TIO ดังนั้นฉันจะใช้มัน ฉันไม่เคยได้ยินมาrindex()ก่อน - ขอบคุณสำหรับเคล็ดลับ!
บาดเจ็บทางดิจิตอล

5

PHP, 21 ไบต์

<?=pathinfo($argn,4);

ลองออนไลน์!

เป็นการแสดงออกที่สั้นลงสำหรับ

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

pathinfo

PHP, 27 ไบต์

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

ระเบิด

ลองออนไลน์!

PHP <7.0, 26 ไบต์

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

แยกไม่สนับสนุน


1
คุณกำลังนับบรรทัดใหม่สำหรับบรรทัดแรกหรือไม่ ควรเป็น 27 ไบต์ไม่ใช่ 28
Conor O'Brien

@ ConorO'Brien ขอขอบคุณคุณฉันได้นับหลังจากคัดลอกและวางจากเวอร์ชันแยก a ``
JörgHülsermann

2
ตามหนึ่งอาจจะเป็นpathinfo() <?=pathinfo($argn,4);
จัดการ




4

V , 5 , 3 ไบต์

เนื่องจากคำตอบนี้ไม่สามารถพิมพ์ได้มากกว่าพิมพ์ได้นี่คือ hexdump:

00000000: cd81 ae                                  ...

ลองออนไลน์!

สิ่งนี้ใช้อัลกอริทึมของ Jan Dvorakมันแค่เกิดการเข้ารหัสที่มีประสิทธิภาพมากขึ้น

คำอธิบาย:

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

โซลูชันเก่า:

$T.d|

กรุณาอธิบาย
Erik the Outgolfer

@EriktheOutgolfer Done
James

รอ®หมายถึงตามด้วยจุดหรือไม่ ฮ่า ๆ นั่นแปลก
Erik the Outgolfer


3

เยลลี่ 4 ไบต์

ṣ”.Ṫ

ลิงก์ monadic ที่ใช้ชื่อไฟล์และส่งคืนส่วนขยายโดยไม่มีการนำ.หน้า

ลองออนไลน์!

อย่างไร?

แท้จริงสิ่งที่ถูกถาม ...

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

3

ไป 85 ไบต์

ไปคือ ... ลำบาก

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

ลองออนไลน์!

ตัวอย่างของวงเล็บจากรหัส:

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

2
()(){([])([()])}- มันเป็น Brain-Flak ที่ถูกต้องหรือไม่?
eush77

5
@ eush77 เป็นBrain-Flak ที่ใช้ได้จริงในทางเทคนิคเนื่องจากมันจะทำงานโดยไม่มีข้อผิดพลาด แต่มันไม่ได้ทำอะไรที่น่าสนใจ / มีประโยชน์ มันอาจเป็นแค่ตัวอักษรที่2ไม่มีคำสั่ง / คำสั่งหรืออะไรก็ตามหรือวนรอบไม่สิ้นสุดที่จัดสรรหน่วยความจำอย่างต่อเนื่องขึ้นอยู่กับอินพุต
James

การใช้filepath.Extจะช่วยให้คุณประหยัดได้ไม่กี่คำ
powelles

3

JavaScript (ES6) 33 31 28 ไบต์

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

การเปลี่ยนสเป็คในความคิดเห็นทำให้ไม่จำเป็นต้องใช้ +1การเปลี่ยนแปลงสเป็คในความคิดเห็นขจัดความจำเป็นในการ

-3 ไบต์ต้องขอบคุณขีดล่าง


1
-3 ด้วยsliceและการดำเนินการกับสตริงแม่แบบ:s=>s.slice(s.lastIndexOf`.`)
ขีดล่าง

3

Lisp สามัญ, 57 ไบต์

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

ลองออนไลน์ (เพิ่มบางไบต์เพื่อเรียกใช้ฟังก์ชันที่ไม่ระบุตัวตนและแสดงสตริงที่ส่งคืน)

คำอธิบาย

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

ฉันได้รับสตริงย่อยของสตริงที่กลับด้านเริ่มต้นจาก 0 จบลงด้วยสิ่งนี้



3

MATL, 8 7 ไบต์

46&YbO)

ลองที่MATL Online !

คำอธิบาย

        % 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 ไบต์

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

2
เพื่อให้คุณรู้ว่า downvote นั้นถูกส่งโดยผู้ใช้ Community โดยอัตโนมัติเมื่อคำตอบของคุณถูกแก้ไข ผมคิดว่านี่เป็นข้อผิดพลาด
เดนนิส

ได้โปรดแก้ไขว่าถ้าคุณทำได้!
ทำบาป

3

C #, 33 41 ไบต์

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

แก้ไขตามที่แนะนำ:

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

1
คุณต้องรวมusing Sytem.Linq;เข้าไปในจำนวนไบต์ของคุณ
TheLethalCoder

และa=>a.Split('.').Last();ผลตอบแทนโดยปริยายก็จะสั้นลง
TheLethalCoder

@TheLethalCoder ขอบคุณสำหรับการแก้ไขที่แนะนำยังใหม่กับ :) :)
LiefdeWen

ฉันประหลาดใจว่านี่นานกว่าโซลูชันของฉันโดยใช้Path...
TheLethalCoder

3

Awk, 14ตัวละคร 13 ตัว

( ตัวเลือกบรรทัดคำสั่งรหัส10 9 อักขระ + 4 อักขระ)

{$0=$NF}1

ขอบคุณที่:

  • Robert Bensonสำหรับการระบุเซมิโคลอนที่ไม่จำเป็น (อักขระ -1 ตัว)

วิ่งตัวอย่าง:

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

คุณไม่ต้องการ ;คุณไม่จำเป็นต้องและเพียงแค่ FYI awk '{$0=$NF}1 ทำงานได้ไม่จำเป็นต้องใช้ตัวเลือกบรรทัดคำสั่ง โอ้ ... ฉันต้องเหนื่อย ฉันรู้ว่าคุณทำอะไรที่นั่น. คุณต้องการตัวเลือกบรรทัดคำสั่ง
Robert Benson

1
ขอบคุณ @RobertBenson ฉันไม่รู้ว่าทำไมฉันถึงพูดแบบ;นั้น
จัดการ

3

Lua , 53 30 ไบต์

แทนที่ทุกอย่างจนสุด.ด้วยสตริงว่าง''กับสตริงที่ว่างเปล่า

เครื่องหมายวงเล็บคู่เพื่อเลือกเฉพาะค่าส่งคืนแรกของ gsubดับเบิลวงเล็บเพื่อเลือกเฉพาะค่าตอบแทนแรกของ

ยินดีต้อนรับเคล็ดลับการเล่นกอล์ฟฉันเป็นสนิมใน lua ...

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

ลองออนไลน์!


3

Java 8, 52 27 ไบต์

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

ลองที่นี่

แทนที่ทุกอย่างก่อนจุดสุดท้าย (และจุดเอง) โดยไม่มีอะไร

สิ่งนี้สั้นกว่าการใช้ split ( s->s.split("\\.")[s.split("\\.").length-1];) หรือ substring ( s->s.substring(s.lastIndexOf('.'));)


3

แท๊กซี่ 1397 ไบต์

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.

ลองออนไลน์!

แท็กซี่ไม่ได้มีฟังก์ชั่นย้อนกลับดังนั้นบอลลูนนี้ค่อนข้างเร็ว ตรรกะคือ:

  1. แบ่งสตริงออกเป็นอักขระ
  2. ย้อนกลับอาร์เรย์
  3. วนซ้ำแต่ละรอบจนกว่าจะพบรอบระยะเวลาเก็บแต่ละชุดไว้ในอาร์เรย์ FIFO
  4. ล้างอาร์เรย์ (เนื่องจากมี LIFO อาเรย์เดียวเท่านั้น)
  5. ดัมพ์อาร์เรย์ FIFO ลงในอาร์เรย์ LIFO
  6. เชื่อมต่ออาร์เรย์และเอาต์พุต LIFO

3

เป็นกลุ่ม 5 ไบต์

$F.d0

คำอธิบาย: ค้นหา.บรรทัดสุดท้ายลบทุกอย่างก่อนหน้า

อีกต่อไปอีกต่อไป แต่ในความคิดของฉันยังคงเป็นวิธีที่น่าสนใจด้วย 9 ไบต์ (สังเกตบรรทัดใหม่ที่ตามมา)

d/.*\./e

อันนี้ทำงานคล้ายกัน, 5 ไบต์ (อีกครั้ง, ต่อท้ายบรรทัดใหม่):

d?\.


2

Brain-Flakขนาด 84 ไบต์

รวมถึง +2 สำหรับ -rc

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

ลองออนไลน์!

# 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

Japtap , 6 5 ไบต์

q'. o

ลองออนไลน์!

คำอธิบาย

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

เมื่อคุณต้องการเพียงเพื่อจะกลับรายการสุดท้ายของอาร์เรย์คุณสามารถใช้ในสถานที่ของo gJ(เรียนรู้เคล็ดลับจาก @obarakon สักครู่แล้ว)
ETHproductions


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.