Kaynak dosyasının adını tersine çeviren bir program yazın.


27

Tek bir dosyaya, girdi gerektirmeyen ve çıktı üretmeyen bir program yazın. Çalıştırırken , kodu değiştirmeden veya diğer kalıcı yan etkiler üretmeden , adından bağımsız olarak içinde bulunduğu dosyanın adını tersine çevirmelidir.

Bunu başarmanın herhangi bir yolu iyi. Bu sadece program çalıştırıldığında, kalıcı olan tek değişikliğin dosya adının tersine çevrilmiş olmasıdır. örneğin, dizinde yeni dosyalar olmamalıdır.

Programı tekrar çalıştırmak, adı geri çevirmelidir. Gerçekten de, programın birçok kez keyfi olarak çalıştırılabilmesi gerekir.

Bu zorluğun amaçları için:

  • Dosya adlarının her zaman 1 ila 127 karakter uzunluğunda küçük harflerden (az) oluşan dizeler olduğunu varsayabilirsiniz. (Dilinizde dosyaların çalışması için uzantıların olması gerekiyorsa, uzantıdan önceki kısmı ters çevirin, örneğin mycode.batedocym.bat.)
  • Kod dosyasının kendi başına bir dizinde olduğunu varsayabilir, böylece adlandırma çakışmaları olmaz (kendisi hariç).
  • Sen olabilir değil , dosya adı bir palindrom değil varsayalım tersine aynı yani. Palindrom olan dosya isimleri tıpkı olmayanlar gibi çalışmalıdır.
  • Dosyanızın içeriğini veya meta verilerini okuyabilirsiniz. Hiçbir vardır burada kısıtlamalar.
  • Programınızın belirli, modern, yaygın bir işletim sisteminde (örneğin, Windows / Linux) çalıştırılacağını varsayabilirsiniz, çünkü tüm mermiler aynı komut setine sahip değildir.

Somut bir örnek olarak, mycodekendi dizininde adı verilen bir dosyada bir Python programınız olduğunu varsayalım. Koşu

python mycode

Terminalde dosya adının tersine çevrilmesiyle sonuçlanmalıdır edocym. Dosya edocymkendi dizininde yalnız olmalıdır - adlandırılmış dosya mycodeartık bulunmamalıdır. Koşu

python edocym

adı geri dönecek mycode, bu noktada işlem süresiz olarak tekrarlanabilecektir.

Aynı Python dosyası yeniden adlandırılmışsa racecar(kodu değiştirmeden) ve sonra çalıştır

python racecar

"yarış arabası" bir palindrom olduğundan, hiçbir şey gözle görülür biçimde değişmemelidir. Dosya adı diyelim ki vardı, eğer Aynı gider aya xx.

Bayt cinsinden en kısa kod kazanır. Tiebreaker daha yüksek oyla cevap verdi.


Mevcut çalışma dizini önemli mi?
Brad Gilbert,

@ BradGilbertb2gills Programla birlikte klasörü başka bir yere kopyalayabilmeli ve hala çalıştırabilmelisiniz (izinleriniz varsa veya olmasın). Kabuğun çalışma dizininin, dosyanın bulunduğu klasör olacağını varsayabilirsiniz.
Calvin's Hobbies

6
Derlenmiş bir dil kullanıyorsak ne olur? Yürütülebilir dosya kurallarınızı nasıl etkiler?
EMBLEM

Netleştirme isteği 'girdi kabul edilemez ve çıktı üretmez'. Teknik olarak, dosyanın adı, dosya sisteminden alınmaması gereken bir giriştir ve değiştirilen adın dosya sistemine gönderilmesi gerekir. Bunlar giriş ve çıkış. Başka çıkışlara izin verilmediğini belirtmek faydalı olabilir .
atk

Ek olarak, alt süreçlerin giriş / çıkış kurallarının ihlali olarak kullanıldığını düşünüyor musunuz? Diğer bir deyişle, görevin bir bölümünü gerçekleştirmek için ayrı bir işlem yapmak, adı ters çevirmek gibi, diğer işlemi adın göndermesini gerektirir (kodunuzdan çıktısını ve uygulamaya girerek) ve işlemden değer almayı (işlemin çıktısını almayı gerektirir). ve uygulamaya giriş).
atk

Yanıtlar:


41

Bash + ortak linux utils, 13 bayt

Benim yöntemim @ DigitalTrauma'nınkine benziyor ancak aşağıdakilerden dolayı ls:

mv * `ls|rev`

Oh çok iyi.
Dijital Travma

20
Programlama Bulmacaları ve Kod Golf'üne Hoş Geldiniz! Bu çok güzel bir ilk cevap. :)
Alex A.

1
Yalnızca dizinde başka dosya yoksa çalışır.
WGroleau

