新しいファイル名を主張する


19

実行時に、入力を求めるキープ入力のラインユーザの入力があるまではない、現在の作業ディレクトリからの相対、既存のファイルまたはディレクトリ、または他のファイルシステム項目の名前。次に、最後に入力したファイル名を返す/印刷します。すべてのユーザー入力が有効なファイル名になると仮定することができます。

擬似コード1

myform = new form("GUI")
myform.mytxt = new editfield("")
myform.ok = new button("OK")
repeat
  waitfor(myform.ok,"click")
until not filesystem.exists(myform.mytxt.content)
return(myform.mytxt.content)

擬似コード2

LET TEXT = "."
WHILE HASFILE(TEXT) DO
  TEXT = PROMPT("")
ENDWHILE
RETURN TEXT

TIOを使用しているときに再プロンプトを表示するユーザー入力の例:

.
..
.env.tio
/
/bin/[
/lost+found

TIOのときに返されるユーザー入力の例:

...
env.tio
../../bin/]
/lost/found

ここでゴルフをコーディングするのはかなり新しいので、何が解決策としてカウントされるかについての情報を見つけることができないようです。プログラムでそれを必要とする言語のmain()関数を含める必要がありますか、それともヘッダーの一部にできますか?importステートメントをTIOのヘッダーの一部にすることはできますか、それともコードの一部としてバイトカウントに対してカウントする必要がありますか?たとえば、goo.gl / 8RWNguというソリューションがありますが、バイトが正当かどうかはわかりません。
マコトサン

2
@Makotosan 関数と完全なプログラムどちらも問題ありませんが、関数の場合は再利用可能である必要があります。通常、インポートはバイトカウントに含める必要があります。
マーティンエンダー

回答:


7

バッチ、37バイト

@set/ps=
@if exist %s% %0
@echo %s%

(何らかの理由で、現在のWindows 10 CMD.EXEでは、実行時にタイトルが破損し%0ます。)


7

Mathematica、33 28バイト

f:=Input[]/._?FileExistsQ:>f

これは、を使用してユーザーからの入力を照会できるMathematicaのノートブック環境を想定していますInput[]。ユーザーの入力はする必要があります実際の文字列リテラルので、たとえば、"ab/cd.ef"ちょうど代わりにab/cd.ef。利点は、入力が入力文字列を計算する任意のMathematica式にできることです。

これは、f評価時に必要な計算を実行し、最終的に存在しない最初のユーザー入力に対して評価するシンボルを定義します。それは本質的にヌル関数であり...[]、呼び出すために含める必要はありません。

Ifパターン置換演算子を使用することで、従来の式よりも多くのバイトを節約することもできます/.


ユーザーが二度同じことを入力した場合これが失敗した
ルーカス・ラング

@ Mathe172良いキャッチ、あまりにも悪い、そして私は退屈なループで行かなければならないでしょう。
マーティンエンダー

私はそうではないことが判明し、それはさらに短いバイトです。:)
マーティン・エンダー

7

Perlの5 -ln12の、10バイト

@DomHastingsのおかげで-2バイト

#!/usr/bin/perl -ln
-e||1/!say

オンラインでお試しください!


1
私が思うに-e指定せずに作品を$_私は推測するのにいくつかのケースでは動作しない可能性があります...
ドムヘイスティングス

@DomHastingsはすべての場合に機能するはずです。-eに引数がない場合に$ _が使用されることが文書化されています。
パイプ

私は思ったいくつかの理由Thanks.For @DomHastingsは-e例外だったが、もちろんそうではありません
トンHospel

4

バッシュ、29

read f
[ -e $f ]&&$0||echo $f


@AdámTIOでなぜ機能しないのかわかりません。スクリプトファイルとして保存し、それを実行する場合、私は予想通り、それがうまくいくと思う言えば十分
デジタルトラウマ

1
@Adám これは機能します。問題.code.tioは、スクリプトの本体を含むプログラムが呼び出そうとしていたが、実行方法に関する情報がなかったことでした。しかし、シバンを回避する良い方法があるのか​​、このスクリプトをあなたのパスに入れる必要があるのか​​はわかりません。
FryAmTheEggman

2
あなたは、変更することにより、(2バイトのコストで)の両方を回避することができます$0. $0オンラインでお試しください!.相対パス名と現在のシェルを使用するため。
クリス

