Наполягайте на новому імені файлу


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

Я тут доволі новий, щоб кодувати гольф і, здається, не можу знайти жодної інформації про те, що вважається рішенням. Чи потрібно включати головну () функцію для мов, які потребують її в програмі, чи це може бути частиною заголовка? Чи можуть імпорт операторів бути частиною заголовка в 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 -ln , 12 10 байт

-2 байти завдяки @DomHastings

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

Спробуйте в Інтернеті!


1
Я думаю, що -eроботи без уточнення $_можуть не спрацювати в деяких випадках, хоча я думаю ...
Дом Гастінгс

@DomHastings Має працювати у всіх випадках. Задокументовано, що $ _ використовується, коли немає аргументу до -e.
труба

@DomHastings Спасибі. Чомусь я вважав, що -eце виняток, але, звичайно, це не так
Тон Євангелія

4

Баш, 29

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


@ Adám Я не впевнений, чому це не працює в TIO. Досить сказати, якщо ви збережете його як файл сценарію та запускаєте його, я думаю, він працює як слід
Digital Trauma

1
@ Adám Це працює, проблема, яку ви мали, полягала в тому, що програма намагалася викликати те, .code.tioщо містить тіло сценарію, але немає інформації про те, як його запустити. Я не впевнений, чи є хороший спосіб обійти шебанг або цей сценарій потребує вашого шляху.
FryAmTheEggman

2
Ви можете обійти обидва (ціною двох байтів), змінивши $0на . $0. Спробуйте в Інтернеті! . Оскільки .використовуються відносні імена шляху та поточна оболонка.
Кріс

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 +
Джефф Зейтлін

Ах, мій поганий. Не тестували її у 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

R , 66 51 байт

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

-15 байт завдяки планнапусу

Працює потенційно нескінченна петля, де на кожній ітерації

  1. Один рядок введення користувача зберігається у змінній s
  2. Ми перевіряємо, чи є вхідний список у списку імен файлів робочого каталогу ( a=Tдля list.files()підбору таких речей потрібно використовувати параметр для ..)
  3. Якщо sє в цьому списку, ми переходимо до наступної ітерації; якщо ні, ми розриваємо цикл і друкуємо s.

Як щодо скорочення while((s=readline())%in%list.files(a=T)){};print(s)?
планнапус

@plannapus Чудова ідея! Включений.
дакмайер

Ласкаво просимо. Крім того, я не думав про це відразу, але функціонує list.filesі dirє синонімами, тому ви можете замінити його dirтут.
планнапус

ви також можете замінити readline()наscan(,'')
JAD

І printзcat
JAD

3

Python 3 , 55 байт

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

Спробуйте в Інтернеті!

-4 байти завдяки ManfP
-6 байт завдяки Ріку Ронгену


2
@ Adám жахливе неправильне трактування, вибачте
HyperNeutrino

Ви можете замінити першого input()на"."
ManfP

1
import osі os.path.existsна три байти коротше.
Джонатан Аллан

1
Рік Ронген запропонував 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

Дивіться моє рішення нижче; Я вдвічі зменшив кількість байтів.
Джефф Зейтлін

@ Adám: Можливо! Я насправді цього не вважав. : P AdmBorkBork Дякую! Я довго проводжався. Це хороші ідеї; неявний вихід навіть не перейшов мені в голову ...
Аркітект

2

Java 9, 87 байт

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

Безумовно

JVM TIO, мабуть, не має системи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 за створення коротшої версії. Вбудовані об'єкти замість використання consts та використання умови виходу з помилки замість явного виходу.


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

Чудові ідеї! Спасибі!
Макотосан


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.