Domagaj się nowej nazwy pliku

19

W czasie wykonywania monituj o wiersz danych wejściowych, dopóki dane wejściowe użytkownika nie będą nazwą istniejącego pliku lub katalogu lub innego elementu systemu plików w stosunku do bieżącego katalogu roboczego. Następnie zwróć / wydrukuj ostatnio wprowadzoną nazwę pliku. Możesz założyć, że wszystkie dane wejściowe użytkownika będą poprawnymi nazwami plików.

Pseudokod 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)

Pseudokod 2

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

Przykłady danych wejściowych użytkownika, które spowodują ponowne monitowanie w TIO:

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

Przykłady danych wprowadzanych przez użytkownika, które powrócą podczas korzystania z TIO:

...
env.tio
../../bin/]
/lost/found
Adám
źródło
Jestem całkiem nowym użytkownikiem kodu golfa i nie mogę znaleźć żadnych informacji na temat tego, co liczy się jako rozwiązanie. Czy muszę zawrzeć funkcję main () dla języków, które tego wymagają w programie, czy może to być część nagłówka? Czy instrukcje importu mogą być częścią nagłówka w TIO, czy też muszą być częścią kodu i liczyć się z liczbą bajtów? Mam na przykład takie rozwiązanie: goo.gl/8RWNgu, ale nie jestem pewien, czy bajty byłyby prawidłowe.
Makotosan
2
@Makotosan Zarówno funkcje, jak i pełne programy są w porządku, chociaż w przypadku funkcji muszą być wielokrotnego użytku. Importy zazwyczaj muszą być uwzględnione w liczbie bajtów.
Martin Ender

Odpowiedzi:

7

Partia, 37 bajtów

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

(Z jakiegoś powodu obecny system Windows 10 CMD.EXEuszkadza tytuł podczas wykonywania %0.)

Neil
źródło
7

Mathematica, 33 28 bajtów

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

To zakłada środowisko notebooka Mathematica, w którym możemy sprawdzać dane wejściowe od użytkownika Input[]. Dane wejściowe użytkownika powinny być dosłowne ciągiem literalnym , więc np. "ab/cd.ef"Zamiast po prostu ab/cd.ef. Plusem jest to, że dane wejściowe mogą być dowolnym wyrażeniem Mathematica, które oblicza łańcuch wejściowy.

Definiuje to symbol, fktóry po ocenie wykonuje wymagane obliczenia i ostatecznie ocenia na pierwszym nieistniejącym danych wejściowych użytkownika. Zasadniczo jest to funkcja zerowa, w której nie musimy uwzględniać ...[]jej wywołania.

Możemy również zapisać wiązkę bajtów nad tradycyjnym Ifwyrażeniem, korzystając z operatora podstawienia wzorca /..

Martin Ender
źródło
Nie udaje się to, jeśli użytkownik wpisze to samo dwa razy
Lukas Lang
@ Mathe172 Dobry połów, szkoda, wtedy będę musiał iść z nudną pętlą.
Martin Ender
Okazuje się, że nie, a nawet bajt krótszy. :)
Martin Ender
7

Perl 5 -ln , 12 10 bajtów

-2 bajty dzięki @DomHastings

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

Wypróbuj online!

Ton Hospel
źródło
1
Myślę, że -edziała bez sprecyzowania $_, ale może nie działać w niektórych przypadkach, ale chyba ...
Dom Hastings
@DomHastings Powinien działać we wszystkich przypadkach. Udokumentowano, że $ _ jest używane, gdy nie ma argumentu na -e.
rura
@DomHastings Dzięki. Z jakiegoś powodu myślałem, że -ebył wyjątkiem, ale oczywiście nie jest
Ton Hospel
4

Bash, 29

read f
[ -e $f ]&&$0||echo $f
Cyfrowa trauma
źródło
@ Adám Nie jestem pewien, dlaczego to nie działa w TIO. Wystarczy powiedzieć, że jeśli zapiszesz go jako plik skryptu i uruchomisz, myślę, że działa zgodnie z oczekiwaniami
Digital Trauma
1
@ Adam To działa, problem trzeba było było to, że program został próby wywołania .code.tio, który zawiera korpus skryptu, ale brak informacji o tym, jak go uruchomić. Nie jestem jednak pewien, czy istnieje dobry sposób na obejście shebang, czy ten skrypt musi być na twojej drodze.
FryAmTheEggman
2
Możesz obejść oba (kosztem dwóch bajtów), zmieniając $0na . $0. Wypróbuj online! . Ponieważ .używa względnych nazw ścieżek i bieżącej powłoki.
Chris
1
Co uważa *za wkład?
Toby Speight
4