1
*入力として何を考えますか?
トビースパイト

4

PowerShell 2(6まで)、35バイト

while(Test-Path($x=Read-Host)){};$x

Read-Host入力を待機します(文字列をパラメーターとして指定した場合、その文字列をプロンプトとして使用します)。提供された入力が存在するファイルのファイル名(またはフォルダー名)である場合、をTest-Path返し$true、do-nothingブロックが{}実行され、入力を再度求められます。入力が既存のファイルまたはフォルダーではないためにTest-Path戻る場合$false、do-nothingブロックは実行されず、入力名が出力されます。


1
PPCGへようこそ!
マーティンエンダー

バイトを保存するために{}の後にセミコロンは必要ありません。
ヴェスカー

@Veskah -私はPS2でやった、そしてそれはPS3 +を破壊しない
ジェフ・ザイトリン

ああ、私の悪い。2でテストしませんでした
ベスカ

4

C(gcc)、62バイト

main(){char b[99];while(scanf("%s",b)&&!access(b,0));puts(b);}

オンラインでお試しください!

main(){
    char b[99]; // Declare buffer b
    while (scanf("%s",b)&&!access(b,0));    // Take one line of input, and test if file is accessible (exists)
    puts (b);   // If doesn't exist, loop ends and print file
}

PPCGへようこそ!while(gets(b),!access(b,0));7バイトの節約に使用できます。
デニス

3

ファンキー、40バイト

tryfor)io.open(s=io.read())catchprint(s)

真のファンキーなスタイルでは、これは、互いにぶつかったキーワード、不一致の括弧、および暗黙的なキーワードを使用します。クリーンアップすると、次のようになります。

try{
    while(true){
        s = io.read()
        io.open(s)
    }
}catch(e){
    print(s)
}

壊す

try                                     // Try statement, this one is expected to fail.
   for)                                 // for) is a for loop with no arguments, which is functionally equivilent to a while(true) loop, much like for(;;)
       io.open(                         // Try to open a file relative to the CWD. If this fails to find a file, it will throw an error and escape the try/catch
               s=io.read()              // Read a line from STDIN and store it as s, this will still pass it to the arguments of the call.
                          )
                           catch        // When io.open fails
                                print(s)// Print out the last entered line.

3

Haskell、76バイト

import System.Directory
f=do x<-getLine;b<-doesPathExist x;last$pure x:[f|b]

オンラインでお試しください!

存在しないファイルの入力名がIO xどこにxあるかを返します。

非ゴルフ

import System.Directory

insist = do { file <- getLine;
              exists <- doesPathExist file;
              if exists then insist else pure file }

3

R66 51バイト

while((s=readline())%in%list.files(a=T)){};print(s)

plannapusのおかげで-15バイト

潜在的に無限ループを実行します。各反復で

  1. ユーザー入力の1行が変数に保存されます s
  2. 入力が作業ディレクトリのファイル名のリストにあるかどうかを確認しa=Tます(などのオプションを選択するにlist.files()は、オプションを使用する必要があります..
  3. sがそのリストにある場合、次の反復に進みます。そうでない場合は、ループを中断して印刷しますs

短縮するのはwhile((s=readline())%in%list.files(a=T)){};print(s)どうですか?
プランナパス

@plannapus素晴らしいアイデア!組み込まれています。
duckmayr

どういたしまして。また、私はすぐにそれを考えませんでしたが、機能list.filesdir、同義語ですので、dirここで置き換えることができます。
plannapus

あなたも置き換えることができreadline()scan(,'')
JAD

printcat
JAD

3

Python 3、55バイト

import glob
s="."
while glob.glob(s):s=input()
print(s)

オンラインでお試しください!

ManfPのおかげで-4バイト
Rick Rongenのおかげで-6バイト


2
@Adámのひどい誤解、ごめんなさい
HyperNeutrino

最初のものinput()"."
-ManfP

1
import osそしてos.path.exists3バイト短くなります。
ジョナサンアラン

1
リックRongenは提案import globしてwhile glob.glob(s):...編集しました。
マーティンエンダー

@MartinEnder教えてくれてありがとう:)
HyperNeutrino

3

C#、101バイト

