เขียนโปรแกรมที่กลับชื่อของไฟล์ต้นฉบับ


27

ในไฟล์เดียวให้เขียนโปรแกรมที่ไม่ต้องการอินพุตและไม่สร้างเอาต์พุต เมื่อเรียกใช้มันควรกลับชื่อของไฟล์ที่มีอยู่โดยไม่คำนึงถึงชื่อคืออะไรโดยไม่ต้องเปลี่ยนรหัสหรือสร้างผลข้างเคียงที่ยั่งยืนอื่น ๆ

วิธีการบรรลุเป้าหมายนี้เป็นไปได้ด้วยดี มันสำคัญเฉพาะเมื่อโปรแกรมรันการเปลี่ยนแปลงที่ยั่งยืนเท่านั้นคือชื่อไฟล์ถูกย้อนกลับ เช่นไม่มีไฟล์ใหม่ควรอยู่ในไดเรกทอรี

การรันโปรแกรมอีกครั้งควรกลับชื่อกลับ แน่นอนโปรแกรมควรสามารถรันได้หลายครั้งโดยพลการ

สำหรับจุดประสงค์ของการท้าทายนี้:

  • คุณอาจสมมติว่าชื่อไฟล์เป็นสตริงของตัวอักษรตัวเล็ก (az) ระหว่าง 1 ถึง 127 ตัวอักษร (หากภาษาของคุณต้องการให้ไฟล์มีส่วนขยายให้ทำงานให้ย้อนกลับส่วนก่อนส่วนขยายเช่นmycode.batedocym.bat)
  • คุณอาจถือว่าไฟล์รหัสอยู่ในไดเรกทอรีด้วยตัวเองดังนั้นมันจะไม่ได้มีความขัดแย้งในการตั้งชื่อ (ยกเว้นตัวเอง)
  • คุณอาจไม่คิดว่าชื่อไฟล์นั้นไม่ใช่ palindrome เช่นเดียวกันเมื่อกลับด้าน ชื่อไฟล์ที่เป็น palindromes ควรใช้งานได้ดีเช่นเดียวกับที่ไม่ใช่
  • คุณสามารถอ่านเนื้อหาหรือข้อมูลเมตาของไฟล์ ไม่มีข้อ จำกัด ในเรื่องที่นี่
  • คุณอาจจะสมมติว่าโปรแกรมของคุณจะทำงานบนระบบปฏิบัติการที่ธรรมดาและทันสมัย ​​(เช่น Windows / Linux) เนื่องจากเชลล์บางตัวไม่มีชุดคำสั่งเดียวกัน

ตัวอย่างเช่นสมมติว่าคุณมีโปรแกรม Python ในไฟล์ชื่อ mycodeในไดเรกทอรีของตัวเอง วิ่ง

python mycode

ใน terminal edocymจะส่งผลให้ในชื่อไฟล์ที่มีการกลับรายการ ไฟล์edocymควรอยู่คนเดียวในไดเรกทอรี - ไม่มีชื่อไฟล์ที่mycodeควรอยู่อีกต่อไป วิ่ง

python edocym

จะย้อนกลับชื่อกลับไปmycodeที่จุดที่กระบวนการสามารถทำซ้ำไปเรื่อย ๆ

หากไฟล์ Python เดียวกันถูกเปลี่ยนชื่อracecar(โดยไม่ต้องเปลี่ยนรหัส) แล้วเรียกใช้

python racecar

ไม่มีอะไรควรเปลี่ยนอย่างเห็นได้ชัดตั้งแต่ "racecar" เป็น palindrome ว่ากันไปถ้าชื่อไฟล์ที่ถูกพูดหรือaxx

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ Tiebreaker เป็นคำตอบที่โหวตให้สูงกว่า


ไดเรกทอรีทำงานปัจจุบันมีความสำคัญหรือไม่?
แบรดกิลเบิร์ต b2gills

@ BradGilbertb2gills คุณควรจะสามารถคัดลอกโฟลเดอร์ด้วยโปรแกรมไปยังที่อื่นและยังใช้งานได้อยู่ (สมมติว่าคุณมีสิทธิ์และอะไรก็ตาม) คุณสามารถสมมติว่าไดเร็กตอรี่ทำงานของเชลล์จะเป็นโฟลเดอร์ที่ไฟล์นั้นอยู่
Calvin's Hobbies