PowerShell 2 (do 6), 35 bajtów

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

Read-Hostczeka na dane wejściowe (jeśli podano ciąg jako parametr, używa go jako zachęty). Jeśli podanym wejściem jest nazwa pliku (lub nazwa folderu) dla istniejącego, zostanie Test-Pathzwrócony $true, a blok „nic nie rób” zostanie {}wykonany i zostanie ponownie wyświetlony monit o podanie. Jeśli Test-Pathzwraca, $falseponieważ dane wejściowe nie są zachowanym plikiem lub folderem, blok „nic nie rób” nie jest wykonywany, a nazwa wejścia jest drukowana.

Jeff Zeitlin
źródło
1
Witamy w PPCG!
Martin Ender
Nie potrzebujesz średnika po {}, aby zapisać bajt.
Veskah
@Veskah - zrobiłem to na PS2 i nie psuje PS3 +
Jeff Zeitlin
Ach, mój zły. Nie testowałem tego w 2.
Wołka
4

C (gcc) , 62 bajty

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

Wypróbuj online!

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
}
Kona arktyczna
źródło
Witamy w PPCG! Możesz użyć, while(gets(b),!access(b,0));aby zapisać 7 bajtów.
Dennis
3

Funky , 40 bajtów

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

W prawdziwym stylu funky używa słów kluczowych zaciętych względem siebie, niepasujących nawiasów i ukrytych słów kluczowych. Oczyszczone wygląda to następująco:

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

Awaria

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.
ATaco
źródło
3

Haskell , 76 bajtów

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

Wypróbuj online!

Zwraca IO xgdzie xjest wprowadzona nazwa pliku, który nie istnieje.

Nie golfił

import System.Directory

insist = do { file <- getLine;
              exists <- doesPathExist file;
              if exists then insist else pure file }
całkowicie ludzki
źródło
3

R , 66 51 bajtów

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

-15 bajtów dzięki plannapusowi

Uruchamia potencjalnie nieskończoną pętlę, w której na każdej iteracji

  1. Pojedynczy wiersz danych wejściowych użytkownika jest przechowywany w zmiennej s
  2. Sprawdzamy, czy dane wejściowe znajdują się na liście nazw plików dla katalogu roboczego ( należy użyć a=Topcji dla, list.files()aby odebrać takie rzeczy ..)
  3. Jeśli sjest na tej liście, przechodzimy do następnej iteracji; jeśli nie, zrywamy pętlę i drukujemy s.
duckmayr
źródło
Co powiesz na skrócenie tego while((s=readline())%in%list.files(a=T)){};print(s)?
plannapus
@plannapus Świetny pomysł! Rejestrowy.
duckmayr
Nie ma za co. Poza tym nie pomyślałem o tym od razu, ale funkcjonują list.filesi dirsą synonimami, więc możesz je dirtutaj zastąpić .
plannapus
można również wymienić readline()zscan(,'')
JAD
I printzcat
JAD
3

Python 3 , 55 bajtów

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

Wypróbuj online!

-4 bajty dzięki ManfP
-6 bajtów dzięki Rickowi Rongenowi

HyperNeutrino
źródło
2
@ Adám, straszna błędna interpretacja, przepraszam
HyperNeutrino
Można wymienić pierwsze input()z"."
ManfP
1
import osi os.path.existsjest trzy bajty krótszy.
Jonathan Allan
1
Rick Rongen zasugerował import globi dokonałwhile glob.glob(s):... edycji.
Martin Ender
@MartinEnder dzięki za poinformowanie mnie :)
HyperNeutrino
3

C #, 101 bajtów

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

Dla każdej z 4 prawidłowych wartości zwracanych:

Nie golfił

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

Wyjaśnienie

polega na tym, że File.GetAttributes () zgłasza wyjątek, jeśli obiekt systemu plików określony w jego argumencie nie istnieje.