1
@WGroleau && terdon: Her iki yorumun da doğru ama soru zaten bu 2 varsayımı ele alıyor.
Julie Pelletier

@JuliePelletier ah, evet, oldukça haklısın. Dosya adlarının sadece küçük harflerden oluşabileceğini özledim.
terdon

14

C #, 153 bayt

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

OO iyidir ve tanımlanmış bir değişkeni elde edene kadar hepsi:

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

bu sadece demek


12

Bash + ortak linux araçları, 15

  • @Dennis sayesinde 1 bayt kurtarıldı

Komut dosyasının tek başına bir dizinde olduğunu varsayar.

mv * `rev<<<$0`

6
Sen kod dosyası tek başına bir dizinde olduğunu varsayalım olabilir , bu nedenle $0değiştirilebilir *.
Dennis,

Maalesef güncellemenizde küçük bir hata var ve olduğu gibi çalışmıyor. En basit çözüm $0, sonuncusu yerine daha önce sahip olduklarınıza daha yakın olmaktır *.
Julie Pelletier,

@JuliePelletier Denedim daha önce işe yarayacak gibiydi, ama evet, haklısın - * globbing genişlemesi bir sağında olmaz <<<.
Dijital Travma

7

Julia, 51 bayt

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

Bu program yalnızca işletim sistemi X üzerinde test edilmesine rağmen işletim sistemi agnostik olmalıdır.

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
Tebrikler! 20k !!!
Luis Mendo

Çoğu yanıt, dosyanın geçerli dizinde olduğunu varsayıyor gibi görünüyor, bu yüzden ihtiyacınız olmadığını düşünüyorum cd. Bu durumda f=readdir()[]daha kısa olurdu.
Dennis,

6

MATLAB, 50 46 bayt

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

4 baytı kaldırmak ve test etmek için @Suever'a teşekkürler!

Her ikisi de Matlab sürüm R2014a olan OS X El Capitan ve Debian Jessie ile test edilmiştir.

Windows'da , dosya kullanılırken dosya adını değiştirmek için bir bayrak 'f'( e='.m';x=mfilename;movefile([x e],[flip(x) e]),'f') gerekir.

Nasıl çalışır

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

Hangi işletim sistemine ihtiyaç duyuyorsunuz 'f'?
Suever

@Severever Windows. Mac'te gerekli değil mi?
Luis Mendo

Görünüşe göre Linux Mac üzerinde gerekli değil.
Suever

@Suever Teşekkürler! 4 bayt kapalı :-)
Luis Mendo

@Suever Bunun çalıştığı işletim sistemini tam olarak belirtebilir misiniz?
Luis Mendo

4

Ruby, 24 bayt

File.rename$0,$0.reverse

Oldukça kendini açıklayıcı. ( $0yürütülmekte olan dosyanın adıdır.)

ruby whateverDosyayı içeren dizinin çalışan bir dizini ile çalıştırın .


4

Toplu, 109 bayt

@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

Not 1: Toplu iş dosyaları bitmelidir .bat; toplu iş dosyasının, uzantısına sahip olmadan adıyla yürütüldüğü ve .batters çevrilmeyeceği varsayılır. Örneğin, reverseyeniden adlandırmak girişiminde reverse.batiçin esrever.bat.
Not 2: CMD.EXEtoplu iş dosyasını yeniden adlandırdıktan sonra hatalar çıktı. ( COMMAND.COMBaşta dize manipülasyonunun yetersiz olması dışında, olmazdı.)