6
ถ้าเราใช้ภาษาที่แปลแล้วล่ะ ความสามารถในการใช้งานจะมีผลกับกฎของคุณอย่างไร
EMBLEM

คำขอให้ชี้แจง 'ไม่รับอินพุตและไม่สร้างเอาต์พุต' ในทางเทคนิคชื่อของไฟล์คืออินพุตที่ต้องดึงข้อมูลจากระบบไฟล์และต้องเปลี่ยนชื่อที่ส่งไปยังระบบไฟล์ นี่คืออินพุตและเอาต์พุต อาจเป็นการดีที่จะระบุว่าไม่อนุญาตให้ใช้เอาต์พุตอื่น
atk

นอกจากนี้คุณคิดว่าการใช้กระบวนการลูกเป็นการละเมิดกฎอินพุต / เอาต์พุตหรือไม่? นั่นคือการเรียกกระบวนการที่แยกต่างหากเพื่อดำเนินการส่วนหนึ่งของงานเช่นการย้อนกลับของชื่อจะต้องส่งชื่อกระบวนการอื่น (ผลลัพธ์จากรหัสและอินพุตของคุณไปยังแอป) และรับค่าจากกระบวนการ (ผลลัพธ์ของกระบวนการ และป้อนข้อมูลไปยังแอป)
atk

คำตอบ:


41

Bash + ลินุกซ์ทั่วไปใช้ร่วมกัน 13 ไบต์

วิธีการของฉันคล้ายกับ @ DigitalTrauma แต่สั้นลงเล็กน้อยเนื่องจากไปป์ด้วยls:

mv * `ls|rev`


20
ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนา & รหัสกอล์ฟ! นี่เป็นคำตอบแรกที่ดีมาก :)
Alex A.

1
ใช้งานได้เฉพาะในกรณีที่ไม่มีไฟล์อื่นในไดเรกทอรี
WGroleau

1
@WGroleau && terdon: ความคิดเห็นของคุณถูกต้องแล้ว แต่คำถามนั้นตอบข้อสมมติฐานทั้งสองนี้แล้ว
Julie Pelletier

@JuliePelletier อ่าใช่คุณพูดถูก ฉันพลาดชื่อไฟล์นั้นอาจประกอบด้วยตัวอักษรตัวพิมพ์เล็กเท่านั้น
terdon

14

C #, 153 ไบต์

void f(){var x=System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name;File.Move(x,new string(x.Reverse().ToArray()).Substring(4)+".exe");}

OO เจ๋งและคุณมีตัวแปรครบ:

System.Reflection.Assembly.GetExecutingAssembly (). ManifestModule.Name

นั่นก็หมายความว่า


12

Bash + utils ทั่วไปของ linux, 15

  • บันทึก 1 ไบต์ด้วย @Dennis

สมมติว่าสคริปต์อยู่ในไดเรกทอรีด้วยตัวเอง

mv * `rev<<<$0`

6
คุณอาจจะสมมติไฟล์โค้ดที่อยู่ในไดเรกทอรีด้วยตัวเองเพื่อให้สามารถถูกแทนที่ด้วย$0 *
Dennis

ขออภัยมีข้อผิดพลาดเล็กน้อยในการอัปเดตของคุณและมันไม่ทำงานเหมือนที่เป็นอยู่ การแก้ไขที่ง่ายที่สุดคือการกลับไปใกล้ชิดกับสิ่งที่คุณมีมาก่อนด้วยแทนของสุดท้าย$0 *
Julie Pelletier

@JuliePelletier มันลำบากในการทำงานก่อนเมื่อฉันพยายามมัน แต่ใช่คุณขวากำลัง - * globbing <<<ขยายตัวไม่ได้เกิดขึ้นไปทางขวาของที่
บาดเจ็บทางระบบดิจิตอล

7

จูเลีย 51 ไบต์

d,f=splitdir(@__FILE__)
cd(d)do
mv(f,reverse(f))end

โปรแกรมนี้ควรเป็นผู้ไม่เชื่อเรื่องพระเจ้าในระบบปฏิบัติการแม้ว่าจะได้รับการทดสอบบน OS X เท่านั้น