Ryszard II
źródło
2

Powershell 3.0, 75 bajtów

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

Pierwsze podejscie; Jestem pewien, że mogę dokonać kilku optymalizacji.

Nieco bardziej czytelna forma:

$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.
Arkitekt
źródło
Czy nie działałoby to nawet bez $PSScriptRoot\?
Adám
Witamy w PPCG! Kilka szybkich golfów - forzamiast tego możesz użyć pętli, która pozwala przenieść inicjalizację do konstruktora pętli for($x=1;$x){...}. Po drugie, możesz się tego pozbyć, Write-Hostponieważ Write-Outputpo zakończeniu programu istnieje domniemane zakończenie wszystkiego, co pozostanie w potoku, więc samo wyjście $itam wystarczy.
AdmBorkBork
Zobacz moje rozwiązanie poniżej; Zmniejszyłem o połowę liczbę bajtów.
Jeff Zeitlin
@ Adám: Może! Tak naprawdę nie zastanawiałem się nad tym. : P AdmBorkBork Dziękujemy! Spędziłem dużo czasu czając się. To są dobre pomysły; dorozumiany wynik nawet nie przyszedł mi do głowy ...
Arkitekt
2

Java 9, 87 bajtów

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

Nie golfił

JVM TIO najwyraźniej nie ma systemuConsole , więc nie można go tam przetestować (patrz 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));
  }
}
Olivier Grégoire
źródło
2

JavaScript (Node.js) , 158 118 bajtów

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

Wypróbuj online!

Podziękowania dla @ ConorO'Brien za opracowanie krótszej wersji. Obiekty wstawiane zamiast używać stałych i wykorzystywać warunek wyjścia z błędu zamiast jawnego wychodzenia.

Makotosan
źródło
1
Jak dotąd niezła odpowiedź, ale jest miejsce na potencjał. Możesz grać w golfa na kilka sposobów: możesz pominąć oba const, a także zastąpić każdą zmienną jej definicją. Następnie zamiast używać s=>{if(...){...}}, możesz użyć s=>require('fs').existsSync(s)||process.exit(console.log(s)). Dodatkowo możesz wyjść z błędem, więc możesz zapisać lambda jako s=>require('fs').existsSync(s)||--console.log(s). Wypróbuj online!
Conor O'Brien
Świetne pomysły! Dzięki!
Makotosan,
1

Czysty , 100 94 bajtów

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

Wypróbuj online!

wersja z jednym wyrażeniem:

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

Wypróbuj online!

Obrzydliwe
źródło
1

Perl 6, 39 bajtów

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

Działa to w REPL, ale wydaje się, że nie działa poprawnie w TIO.

mattchuranu
źródło
Co z say first !*.IO.e,lines(23 bajtami)?
nwellnhof
Powyższe prawdopodobnie blokuje się na czas nieokreślony, gdy działa w wierszu poleceń, ale coś takiego {}while ($_=get).IO.e;.saypowinno działać.
nwellnhof
1

PHP, 43 bajty

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

Uruchom jako CLI. Dość łatwy do zrozumienia.

tsh
źródło
1

APL (Dyalog) , 17 bajtów

{⍞}⍣{~⎕NEXISTS⍺}⍬

Wypróbuj online!

Uriel
źródło
Zwraca drugie nieistniejące wejście ( the_prev_wasnt_filenamezamiast env.tio). Zmień i wtedy możesz się też pozbyć '.'.
Adám
1

Kotlin , 67 bajtów

val f={var s="."
while(java.io.File(s).exists()){s=readLine()!!}
s}

Wypróbuj online!

Makotosan
źródło
1

Attache , 35 bajtów

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

Wypróbuj online!

Alternatywne rozwiązania

35 bajtów: {If[FileExists[x:=Prompt[]],$[],x]} funkcja rekurencyjna.

37 bajtów {NestWhile[p:=Prompt,p[],FileExists]} :, funkcja iteracyjna.

Conor O'Brien
źródło
1

Min. 38 bajtów

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

Pozostawia ostatnio wprowadzoną nazwę pliku na stosie.

Wyjaśnienie

"."         ; 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
Panda0nEarth
źródło
0

SmileBASIC, 27 bajtów

INPUT S$EXEC!CHKFILE(S$)?S$
12Me21
źródło