Nhấn mạnh vào tên tệp mới


19

Trong thời gian chạy, tiếp tục nhắc một dòng đầu vào cho đến khi đầu vào của người dùng không phải là tên của một tệp hoặc thư mục hiện có hoặc mục hệ thống tệp khác, liên quan đến thư mục làm việc hiện tại. Sau đó trả về / in tên tệp đã nhập cuối cùng. Bạn có thể cho rằng tất cả các đầu vào của người dùng sẽ là tên tệp hợp lệ.

Mã giả 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)

Mã giả 2

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

Ví dụ về đầu vào của người dùng sẽ gây ra nhắc nhở lại khi trên TIO:

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

Ví dụ về đầu vào của người dùng sẽ trở lại khi trên TIO:

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

Tôi còn khá mới mẻ với môn đánh gôn ở đây và dường như không thể tìm thấy bất kỳ thông tin nào về những gì được coi là một giải pháp. Tôi có cần bao gồm hàm main () cho các ngôn ngữ yêu cầu nó trong chương trình không, hoặc có thể là một phần của tiêu đề không? Các câu lệnh nhập có thể là một phần của tiêu đề trong TIO hay chúng cần phải là một phần của mã và được tính theo số byte? Ví dụ: tôi có giải pháp này: goo.gl/8RWNgu nhưng không chắc chắn liệu các byte có hợp pháp không.
Makotosan 16/03/18

2
@Makotosan Cả hai chức năng và chương trình đầy đủ đều ổn, mặc dù trong trường hợp chức năng, chúng cần phải được sử dụng lại. Nhập khẩu nói chung cần phải được bao gồm trong số byte.
Martin Ender

Câu trả lời:


7

Mẻ, 37 byte

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

(Vì một số lý do, Windows 10 hiện tại CMD.EXElàm hỏng tiêu đề khi thực thi %0.)


7

Toán học, 33 28 byte

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

Điều này giả định môi trường máy tính xách tay của Mathicala nơi chúng ta có thể truy vấn đầu vào từ người dùng Input[]. Đầu vào của người dùng phải là một chuỗi ký tự thực sự , vì vậy, "ab/cd.ef"thay vì chỉ ab/cd.ef. Ưu điểm là đầu vào có thể là một biểu thức Mathicala tùy ý tính toán chuỗi đầu vào.

Điều này xác định một biểu tượng f, khi được đánh giá thực hiện tính toán cần thiết và cuối cùng là đánh giá đầu vào người dùng không tồn tại đầu tiên. Về cơ bản, đây là một hàm rỗng, trong đó chúng ta không cần ...[]phải gọi nó.

Chúng ta cũng có thể lưu một loạt byte trên một Ifbiểu thức truyền thống bằng cách sử dụng toán tử thay thế mẫu /..


Điều này không thành công nếu người dùng nhập cùng một thứ hai lần
Lukas Lang

@ Mathe172 Bắt tốt, quá tệ, sau đó tôi sẽ phải đi với vòng lặp nhàm chán.
Martin Ender

Hóa ra tôi không, và nó thậm chí còn ngắn hơn một byte. :)
Martin Ender

7

Perl 5 -ln , 12 10 byte

-2 byte nhờ @DomHastings

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

Hãy thử trực tuyến!


1
Tôi nghĩ rằng -ehoạt động mà không chỉ định $_, có thể không hoạt động trong một số trường hợp mặc dù tôi đoán ...
Dom Hastings

@DomHastings Nên hoạt động trong mọi trường hợp. Nó được ghi lại rằng $ _ được sử dụng khi không có đối số với -e.
ống

@DomHastings Cảm ơn. Vì một số lý do, tôi nghĩ đó -elà một ngoại lệ nhưng tất nhiên không phải vậy
TonMedel 16/03/18

4

Bash, 29

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


@ Adám Tôi không chắc tại sao nó không hoạt động trong TIO. Đủ để nói nếu bạn lưu nó dưới dạng tệp tập lệnh và chạy nó, tôi nghĩ rằng nó hoạt động như mong đợi
Digital Trauma