Ungolfed:

# Get the directory and file name of the current source file
d, f = splitdir(@__FILE__)

# Change the working directory temporarily to d
cd(d) do
    # Overwrite the file with the reverse of its name
    mv(f, reverse(f))
end

8
ยินดีด้วย! 20k !!!
Luis Mendo

cdคำตอบส่วนใหญ่ดูเหมือนจะคิดว่าไฟล์ที่อยู่ในไดเรกทอรีปัจจุบันดังนั้นผมจึงไม่คิดว่าคุณจำเป็นต้อง ในกรณีนี้f=readdir()[]จะยิ่งสั้น
Dennis

6

MATLAB, 50 46 ไบต์

e='.m';x=mfilename;movefile([x e],[flip(x) e])

ขอบคุณ @Suever สำหรับการลบ 4 ไบต์และสำหรับการทดสอบ!

ทดสอบบน OS X El Capitan และ Debian Jessie ทั้งคู่กับ Matlab รุ่น R2014a

ใน Windows 'f'จำเป็นต้องมีการตั้งค่าสถานะ( e='.m';x=mfilename;movefile([x e],[flip(x) e]),'f') เพื่อเปลี่ยนชื่อไฟล์ในขณะที่กำลังใช้ไฟล์

มันทำงานอย่างไร

e='.m';                       % Store file extension '.m' in variable `e`
x=mfilename;                  % Get name of file being run, without the extension
movefile([x e],[flip(x) e])   % Move (rename) file. `flip` is used for reversing the
                              % name without extension. [...] is (string) concatenation

ระบบปฏิบัติการใดที่คุณ'f'ต้องการ
Suever

@Suever Windows ไม่จำเป็นบน Mac ใช่ไหม
Luis Mendo

ไม่ต้องการบน Mac ของ Linux ดูเหมือนว่า
Suever

@Suever ขอบคุณ! 4 ไบต์จาก :-)
Luis Mendo

@Suever คุณสามารถระบุ OS ที่ใช้งานได้จริงหรือไม่?
Luis Mendo

4

ทับทิมขนาด 24 ไบต์

File.rename$0,$0.reverse

ค่อนข้างอธิบายตนเอง ( $0เป็นชื่อของไฟล์ที่กำลังดำเนินการ)

ทำงานกับruby whateverไดเรกทอรีทำงานของไดเรกทอรีที่มีไฟล์


4

แบตช์ 109 ไบต์

@echo off
set f=%0
set r=
:l
set r=%f:~0,1%%r%
set f=%f:~1%
if not .%f%==. goto l
ren %0.bat %r%.bat

หมายเหตุ 1: ไฟล์แบตช์ต้องลงท้ายด้วย.bat; มันสันนิษฐานว่าไฟล์แบตช์จะถูกดำเนินการโดยชื่อของมันโดยไม่มีนามสกุลและที่.batจะไม่ถูกกลับรายการ ยกตัวอย่างเช่นreverseจะพยายามที่จะเปลี่ยนชื่อไปreverse.bat หมายเหตุ 2: ข้อผิดพลาดหลังจากเปลี่ยนชื่อแบตช์ไฟล์ ( จะไม่ยกเว้นว่ามันไม่สามารถจัดการสตริงได้ตั้งแต่แรก)esrever.bat
CMD.EXECOMMAND.COM

แก้ไข: บันทึก 2 ไบต์โดยใช้การรับประกันว่าชื่อไฟล์เป็นตัวอักษร (ตามความคิดเห็นของ @ CᴏɴᴏʀO'Bʀɪᴇɴ)


3
1. ทำไมคุณไม่ตะโกน 2. ฉันคิดว่าคุณสามารถบันทึกไบต์ด้วยการทำif ]%f% NEQ ] goto l
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴอ่าใช่ชื่อไฟล์เป็นตัวอักษรดังนั้นในความเป็นจริงฉันสามารถบันทึก 2 ไบต์ แต่ขอบคุณสำหรับคำใบ้
Neil

1
คุณต้องยิงอย่างแบต
cat

4

C, 102 ไบต์