Düzenleme: Dosya adının alfabetik olduğu garantisini kullanarak 2 bayt kaydedildi (@ CᴏɴᴏʀO'Bʀɪᴇɴ yorumuna göre).


3
1. NEDEN ALMAKSINIZ? 2. Bir byte'ı if ]%f% NEQ ] goto l
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ah evet, dosya adı alfabetik, bu yüzden aslında 2 bayt kaydedebilirim, ancak ipucu için teşekkürler.
Neil,

1
Kullandığınız SÜRECE Toplu İş Bağırmana gerek OOBL AKA Smalltalk-80
kedi

4

C, 102 bayt

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

Yıkmak:

                            // 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

Sonunda C'nin (oldukça umutsuzca) rekabet edilemez olduğu bir meydan okuma!


Biz alırsak programı her zaman olduğu gibi çağrılır demek "Dosya içindedir klasör olacaktır kabuğun çalışma dizinini varsayabiliriz" ./myexecutablebasitleştirerek, *n=strrchr(*v,47)için *n=*v+1(10 karakter kurtarmak için, ama bu tamamen geçerli değil ././myexecutableörneğin olarak çağrılabilir ).


In-incelik bir dosya uzantısını (örneğin, ".out") tutmak istiyorsanız Ayrıca, değiştirebilir *t=strchr(b,0)için *t=strrchr(b,46)2 bayt maliyet. Gerçi gerekli değil.


Güzel - renamesrc == dest; Görünüşe göre palindrome kısıtlamasını ücretsiz olarak karşılıyorsunuz.
Toby Speight

Bunun kod noktası 47'nin ayırıcı olduğu bir dosya sistemi gerektirdiğini unutmayın. Bunun POSIX'i içerdiğini düşünüyorum (veya /bir köşe örneğinde EBCDIC'e izin veriyor mu?)
Toby Speight

@TobySpeight evet bazı açıklamalar için gnu.org/software/libc/manual/html_node/Renaming-Files.html dosyasını kontrol ettim , fakat en yakın buldum " Yeniden adlandırmak için özel bir durum, eski ad ile yeni ad aynı dosya için iki isim olduğunda Bu davayı ele almanın tutarlı yolu eski adı silmek. Ancak, bu durumda POSIX'in hiçbir şey yapmamasını ve başarısını rapor etmesini gerektirir - ki bu tutarsızdır. İşletim sisteminizin ne yapacağını bilmiyoruz. " dış şans, POSIX uyumlu olmayan sistemlerde dosyayı siler. Yani evet, gerçek kod kontrol etmeli!
Dave,

Sadece linux.die.net/man/3/rename adresini kontrol ettim ve Linux'un POSIX ile uyumlu şekilde çalıştığını doğruladı: "Eski ve yeni argüman aynı dosyaya çözümlenirse, rename () başarılı bir şekilde geri dönecek ve başka bir işlem gerçekleştirmeyecektir. aksiyon."
Dave,

Debian manpage sayfasına gidecektim: "Eğer aynı dosyaya atıfta bulunulan bağlantılar varsa oldpathve hiçbir şey yapmaz ve bir başarı durumu döndürür"newpathrename() - dizeler aynı ise aynı dosyaya başvururlar.
Toby Speight

3

Vitsy + * sh, 15 bayt

iG:`?r.iG' mr',

açıklama

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.

Bu gönderinin Vitsy'nin güvenli olmayan sürümünü kullanması gerektiğini unutmayın (Çevrimiçi Deneyin!)


3

Perl 5, 18 bayt

Ruby bir (koş perl nameofscript) gibi bir bit :

rename$0,reverse$0

Muhtemel bir yol dikkate alarak çirkin (47 bayt)

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

1
Merhaba, PPCG'ye hoş geldiniz! Harika ilk mesaj!
NoOneIsHere

2

V , 29 26 bayt

:se ri
izyw:!mv z "
dd

Bu yazdırılamayanları içerdiği için, burada bir hex dökümü:

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

Not: Bu TIO dosya erişimine izin vermediğinden v.tryitonline.net üzerinde çalışmayacaktır .

Açıklama:

: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 bayt

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

-Alex.A 1 bayt kaldırıldı.

-Dijital Travma bana gösterdi: os.rename ().

-muddyfish 7 byte kaldırıldı.


Sanırım virgülün ardından boşluğu kaldırarak bir bayt kurtarabilirsinimport
Alex A.

import os,sys;f=sys.argv[0];os.rename(f,f[::-1])48 bayt için hile yapmalı
Digital Trauma

f [:: - 1] yapmak yalnızca dosya adını değil tüm yolu da tersine çevirir. Ancak, beni os.rename () özelliğini tanıttığınız için teşekkür ederiz.
Eflatun

@Magenta Benim için sys.argv[0]sadece komut dosyası doğrudan kendi içinde çalıştırıldığında dosya adını yalnızca yol olmadan döndürür. Helka bunun yolunda olduğunu belirtti
Digital Trauma,

@DigitalTrauma programı kendi başıma çalıştırdığımda sys.arg [0] tam yolunu döndürdü. İkinci bir çözüm ekleyeceğim, burada sys.argv [0] sadece dosya ismidir.
Eflatun

2

PHP, 84, 70, 54 bayt

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


EDIT:insertusernamehere yorumlar sayesinde 14 bayt kaldırıldı
EDIT:Martijn yorumlardaki 16 bayt kaldırıldı


2
Sen onu aşağı alabilirsiniz 70 bayt : rename($f=__FILE__,__DIR__."/".strrev(pathinfo($f)[filename]).".php");.
insertusernamehere

Mükemmel !!! ama kodunuz daha iyi, vay 31
baytınız

Göreceli yapamaz mısın? 7 bayt kurtarır:rename($f=__FILE__,"./".strrev(pathinfo($f)[filename]).".php");
Martijn

veya daha küçük:rename(__FILE__,strrev(basename(__FILE__,'.php')).'.php');
Martijn

Güzel!
Varyasyon

2

PowerShell, 39 bayt

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

Merhaba ve PPCG'ye hoş geldiniz! Güzel ilk mesaj!
Rɪᴋᴇʀ



1

Perl 6 ,  70   27 bayt

Farklı bir çalışma dizininde çalışması gerekirse, bunun gibi bir şeye ihtiyacınız olacaktır:

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

Çalışma dizini programla aynı dizin olacağı için, aşağıdakiler için basitleştirilebilir:

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

Açıklama:

$_ = $*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 (Düğüm), 108 104 68 bayt

Downgoat sayesinde 36 byte kurtarıldı!

Windows sürümü:

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

Diğer sürüm:

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

@ UPgoat, ihtiyacım yok sanmıyorum. jsÖncelikle bir karakterden önce gelen filepath sonunda eşleşiyorum . Bu her zaman bir olacak ..
Conor O'Brien,

1

JavaScript ES6 (Node.js) 70 Bayt

Regex Yay yok!

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

Herhangi bir yardım takdir edilmektedir


1

PowerShell v4 +, 68 bayt

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

Sadece çalışır çünkü betiğin tek başına bir dizinde olması garanti edilir. Bir ls(takma ad Get-ChildItem) gerçekleştirir ve .Nameelde edilen nesnenin (lerin) değerini alır . Biz bu depolamak $cve daha sonra -splitda edebi döneme dosya adını ve uzantısını almak için, ve bu depolamak $ave $bsırasıyla.

Sonraki olduğu mv(için takma Move-Itemtaşınıyoruz komuta,) $cile $a(tersine) .$b.

Örnek

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 veya 3.4+), 61 49 bayt

Bunun optimal Python çözümüne yakın olduğuna inanıyorum:

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

Cevabından ilham alan s4b3r6, ancak tersine yerine liste dilimleme kullanır ve __file__iki kez kullanırken bayt kaydetmek için bir değişkene kaydeder .

Not: Bu, dosya adının her zaman olduğunu varsayar *.py. Herhangi bir iki karakterlik dosya uzantısını işleyebilen biraz daha genel bir çözüm , 1 ekstra bayt pahasına a[-3:]değiştirmek için kullanmaktır ".py".

Güncelleme:a[-4::-1] Dosya uzantısını kaldırmak için liste dilimleme numarasını kullanarak 12 bayt kaydedildi , bölmek yerine ve sonra tersine çevirerek a.split(".")[0][::-1].


1

Powershell, 112 bayt

Unix cmds’i yenmeyeceğim, sadece eğlence için iki pence ekledim :-)

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

PPCG'ye Hoşgeldiniz! Cevapların puanlarını göstermesini istiyoruz, bu yüzden sizin için hazırladım. Ayrıca, kodunuzu vurgulayarak ve parantez gibi görünen düğmeyi seçerek {}veya kodunuzdan önce 4 boşluk ekleyerek kodunuzu biçimlendirebilirsiniz .
FryAmTheEggman

0

PowerShell, 50 bayt

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

Sadece bir dosya var, bu yüzden mv *kabuk joker sadece bir sonuç alacak. (ls).basenameTüm dosyaları listeleyen hedef adı ('dir' için diğer ad), BaseName özelliğini çağırır - ve yalnızca bir dosya bulunduğundan, PowerShell 1 öğe dizisini bir dizeye açacaktır. Bu dosya adını saklayın $f, ardından bir geri sayım ile dizine ekleyin ve -jointersine çevrilmiş karakterleri bir dizeye geri yerleştirin. Zorunlu .ps1soneki ekleyin .


0

AutoIt, 45 bayt

$a=@ScriptName
FileMove($a,StringReverse($a))

0

Python 2.7, 68 bayt

os ithal; a = __ dosya __; os.rename (a, a.split ("\\") [- 1] [: - 3] [:: - 1] + ". py")

Muhtemelen alabileceğim en iyisi budur. Sadece kendimi yanlış kanıtladım.


0

Python (2 ve 3), 88 78 bayt

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

Dosya adının sys.argv tarafından verildiği gerçeğini (çalışma dizini dosyanın bulunduğu klasör olduğu için) kullanır ve os.rename kullanır. Can sıkıcı bir şekilde, ters çevrilmiş bir yineleyici döndürür, bu yüzden birleşim kullanmalıyız.

Düzenleme: @ DigitalTrauma için @muddyfish tarafından önerildiği gibi sys.argv [0] yerine __file__ kullanılarak 10 bayt kaydedildi.



0

Visual Basic Komut Dosyası, 44 Bayt

WScript.Echo(StrReverse(WScript.ScriptName))

Çağrılan dosya için örnek çıktı reverse.vbs(cscript ile çalıştır):

sbv.esrever


0

SmileBASIC 60 bayt

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

Alternatif:

P$=PRGNAME$()T$=P$*1WHILE""<T$Q$=Q$+POP(T$)WEND
RENAME P$,Q$
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.