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

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


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


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!


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


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


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
}

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.

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 }

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.

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


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.


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.

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));
  }
}

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.


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!


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.


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.





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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.