main(c,v)char**v;{char*b=strdup(*v),*n=strrchr(*v,47),*t=strchr(b,0);for(;*++n;*--t=*n);rename(*v,b);}

ทำให้พังถล่ม:

                            // No #include lines required (for GCC at least)
main(c,v)char**v;{          // K&R style function to save 2 bytes
    char*b=strdup(*v),      // Duplicate args[0] (script path)
        *n=strrchr(*v,47),  // Find last "/" in input
        *t=strchr(b,0);     // Go to end of output string
    for(;*++n;*--t=*n);     // Reverse input into output character-by-character
    rename(*v,b);           // Rename the file
}                           // Implicit return 0

ในที่สุดความท้าทายที่ C ไม่ได้ (ค่อนข้างสิ้นหวัง) ที่ไม่มีการแข่งขัน!


ถ้าเราใช้เวลา "คุณสามารถสมมติไดเรกทอรีการทำงานของเปลือกจะเป็นโฟลเดอร์ไฟล์อยู่ใน" หมายความว่าโปรแกรมจะถูกเรียกว่าเป็น./myexecutableเราสามารถลดความซับซ้อน*n=strrchr(*v,47)ในการ*n=*v+1ที่จะประหยัด 10 ตัวอักษร แต่นี้ไม่ถูกต้องทั้งหมด ( มันอาจถูกเรียกเป็น././myexecutableตัวอย่าง)


นอกจากนี้หากคุณต้องการเก็บนามสกุลไฟล์ (เช่น ".out") ไว้ในชั้นเชิงคุณสามารถเปลี่ยน*t=strchr(b,0)เป็น*t=strrchr(b,46)ราคา 2 ไบต์ ไม่จำเป็นว่า


ดี - ฉันไม่เคยดูเพื่อดูว่าrenameจะเกิดอะไรขึ้นถ้า src == ปลายทาง; ดูเหมือนว่าคุณจะตอบสนองข้อ จำกัด ของ palindrome ได้ฟรี
Toby Speight

โปรดทราบว่าสิ่งนี้ต้องการระบบไฟล์โดยที่ codepoint 47 เป็นตัวคั่น ฉันคิดว่าสิ่งนี้รวมถึง POSIX (หรืออนุญาตให้ EBCDIC /ในกรณีมุม?)
Toby Speight

@TobySpeight ใช่ฉันตรวจสอบgnu.org/software/libc/manual/html_node/Renaming-Files.htmlเพื่อความกระจ่าง แต่สิ่งที่ฉันพบมากที่สุดคือ "กรณีพิเศษหนึ่งสำหรับการเปลี่ยนชื่อคือเมื่อ oldname และ newname เป็นชื่อสองชื่อสำหรับไฟล์เดียวกัน วิธีที่สอดคล้องกันในการจัดการกรณีนี้คือการลบ oldname อย่างไรก็ตามในกรณีนี้ POSIX ต้องการให้การเปลี่ยนชื่อไม่ทำอะไรและรายงานความสำเร็จ - ซึ่งไม่สอดคล้องกันเราไม่ทราบว่าระบบปฏิบัติการของคุณจะทำอะไร "ดังนั้นฉันเดาว่า โอกาสภายนอกที่จะลบไฟล์ในระบบที่ไม่รองรับ POSIX ใช่รหัสจริงควรตรวจสอบ!
เดฟ

ฉันเพิ่งตรวจสอบlinux.die.net/man/3/renameและยืนยันว่า Linux จัดการ POSIX ได้อย่างสอดคล้อง: "ถ้าอาร์กิวเมนต์เก่าและอาร์กิวเมนต์ใหม่แก้ไขเป็นไฟล์เดิมที่มีอยู่เดิมให้เปลี่ยนชื่อ () จะกลับมาสำเร็จและไม่ทำสิ่งอื่นใด การดำเนินการ."
เดฟ

ฉันไปกับ manbian Debian: "ถ้าoldpathและnewpathมีฮาร์ดลิงก์ที่มีอยู่อ้างถึงไฟล์เดียวกันก็rename()ไม่ทำอะไรเลยและส่งคืนสถานะความสำเร็จ" - ถ้าสตริงเหมือนกันพวกเขาอ้างถึงไฟล์เดียวกัน
Toby Speight

3

Vitsy + * sh, 15 ไบต์

