坚持使用新文件名


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()函数,或者可以将其作为标头的一部分吗?导入语句可以成为TIO中标头的一部分,还是需要作为代码的一部分并根据字节数进行计数?例如,我有以下解决方案:goo.gl/8RWNgu,但是不确定字节是否合法。
Makotosan

2
@Makotosan 函数和完整程序都可以,尽管在功能方面需要可重用。导入通常需要包括在字节数中。
马丁·恩德

Answers:


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"而不是just ab/cd.ef。好处是输入可以是计算输入字符串的任意Mathematica表达式。

这定义了一个符号f,该符号在进行评估时会执行所需的计算,并最终评估为第一个不存在的用户输入。从本质上讲,它是一个null函数,我们不必在其中包含...[]调用它的功能。

If通过使用模式替换运算符,我们还可以在传统表达式上节省一堆字节/.


如果用户输入同样的事情,这两次失败
卢卡斯·兰

@ Mathe172好抓住,太糟糕了,那我就不得不去无聊的循环了。
马丁·恩德

事实证明我没有,甚至更短了一个字节。:)
马丁·恩德


4

Bash,29岁

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


@Adám我不确定为什么它在TIO中不起作用。可以说如果将其保存为脚本文件并运行,我认为它可以按预期的方式工作
Digital Trauma

1
@亚当这个工作,你有问题的是,该计划试图调用.code.tio包含脚本的身体,但对如何运行的信息。我不确定是否有很好的方法可以解决shebang或此脚本是否需要放在您的路径中。
FryAmTheEggman

2
通过更改$0为,可以同时解决这两个问题(以两个字节为代价). $0在线尝试!。因为.使用相对路径名和当前外壳。
克里斯(Chris)

1
它认为*输入是什么?
Toby Speight,

4

PowerShell 2(至6),35字节

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

Read-Host等待输入(如果给定字符串作为参数,则使用字符串作为提示)。如果提供的输入是存在的文件名(或文件夹名),则Test-Path返回$true,并且空操作块将{}执行,然后重新提示输入。如果Test-Path返回$false,因为输入不是现存的文件或文件夹,则什么也不做块不执行,输入名字被打印出来。


1
欢迎来到PPCG!
马丁·恩德

您无需在{}之后使用分号来保存字节。
维斯卡

@Veskah-我在PS2中操作,但并没有破坏PS3 +
Jeff Zeitlin

啊,我的坏。没有在2中对其进行测试
。– Veskah

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

哈斯克尔,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)

-15字节归功于plannapus

运行潜在的无限循环,在每次迭代中

  1. 用户输入的一行存储在变量中 s
  2. 我们检查输入内容是否在工作目录的文件名列表中(必须使用的a=T选项list.files()来拾取..
  3. 如果s在该列表中,则转到下一个迭代;如果没有,我们打破循环并打印s

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

@plannapus好主意!成立。
duckmayr

别客气。另外,我没有立即想到它,而是函数list.filesdir它们是同义词,因此您可以dir在这里替换它。
plannapus

您也可以readline()scan(,'')
JAD

printcat
JAD


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

请参阅下面的解决方案;我把你的字节数减半了。
杰夫·齐特林

@Adám:也许!我实际上没有考虑过。:P AdmBorkBork谢谢!我潜伏了很长时间。这些是好主意;隐式输出甚至都没让我想到...
Arkitekt

2

Java 9,87字节

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

不打高尔夫球

TIO的JVM显然没有系统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)158118字节

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))。此外,您可能会退出并出现错误,因此可以将lambda编写为s=>require('fs').existsSync(s)||--console.log(s)在线尝试!
Conor O'Brien

好主意!谢谢!
Makotosan

1

干净100 94字节

import System.IO,System.File
Start w#(s,w)=evalIO getLine w
#(b,w)=fileExists s w
|b=Start w=s

在线尝试!

单表达式版本:

import System.IO,System.File
Start w=(\(s,v)=(\(b,w)|b=Start w=s)(fileExists s v))(evalIO getLine w)

在线尝试!


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

附件,35字节

{While[FileExists[x:=Prompt[]],0]x}

在线尝试!

替代解决方案

35个字节: {If[FileExists[x:=Prompt[]],$[],x]},递归函数。

37个字节: {NestWhile[p:=Prompt,p[],FileExists]},迭代函数。


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

0

SmileBASIC,27个字节

INPUT S$EXEC!CHKFILE(S$)?S$
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.