()=>{var s="";try{for(;;System.IO.File.GetAttributes(s=System.Console.ReadLine()));}catch{}return s;}

4つの有効な戻り値のそれぞれについて:

非ゴルフ

() =>
{
    var s = "";
    try
    {
        for(;; System.IO.File.GetAttributes(s = System.Console.ReadLine()));
    }
    catch {}
    return s;
}

説明

引数で指定されたファイルシステムオブジェクトが存在しない場合、File.GetAttributes()が例外をスローするという事実に依存しています。


2

Powershell 3.0、75バイト

$x=1;while($x){$i=Read-Host;$x=Test-Path("$PSScriptRoot\$i")};Write-Host $i

最初の試み; いくつかの最適化ができると確信しています。

もう少し読みやすい形式:

$x=1;                                                                       # Make sure we enter our while loop.
     while($x){                                                             # While we keep getting file names,                   
               $i=Read-Host;                                                # Get input from the user
                            $x=Test-Path("$PSScriptRoot\$i")};              # Combine our path with the user input, and see if it already exists.
                                                              Write-Host $i # Return the final (valid) file name.

なくても機能しません$PSScriptRoot\か?
アダム

PPCGへようこそ!いくつかの簡単なゴルフ- for代わりにループを使用できます。これにより、初期化をループコンストラクターに移動できますfor($x=1;$x){...}。第二に、パイプラインに残っているものにはプログラムの完了時にWrite-Host暗黙的なものがあるので、それを取り除くことができます。Write-Output$i
AdmBorkBork

以下の私のソリューションを参照してください。バイト数が半分になりました。
ジェフ

@アダム:たぶん!私は実際にそれを考えていませんでした。:P AdmBorkBorkありがとうございます!私は長い時間を潜んで過ごしました。これらは良いアイデアです。暗黙の出力は私の心を横切ることさえありませんでした...
アルキテクト

2

Java 9、87バイト

v->{String s;for(;new java.io.File(s=System.console().readLine()).exists(););return s;}

非ゴルフ

TIOのJVMにはsystemがないConsoleようであるため、そこでテストできません(参考文献を参照System.console())。

import java.util.function.*;
class Main {
  public static void main(String[] args) {
    Function<Void,String> f =


v->{
  String s;
  for(;new java.io.File(s=System.console().readLine()).exists(););
  return s;
}


;
    System.out.println(f.apply(null));
  }
}

2

JavaScript(Node.js)158 118バイト

require('readline').createInterface({input:process.stdin}).on('line',s=>require('fs').existsSync(s)||--console.log(s))

オンラインでお試しください!

@ ConorO'Brienは、短いバージョンを思いついた功績があります。constを使用する代わりにインラインオブジェクトを使用し、明示的に終了する代わりにエラー終了条件を使用します。


1
これまでのところいい答えですが、潜在的な余地があります。このアプローチはいくつかの方法でゴルフできます。両方を省略しconst、各変数をその定義で置き換えることもできます。次に、を使用する代わりに、を使用s=>{if(...){...}}できますs=>require('fs').existsSync(s)||process.exit(console.log(s))。さらに、エラーで終了できるため、ラムダをとして記述できますs=>require('fs').existsSync(s)||--console.log(s)オンラインでお試しください!
コナーオブライエン

素晴らしいアイデア!ありがとう!
マコトサン


1

Perl 6、39バイト

my$f=".";while $f.IO.e {$f=get};say $f;

これはREPLでは機能しますが、TIOでは適切に機能しないようです。


何についてsay first !*.IO.e,lines(23バイト)?
-nwellnhof

上記はおそらくコマンドラインで実行されると無期限にブロックされますが、何かのように動作する{}while ($_=get).IO.e;.sayはずです。
nwellnhof

1

PHP、43バイト

<?for(;file_exists($f=readline()););echo$f;

CLIとして実行します。とても分かりやすい。






1

最小、38バイト

"." :a (a exists?) ("" ask @a) while a

最後に入力したファイル名をスタックに残します。

説明

"."         ; Put . on the stack. Every directory should contain this...
:a          ; Assign to a
(a exists?) ; A quot that checks if a exists in current directory
("" ask @a) ; Read line from stdin, assign to a
while       ; Do the second quote while the first leaves true on the stack
a           ; Leave a on the stack

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.