Во время выполнения продолжайте запрашивать строку ввода, пока пользовательский ввод не станет именем существующего файла или каталога или другого элемента файловой системы относительно текущего рабочего каталога. Затем верните / распечатайте последнее введенное имя файла. Вы можете предположить, что все пользовательские вводы будут действительными именами файлов.
Псевдокод 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
Ответы:
Пакетный, 37 байтов
(По какой-то причине текущая Windows 10
CMD.EXE
портит заголовок при выполнении%0
.)источник
Mathematica,
3328 байтЭто предполагает среду ноутбука Mathematica, где мы можем запросить ввод от пользователя
Input[]
. Пользовательский ввод должен быть действительным строковым литералом , например,"ab/cd.ef"
вместо justab/cd.ef
. Положительным моментом является то, что входные данные могут быть произвольным выражением Mathematica, которое вычисляет входную строку.Это определяет символ,
f
который при оценке выполняет требуемое вычисление и, в конечном счете, оценивает первый несуществующий пользовательский ввод. По сути, это нулевая функция, которую мы не должны включать...[]
для вызова.Мы также можем сохранить несколько байтов поверх традиционного
If
выражения, используя оператор подстановки шаблона/.
.источник
Perl 5
-ln
,1210 байт-2 байта благодаря @DomHastings
Попробуйте онлайн!
источник
-e
работает без указания$_
, может не работать в некоторых случаях, хотя я думаю ...-e
это исключение, но, конечно, это не такБаш, 29
источник
.code.tio
которой содержится тело скрипта, но нет информации о том, как его запустить. Я не уверен, есть ли хороший способ обойти shebang или этот сценарий должен быть на вашем пути, хотя.$0
на. $0
. Попробуйте онлайн! , Так как.
использует относительные имена путей и текущую оболочку.*
входным?PowerShell 2 (через 6), 35 байт
Read-Host
ожидает ввода (если задана строка в качестве параметра, используется строка в качестве подсказки). Если предоставленным вводом является имя файла (или имя папки) для существующего,Test-Path
возвращается$true
, и блок бездействия{}
выполняется, и он повторно запрашивает ввод. ЕслиTest-Path
возвращается,$false
потому что ввод не является существующим файлом или папкой, блок «ничего не делать» не выполняется, и имя ввода печатается.источник
C (gcc) , 62 байта
Попробуйте онлайн!
источник
while(gets(b),!access(b,0));
чтобы сохранить 7 байтов.Фанки , 40 байт
В стиле фанк, здесь используются ключевые слова, заклинивающие друг друга, непревзойденные скобки и неявные ключевые слова. Вычищен, это выглядит так:
Сломать
источник
Haskell , 76 байт
Попробуйте онлайн!
Возвращает
IO x
гдеx
введенное имя файла, который не существует.Ungolfed
источник
R ,
6651 байт-15 байт благодаря планнапу
Запускает потенциально бесконечный цикл, где на каждой итерации
s
a=T
опцияlist.files()
должна использоваться, чтобы подобрать такие вещи, как..
)s
в этом списке, мы переходим к следующей итерации; если нет, мы разрываем цикл и печатаемs
.источник
while((s=readline())%in%list.files(a=T)){};print(s)
?list.files
иdir
является синонимом, так что вы можете заменить егоdir
здесь.readline()
наscan(,'')
print
сcat
Python 3 , 55 байт
Попробуйте онлайн!
-4 байта благодаря ManfP
-6 байтов благодаря Рику Ронгену
источник
input()
на"."
import os
иos.path.exists
на три байта короче.import glob
иwhile glob.glob(s):...
в редакции.C #, 101 байт
Для каждого из 4 действительных возвращаемых значений:
Попробуйте онлайн! (возвращает «...»)
Попробуйте онлайн! (возвращает 'env.tio')
Попробуйте онлайн! (возвращает '../..bin/])
Попробуйте онлайн! (возвращает '/ потерян / найден)
Ungolfed
объяснение
опирается на тот факт, что File.GetAttributes () создает исключение, если объект файловой системы, указанный в его аргументе, не существует.
источник
Powershell 3.0, 75 байт
Первая попытка; Я уверен, что есть несколько оптимизаций, которые я мог бы сделать.
Немного более читаемая форма:
источник
$PSScriptRoot\
?for
вместо этого вы можете использовать цикл, который позволяет перенести инициализацию в конструктор циклаfor($x=1;$x){...}
. Во-вторых, вы можете избавиться от тогоWrite-Host
, чтоWrite-Output
при завершении программы есть неявное завершение всего, что осталось в конвейере, поэтому достаточно просто уйти$i
оттуда.Java 9, 87 байт
Ungolfed
JVM от TIO, по-видимому, не имеет системы
Console
, поэтому она там не тестируется (см.System.console()
).источник
JavaScript (Node.js) ,
158118 байтПопробуйте онлайн!
Благодарим @ ConorO'Brien за более короткую версию. Встроенные объекты вместо использования consts и использования условия выхода из ошибки вместо явного выхода.
источник
const
, и вы также можете заменить каждую переменную ее определением. Тогда вместо использованияs=>{if(...){...}}
вы можете использоватьs=>require('fs').existsSync(s)||process.exit(console.log(s))
. Кроме того, вы можете выйти с ошибкой, поэтому вы можете записать лямбда какs=>require('fs').existsSync(s)||--console.log(s)
. Попробуйте онлайн!Чистый ,
10094 байтаПопробуйте онлайн!
версия с одним выражением:
Попробуйте онлайн!
источник
Perl 6, 39 байт
Это работает в REPL, но, похоже, не работает должным образом в TIO.
источник
say first !*.IO.e,lines
(23 байта)?{}while ($_=get).IO.e;.say
должно работать.PHP, 43 байта
Запустите как CLI. Довольно легко понять.
источник
Рубин ,
40 3937 байтПопробуйте онлайн!
источник
APL (Dyalog) , 17 байт
Попробуйте онлайн!
источник
the_prev_wasnt_filename
вместоenv.tio
). Изменить⍵
→⍺
и тогда вы тоже можете избавиться'.'
.Котлин , 67 байт
Попробуйте онлайн!
источник
Атташе , 35 байт
Попробуйте онлайн!
Альтернативные решения
35 байт:
{If[FileExists[x:=Prompt[]],$[],x]}
рекурсивная функция.37 байт:
{NestWhile[p:=Prompt,p[],FileExists]}
итерационная функция.источник
Мин , 38 байт
Оставляет последнее введенное имя файла в стеке.
объяснение
источник
SmileBASIC, 27 байт
источник