새로운 파일 이름을 주장하십시오


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 이 해결책이 있지만 바이트가 합법적인지 확실하지 않습니다.
Makotosan

2
@Makotosan 기능 의 경우 재사용이 가능해야하지만 기능과 전체 프로그램 모두 양호합니다. 가져 오기는 일반적으로 바이트 수에 포함되어야합니다.
마틴 엔더

답변:


7

배치, 37 바이트

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

(어떤 이유로 현재 Windows 10은을 (를 ) CMD.EXE실행할 때 제목을 손상시킵니다 %0.)


7

매스 매 티카, 33 28 바이트

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

이는 Mathematica의 노트북 환경에서 사용자의 입력을 쿼리 할 수 ​​있다고 가정합니다 Input[]. 사용자 입력은 실제 문자열 리터럴 이어야합니다 ( 예 : "ab/cd.ef"just 대신) ab/cd.ef. 단점은 입력이 입력 문자열을 계산하는 임의의 Mathematica 표현식 일 수 있다는 것입니다.

이는 f평가시 필요한 계산을 수행하고 존재하지 않는 첫 번째 사용자 입력으로 평가 되는 기호 를 정의합니다 . 본질적으로 null 함수이므로 ...[]호출 할 필요가 없습니다 .

If패턴 대체 연산자를 사용 하여 기존 표현식 보다 많은 바이트를 절약 할 수 있습니다 /..


사용자가 같은 것을 두 번 입력하면 실패합니다
Lukas Lang

@ Mathe172 좋은 캐치, 너무 나쁜 다음, 나는 지루한 루프와 함께 가야합니다.
Martin Ender

내가하지 않는 것으로 나타 났으며 심지어 바이트가 더 짧습니다. :)
Martin Ender 2016 년

7

펄 5 -ln , 12 10 바이트

@DomHastings 덕분에 -2 바이트

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

온라인으로 사용해보십시오!


1
나는 -e지정하지 않고 작동 한다고 생각 $_하지만 어떤 경우에는 작동하지 않을 수도 있습니다 ...
Dom Hastings

@DomHastings 모든 경우에 작동해야합니다. -e에 인수가 없을 때 $ _가 사용되는 것으로 문서화되어 있습니다.
파이프

@DomHastings Thanks. 어떤 이유로 든 -e예외 라고 생각 했지만 물론 그렇지 않습니다
Ton Hospel

4

배쉬, 29

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


@ Adám 왜 TIO에서 작동하지 않는지 잘 모르겠습니다. 스크립트 파일로 저장하고 실행하면 예상대로 작동한다고 생각합니다.
Digital Trauma

1
@ Adám 이것은 작동합니다. 문제는 프로그램이 .code.tio스크립트 본문을 포함하는 호출하려고 했지만 스크립트 실행 방법에 대한 정보가 없다는 것입니다. shebang을 해결하는 좋은 방법이 있는지 또는이 스크립트가 경로에 있어야하는지 잘 모르겠습니다.
FryAmTheEggman

2
로 변경 $0하여 두 바이트를 모두 얻을 수 있습니다 (2 바이트 비용) . $0. 온라인으로 사용해보십시오! . 이후 .사용 상대 경로 이름과 현재 쉘.
Chris

1
*입력으로 생각하는 것은 무엇입니까 ?
Toby Speight

4

PowerShell 2 (6부터), 35 바이트

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

Read-Host입력을 기다립니다 (문자열로 문자열을 지정하면 문자열을 프롬프트로 사용). 제공된 입력이 존재하는 파일 이름 (또는 폴더 이름) 인 Test-Path경우을 반환 $true하고 do-nothing 블록이 {}실행되고 입력을 위해 다시 프롬프트됩니다. 경우 Test-Path반환 $false입력이 현존하는 파일이나 폴더하지 않기 때문에, 아무것도 실시하지 않는 블록이 실행되지 않고, 입력 이름이 인쇄되어 있습니다.


1
PPCG에 오신 것을 환영합니다!
Martin Ender

바이트를 저장하기 위해 {} 뒤에 세미콜론이 필요하지 않습니다.
Veskah

@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

R , 66 51 바이트

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

plannapus 덕분에 -15 바이트

각 반복에서 잠재적으로 무한 루프를 실행합니다.

  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

파이썬 3 , 55 바이트

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

온라인으로 사용해보십시오!

ManfP 덕분에 -4 바이트
Rick Rickgen 덕분에 -6 바이트


2
@ Adám 끔찍한 오해, 죄송합니다
HyperNeutrino

첫 번째 input()"."
ManfP

1
import osos.path.exists3 바이트 짧습니다.
Jonathan Allan

1
Rick Rongen 은 제안 import glob하고 while glob.glob(s):...편집했습니다.
Martin Ender

@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\않습니까?
Adám

PPCG에 오신 것을 환영합니다! 몇 가지 빠른 골프- for대신 루프를 사용 하여 초기화를 루프 생성자로 옮길 수 있습니다 for($x=1;$x){...}. 둘째, 파이프 라인에 남은 모든 것에 대해 프로그램 완료시 Write-Host암시 적이므로 제거 하면 충분합니다. Write-Output$i
AdmBorkBork

아래 내 솔루션을 참조하십시오. 바이트 수를 반으로 줄였습니다.
Jeff Zeitlin

@ Adám : 어쩌면! 나는 실제로 그것을 고려하지 않았습니다. : P AdmBorkBork 감사합니다! 나는 오랫동안 숨어 지냈다. 좋은 생각입니다. 암묵적인 결과물조차 내 마음을 넘어 가지 않았다.
Arkitekt

2

자바 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

자바 스크립트 (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). 온라인으로 사용해보십시오!
Conor O'Brien

좋은 아이디어! 감사!
Makotosan


1

펄 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

0

SmileBASIC, 27 바이트

INPUT S$EXEC!CHKFILE(S$)?S$
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.