1
@ Adám Điều này hoạt động, vấn đề bạn gặp phải là chương trình đã cố gắng gọi .code.tiophần chứa nội dung của tập lệnh, nhưng không có thông tin về cách chạy nó. Tôi không chắc chắn nếu có một cách hay để làm việc xung quanh shebang hoặc kịch bản này cần phải đi theo con đường của bạn, mặc dù.
FryAmTheEggman 16/03/18

2
Bạn có thể nhận được cả hai (với chi phí là hai byte) bằng cách thay đổi $0thành . $0. Hãy thử trực tuyến! . Vì .sử dụng tên đường dẫn tương đối và shell hiện tại.
Chris

1
Nó nghĩ gì về *đầu vào?
Toby Speight

4

PowerShell 2 (đến 6), 35 byte

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

Read-Hostchờ đầu vào (nếu được cung cấp một chuỗi làm tham số, sử dụng chuỗi làm dấu nhắc). Nếu đầu vào được cung cấp là tên tệp (hoặc tên thư mục) cho tên tồn tại, Test-Pathtrả về $truevà khối không làm gì {}thực thi và nó sẽ nhắc lại cho đầu vào. Nếu Test-Pathtrả về $falsevì đầu vào không phải là tệp hoặc thư mục còn tồn tại, khối không làm gì sẽ không thực thi và tên đầu vào được in.


1
Chào mừng đến với PPCG!
Martin Ender

Bạn không cần dấu chấm phẩy sau {} để lưu một byte.
Veskah

@Veskah - Tôi đã làm trong PS2 và nó không phá vỡ PS3 +
Jeff Zeitlin

Ah, xấu của tôi. Không kiểm tra nó trong 2.
Veskah

4

C (gcc) , 62 byte

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

Hãy thử trực tuyến!

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
}

Chào mừng đến với PPCG! Bạn có thể sử dụng while(gets(b),!access(b,0));để lưu 7 byte.
Dennis

3

Funky , 40 byte

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

Trong phong cách sôi nổi thực sự, điều này sử dụng các từ khóa bị kẹt với nhau, các dấu ngoặc không khớp và các từ khóa ẩn. Dọn dẹp, nó trông giống như:

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

Phá vỡ

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 byte

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

Hãy thử trực tuyến!

Trả về IO xnơi xtên nhập vào của tệp không tồn tại.

Bị đánh cắp

import System.Directory

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

3

R , 66 51 byte

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

-15 byte nhờ vào plannapus

Chạy một vòng lặp có khả năng vô hạn, trong đó trên mỗi lần lặp

  1. Một dòng đầu vào của người dùng được lưu trữ trong biến s
  2. Chúng tôi kiểm tra xem đầu vào có nằm trong danh sách tên tệp cho thư mục làm việc không ( a=Ttùy chọn list.files()phải được sử dụng để chọn những thứ như ..)
  3. Nếu snằm trong danh sách đó, chúng ta sẽ đi đến lần lặp tiếp theo; nếu không, chúng tôi phá vỡ vòng lặp và in s.

Làm thế nào về việc rút ngắn nó để while((s=readline())%in%list.files(a=T)){};print(s)?
plannapus 16/03/18

@plannapus Ý tưởng tuyệt vời! Hợp nhất.
duckmayr 16/03/18

Không có gì. Ngoài ra, tôi đã không nghĩ về nó ngay lập tức nhưng các chức năng list.filesdirlà từ đồng nghĩa, vì vậy bạn có thể thay thế nó dirở đây.
plannapus 16/03/18

bạn cũng có thể thay thế readline()bằngscan(,'')
JAD

printvớicat
JAD

3

Python 3 , 55 byte

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

Hãy thử trực tuyến!

-4 byte nhờ ManfP
-6 byte nhờ Rick Rongen


2
@ Adám giải thích sai lầm khủng khiếp, xin lỗi
HyperNeutrino 15/03/18