iG:`?r.iG' mr',

คำอธิบาย

iG:`?r.iG' mr',
i               Push -1 to the stack. (this assumes that no arguments are passed)
 G              Get the use name of the class specified by the top item of the
                stack. (-1 refers to the origin class, so this class)
  :             Duplicate stack and jump to it.
   `            Read a file with the current stack as its name, replacing the stack
                with the file's contents.
    ?           Shift one stack to the right.
     r          Reverse the current stack.
      .         Write a file with the name specified by the top stack and the
                contents as the second-to-top stack.
       iG       Get the name of the current class again.
         ' mr'  Push 'rm ' to the stack.
              , Execute the current stack as a command.

โปรดทราบว่าการส่งนี้จะต้องใช้ Vitsy รุ่นที่ไม่ปลอดภัย (ไม่สามารถทำได้ใน Try It Online!)


3

Perl 5, 18 ไบต์

บิตเช่น Ruby one (run perl nameofscript):

rename$0,reverse$0

การคำนึงถึงเส้นทางที่เป็นไปได้คือ uglier (47 bytes)

($a,$b)=$0=~/(.*\/)?(.*)/;rename$0,$a.reverse$b

1
สวัสดีและยินดีต้อนรับสู่ PPCG! โพสต์แรกสุดยอด!
NoOne อยู่ที่นี่

2

V , 29 26 ไบต์

:se ri
izyw:!mv z "
dd

เนื่องจากสิ่งนี้มี unprintables นี่คือ hex dump:

00000000: 3a73 6520 7269 0a69 127a 1b79 773a 216d  :se ri.i.z.yw:!m
00000010: 7620 127a 2012 220a 6464                 v .z .".dd

หมายเหตุ:สิ่งนี้จะไม่ทำงานบนv.tryitonline.netเนื่องจาก TIO ไม่อนุญาตการเข้าถึงไฟล์

คำอธิบาย:

:se ri            "Turn on 'reverse mode' (all text is inserted backwards)
i<C-r>z<esc>      "Enter the path to the file in reverse
yw                "Yank a word. This first word is the name we will save the new file as

"Run an "mv" in the terminal with the contents of register 'z' (the path to the file)
"And the contents of register '"' (the word we yanked)
:!mv <C-r>z <C-r>"

dd                "Delete a line so that we don't have any text printed.

2

Python 3, 105 ไบต์

import os;a=__file__.split('\\')[::-1][0].split('.');os.rename('.'.join(a),'.'.join([a[0][::-1],a[1]]))

-Alex.A ลบ 1 ไบต์

-Dual Trauma แสดงให้ฉันเห็นว่า os.rename () ซึ่งเอาไป 62 ไบต์

-muddyfish ลบ 7 ไบต์


ฉันคิดว่าคุณสามารถบันทึก byte โดยการลบช่องว่างหลังจากเครื่องหมายจุลภาคในimport
Alex A.

import os,sys;f=sys.argv[0];os.rename(f,f[::-1])ควรทำเคล็ดลับสำหรับ 48 ไบต์
Digital Trauma

ทำ f [:: - 1] ย้อนกลับไม่เพียง แต่ชื่อไฟล์ แต่เส้นทางทั้งหมด อย่างไรก็ตามขอขอบคุณที่แนะนำให้ฉันรู้จักกับคุณสมบัติ os.rename ()
Magenta

@Magenta สำหรับฉันsys.argv[0]เพิ่งส่งคืนชื่อไฟล์เท่านั้นโดยไม่มีเส้นทางเมื่อสคริปต์ทำงานด้วยตนเองโดยตรง Helka ระบุว่าไม่เป็นไร
Digital Trauma

@DigitalTrauma เมื่อฉันรันโปรแกรมด้วยตัวเอง sys.arg [0] กลับเส้นทางเต็ม ไม่เพิ่มโซลูชันที่สองที่ sys.argv [0] เป็นเพียงชื่อไฟล์
Magenta

2

PHP, 84, 70, 54 ไบต์

rename($f=__FILE__,strrev(basename($f,$e='.php')).$e);


แก้ไข:ลบออก 14 ไบต์ขอบคุณinsertusernamehereในความคิดเห็น
แก้ไข:ลบออก 16 ไบต์ขอบคุณMartijnในความคิดเห็น


2
คุณจะได้รับมันลงไป70 ไบต์rename($f=__FILE__,__DIR__."/".strrev(pathinfo($f)[filename]).".php"); :
แทรกชื่อที่นี่

Excelent !!! แต่รหัสของคุณจะดีกว่าว้าวคุณมี 31 ไบต์
tttony

คุณไม่สามารถทำให้มันเป็นญาติ? WOuld บันทึก 7 bytes:rename($f=__FILE__,"./".strrev(pathinfo($f)[filename]).".php");
Martijn

หรือน้อยกว่า:rename(__FILE__,strrev(basename(__FILE__,'.php')).'.php');
Martijn

เย็น! การเพิ่ม vars ฉันได้ตอนนี้ 54 ไบต์
tttony

2

PowerShell ขนาด 39 ไบต์

mi *(-join((ls).name)[-5..-999]+'.ps1')

สวัสดีและยินดีต้อนรับสู่ PPCG! โพสต์แรกที่ดี!
Rɪᴋᴇʀ



1

Perl 6 ,  70   27 ไบต์

หากจำเป็นต้องทำงานในไดเรกทอรีทำงานอื่นคุณจะต้องมีสิ่งนี้:

$_=$*PROGRAM;.rename: .basename.flip.IO.absolute: .absolute.IO.dirname

เนื่องจากไดเรกทอรีการทำงานจะเป็นไดเรกทอรีเดียวกันกับโปรแกรมจึงสามารถทำให้ง่ายขึ้นเพียง:

$_=$*PROGRAM;.rename: .flip

คำอธิบาย:

$_ = $*PROGRAM;  # IO::Path object

$_.rename:
    $_.basename
      .flip      # reverse characters
      .IO        # turn into an IO object (IO::Path)
      .absolute: # turn it into an absolute path Str in the following dir
        $_.absolute.IO.dirname

1

JavaScript (โหนด), 108 104 68 ไบต์

บันทึก 36 ไบต์ขอบคุณ Downgoat!

เวอร์ชั่น Windows:

require("fs").rename(F=__filename,F.split(/.*\\|/).reverse().join``)

รุ่นอื่น ๆ :

require("fs").rename(F=__filename,F.split(/.*\/|/).reverse().join``)

@ Upgoat ฉันไม่ต้องการฉันไม่คิด ฉันกำลังจับคู่jsที่ท้ายไฟล์พา ธ นำหน้าด้วยอักขระ .นี้จะเป็น
Conor O'Brien

1

JavaScript ES6 (Node.js) 70 ไบต์

ไม่มี Regex Yay!

require("fs").rename(a=__filename,[...a].reverse().join``.split`/`[0])

ความช่วยเหลือใด ๆ ที่ชื่นชม


1

PowerShell v4 +, 68 ไบต์

$a,$b=($c=(ls).Name)-split'\.';mv $c "$(-join($a[$a.length..0])).$b"

ใช้งานได้เฉพาะเนื่องจากสคริปต์รับประกันว่าจะอยู่ในไดเรกทอรีทั้งหมด ดำเนินการls(นามแฝงGet-ChildItem) และใช้.Nameวัตถุผลลัพธ์ เราจัดเก็บใน$cนั้นและ-splitตามระยะเวลาที่แท้จริงเพื่อรับชื่อไฟล์และนามสกุลและเก็บไว้ใน$aและ$bตามลำดับ

ถัดไปเป็นmv(นามแฝงสำหรับMove-Item) คำสั่งที่เรากำลังจะย้าย$cไป(ย้อนกลับ)$a.$b

ตัวอย่าง

PS C:\Tools\Scripts\golfing\reverse> ls

    Directory: C:\Tools\Scripts\golfing\reverse

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         6/13/2016   7:58 AM         88 reverse.ps1

PS C:\Tools\Scripts\golfing\reverse> .\reverse.ps1

PS C:\Tools\Scripts\golfing\reverse> ls

    Directory: C:\Tools\Scripts\golfing\reverse

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         6/13/2016   7:58 AM         88 esrever.ps1

1

Python (2.7 หรือ 3.4+), 61 49 ไบต์

ฉันเชื่อว่านี่ใกล้กับทางออกที่ดีที่สุดของ Python:

import os;a=__file__;os.rename(a,a[-4::-1]+".py")

แรงบันดาลใจจากs4b3r6คำตอบของ แต่ใช้การแบ่งรายการแทนการย้อนกลับและบันทึก__file__เป็นตัวแปรเพื่อบันทึกไบต์เมื่อใช้สองครั้ง

หมายเหตุ:*.pyนี้อนุมานว่าชื่อไฟล์อยู่เสมอ โซลูชันทั่วไปที่สามารถจัดการกับส่วนขยายไฟล์สองอักขระใด ๆ ที่จะใช้a[-3:]เพื่อแทนที่".py"ในราคา 1 ไบต์พิเศษ

ปรับปรุง:บันทึกไว้ 12 ไบต์โดยใช้เคล็ดลับรายการหั่นจะลบไฟล์นามสกุลแทนการแยกและจากนั้นย้อนกลับด้วยa[-4::-1]a.split(".")[0][::-1]


1

Powershell, 112 ไบต์

ฉันจะไม่เอาชนะ unix cmds เพียงเพิ่ม pence ของฉันเพื่อความสนุกสนาน

gci * | % { $n=($_.basename[-1..-(($_.basename).length)] -join “”)+$_.Extension; mv -Path $_.Fullname -Dest $n }

ยินดีต้อนรับสู่ PPCG! เราต้องการคำตอบนั้นแสดงคะแนนของพวกเขาดังนั้นฉันจึงแก้ไขให้คุณ นอกจากนี้คุณสามารถจัดรูปแบบรหัสของคุณโดยเน้นมันและเลือกปุ่มที่ดูเหมือนว่าวงเล็บ{}หรือโดยการเพิ่ม 4 ช่องว่างก่อนรหัสของคุณ
FryAmTheEggman

0

PowerShell ขนาด 50 ไบต์

mv *(-join($f=(ls).BaseName)[$f.Length..0]+'.ps1')

มีเพียงไฟล์เดียวดังนั้นmv *เชลล์ wildcard จะมีผลลัพธ์เดียว ชื่อปลายทางคือ(ls).basenameรายการไฟล์ทั้งหมด (นามแฝงสำหรับ 'dir') เรียกใช้คุณสมบัติ BaseName - และเนื่องจากมีไฟล์เพียงไฟล์เดียว PowerShell จะคลายอาร์เรย์ 1 รายการลงในสตริง เก็บชื่อไฟล์$fนั้นไว้แล้วสร้างดัชนีด้วยการนับถอยหลังและ-joinอักขระย้อนกลับสำรองในสตริง เพิ่ม.ps1คำต่อท้ายบังคับ



0

Python 2.7, 68 ไบต์

import os; a = __ ไฟล์ __; os.rename (a, a.split ("\\") [- 1] [: - 3] [:: - 1] + ". py")

นี่อาจเป็นสิ่งที่ดีที่สุดที่ฉันจะได้รับ ฉันเพิ่งพิสูจน์ตัวเองผิด


0

Python (2 & 3), 88 78 ไบต์

import os;os.rename(__file__,''.join(reversed(__file__.split(".")[0]))+".py"))

ใช้ประโยชน์จากข้อเท็จจริงที่ว่าชื่อไฟล์ถูกกำหนดโดย sys.argv (เนื่องจากไดเรกทอรีการทำงานคือโฟลเดอร์ที่ไฟล์นั้นอยู่) และใช้ประโยชน์จาก os.rename น่ารำคาญการกลับรายการเป็นตัววนซ้ำดังนั้นเราต้องใช้การเข้าร่วม

แก้ไข: บันทึก 10 ไบต์โดยใช้ __file__ แทน sys.argv [0] ตามที่ @muddyfish แนะนำให้ @DigitalTrauma





0

SmileBASIC 60 ไบต์

P$=PRGNAME$()FOR I=1-LEN(P$)TO.Q$=Q$+P$[-I]NEXT
RENAME P$,Q$

ทางเลือก:

P$=PRGNAME$()T$=P$*1WHILE""<T$Q$=Q$+POP(T$)WEND
RENAME P$,Q$
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.