Bạn có thể thay thế cái đầu tiên input()bằng"."
ManfP 15/03/18

1
import osos.path.existsngắn hơn ba byte.
Jonathan Allan

1
Rick Rongen đề nghị import globwhile glob.glob(s):...trong một chỉnh sửa.
Martin Ender

@MartinEnder cảm ơn vì đã nói với tôi :)
HyperNeutrino 16/03/18

3

C #, 101 byte

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

Đối với mỗi trong số 4 giá trị trả về hợp lệ:

Bị đánh cắp

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

Giải trình

dựa vào thực tế là File.GetAttribut () đưa ra một ngoại lệ nếu đối tượng hệ thống tệp được chỉ định trong đối số của nó không tồn tại.


2

Powershell 3.0, 75 byte

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

Nỗ lực đầu tiên; Tôi chắc chắn có một vài tối ưu hóa tôi có thể thực hiện.

Một dạng dễ đọc hơn một chút:

$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.

Nó sẽ không hoạt động ngay cả khi không có $PSScriptRoot\?
Adám

Chào mừng đến với PPCG! Một vài golf nhanh - forthay vào đó bạn có thể sử dụng một vòng lặp, cho phép bạn di chuyển việc khởi tạo vào hàm tạo vòng lặp for($x=1;$x){...}. Thứ hai, bạn có thể thoát khỏi Write-Hostvì có một sự ngầm định Write-Outputkhi hoàn thành chương trình cho bất cứ điều gì còn lại trên đường ống, vì vậy chỉ cần rời khỏi $iđó là đủ.
admBorkBork 16/03/18

Xem giải pháp của tôi dưới đây; Tôi đã giảm một nửa số byte của bạn.
Jeff Zeitlin

@ Adám: Có thể! Tôi đã không thực sự xem xét điều đó. : P admBorkBork Cảm ơn bạn! Tôi đã dành một thời gian dài ẩn nấp. Đó là những ý tưởng tốt; đầu ra ngầm thậm chí không qua khỏi tâm trí tôi ...
Arkitekt

2

Java 9, 87 byte

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

Bị đánh cắp

JVM của TIO rõ ràng không có hệ thốngConsole , vì vậy nó không thể kiểm tra được ở đó (xem 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 byte

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

Hãy thử trực tuyến!

Tín dụng cho @ ConorO'Brien để đưa ra phiên bản ngắn hơn. Các đối tượng nội tuyến thay vì sử dụng hằng và sử dụng điều kiện thoát lỗi thay vì thoát rõ ràng.


1
Câu trả lời tốt đẹp cho đến nay, nhưng vẫn còn chỗ cho tiềm năng. Bạn có thể chơi golf theo cách này theo một số cách: bạn có thể bỏ qua cả hai constvà bạn cũng có thể thay thế từng biến bằng định nghĩa của nó. Sau đó, thay vì sử dụng s=>{if(...){...}}, bạn có thể sử dụng s=>require('fs').existsSync(s)||process.exit(console.log(s)). Ngoài ra, bạn có thể thoát với một lỗi, vì vậy bạn có thể viết lambda như s=>require('fs').existsSync(s)||--console.log(s). Hãy thử trực tuyến!
Conor O'Brien

Ý tưởng tuyệt vời! Cảm ơn!
Makotosan 17/03/18


1

Perl 6, 39 byte

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

Điều này hoạt động trong REPL, nhưng nó dường như không hoạt động đúng trong TIO.


Còn say first !*.IO.e,lines(23 byte) thì sao?
nwellnhof 17/03/18

Ở trên có thể chặn vô thời hạn khi chạy trên dòng lệnh, nhưng một cái gì đó như {}while ($_=get).IO.e;.saynên hoạt động.
nwellnhof 17/03/18

1

PHP, 43 byte

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

Chạy như CLI. Khá dễ hiểu.






1

Tối thiểu , 38 byte

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

Lá tên cuối cùng được nhập vào ngăn xếp.

Giải trình

"."         ; 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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.