Yeni bir dosya adında ısrar edin


19

Çalışma zamanında, sorulması tutmak bir giriş satırına kullanıcı giriş olana kadar değil Geçerli çalışma dizinine göre varolan dosya veya dizin veya diğer dosya sistemi öğesinin adı. Ardından en son girilen dosya adını döndürün / yazdırın. Tüm kullanıcı girişlerinin geçerli dosya adları olacağını varsayabilirsiniz.

Sahte kod 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)

Sözde kod 2

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

TIO'da yeniden yönlendirmeye neden olacak kullanıcı girişi örnekleri:

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

TIO'da dönecek olan kullanıcı girişi örnekleri:

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

Burada golf kodlamak için oldukça yeniyim ve bir çözüm olarak neyin önemli olduğu hakkında herhangi bir bilgi bulamıyorum. Main () işlevini bir programda gerektiren diller için eklemem gerekir mi, yoksa başlığın parçası olabilir mi? İçe aktarma ifadeleri TIO'daki başlığın bir parçası olabilir mi, yoksa kodun bir parçası olması ve bayt sayısına göre sayılması mı gerekiyor? Örneğin, şu çözüm var: goo.gl/8RWNgu ama baytların meşru olup olmayacağından emin değilim.
Makotosan

2
@Makotosan Hem fonksiyonlar hem de tam programlar iyidir, ancak fonksiyonlar söz konusu olduğunda tekrar kullanılabilir olmaları gerekir. İthalatın genellikle bayt sayısına dahil edilmesi gerekir.
Martin Ender

Yanıtlar:


7

Toplu, 37 bayt

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

(Herhangi bir nedenle, geçerli Windows 10 CMD.EXEçalıştırıldığında başlığı bozar %0.)


7

Mathematica, 33 28 bayt

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

Bu, Mathematica'nın kullanıcıdan girişini sorgulayabileceğimiz dizüstü bilgisayar ortamını varsayar Input[]. Kullanıcı girişi gerçek bir dize değişmezi olmalıdır , yani "ab/cd.ef"sadece yerine ab/cd.ef. Tersi, girdinin girdi dizesini hesaplayan keyfi bir Mathematica ifadesi olabilmesidir.

Bu, fdeğerlendirildiğinde gerekli hesaplamayı gerçekleştiren ve nihayetinde var olmayan ilk kullanıcı girdisini değerlendiren bir sembol tanımlar . Esasen, ...[]onu çağırmak için dahil etmemiz gerekmeyen null bir işlevdir .

IfDesen ikame operatörünü kullanarak geleneksel bir ifadeye bir demet bayt kaydedebiliriz /..


Kullanıcı aynı şeyi iki kez girerse başarısız olur
Lukas Lang

@ Mathe172 İyi yakaladın, çok kötü, o zaman sıkıcı döngü ile gitmek zorunda kalacağım.
Martin Ender

Görünmüyor ki, ve hatta bir bayt daha kısa. :)
Martin Ender

7

Perl 5 -ln , 12 10 bayt

@DomHastings sayesinde -2 bayt

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

Çevrimiçi deneyin!


1
Sanırım -ebelirtmeden çalışır $_, sanırım bazı durumlarda işe yaramayabilir ...
Dom Hastings

@DomHastings Her durumda çalışmalıdır. -E argümanı olmadığında $ _ ifadesinin kullanıldığı belgelenmiştir.
boru

Nedense -ebir istisna olduğunu düşündüm ama tabii ki değil
Ton Hospel

4

Bash, 29

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


@ Adám Neden TIO'da çalışmadığından emin değilim. Bir komut dosyası olarak kaydedip çalıştırırsanız, beklendiği gibi çalıştığını düşünüyorum
Digital Trauma

1
@ Adám Bu işe yarıyor, sahip olduğunuz sorun, programın .code.tiokomut dosyasının gövdesini içeren çağırmaya çalışıyordu , ancak nasıl çalıştırılacağı hakkında bilgi yoktu. Yine de, shebang veya yolunuzda olması gereken bu komut dosyası etrafında çalışmak için güzel bir yol olup olmadığından emin değilim.
FryAmTheEggman

2
Sen değiştirerek hem (iki bayt pahasına) sorunun üstesinden gelebilirsiniz $0için . $0. Çevrimiçi deneyin! . Çünkü .göreli yol adları ve geçerli kabuk kullanır.
Chris

1
*Girdi olarak ne düşünüyor ?
Toby Speight

4

PowerShell 2 (6'ya kadar), 35 bayt

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

Read-Hostgirişi bekler (parametre olarak bir dize verilirse, dizeyi bilgi istemi olarak kullanır). Girilen girdi varolan bir dosya adı (veya klasör adı) ise, Test-Pathgeri döner $trueve "do-nothing" bloğu {}yürütülür ve yeniden giriş ister. Eğer Test-Pathdöner $falsegirdi bir kaybolmamış dosya veya klasör olmadığı için, do-nothing blok yürütmüyor ve giriş adı yazdırılır.


1
PPCG'ye Hoşgeldiniz!
Martin Ender

Bir bayt kaydetmek için {} işaretinden sonra noktalı virgül kullanmanıza gerek yoktur.
Veskah

@Veskah - Ben PS2 yaptım ve PS3 + kesilmez
Jeff Zeitlin

Ah, benim hatam. 2'de test etmedi.
Veskah

4

C (gcc) , 62 bayt

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

Çevrimiçi deneyin!

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'ye Hoşgeldiniz! while(gets(b),!access(b,0));7 bayt kaydetmek için kullanabilirsiniz .
Dennis

3

Korkak , 40 bayt

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

Gerçek korkak bir tarzda, bu birbirinden sıkışmış anahtar kelimeler, eşsiz parantezler ve örtük anahtar kelimeler kullanır. Temizlendi, şöyle görünüyor:

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

Yıkmak

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 bayt

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

Çevrimiçi deneyin!

İade yok dosyanın giriş yapılmış adıdır.IO xx

Ungolfed

import System.Directory

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

3

R , 66 51 bayt

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

Plannapus sayesinde -15 bayt

Her yinelemede potansiyel olarak sonsuz bir döngü çalıştırır

  1. Değişkende tek bir kullanıcı girişi satırı saklanır s
  2. Girdinin çalışma dizini için dosya adları listesinde olup olmadığını kontrol ederiz ( gibi şeyler için a=Tseçenek list.files()kullanılmalıdır ..)
  3. Bu slistede varsa , bir sonraki yinelemeye gidiyoruz; değilse, döngüyü kırar ve yazdırırız s.

Kısaltmaya ne dersiniz while((s=readline())%in%list.files(a=T)){};print(s)?
plannapus

@plannapus Harika bir fikir! Anonim.
Mayıs

Rica ederim. Ayrıca, hemen düşünmedim ama işlevler list.filesve direşanlamlılar, böylece onu dirburada değiştirebilirsiniz .
plannapus

readline()ile de değiştirebilirsinizscan(,'')
JAD

Ve printilecat
JAD

3

Python 3 , 55 bayt

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

Çevrimiçi deneyin!

ManfP sayesinde -4 bayt
Rick Rongen sayesinde -6 bayt


2
@ Adám korkunç yanlış yorumlama, üzgünüm
HyperNeutrino

input()"."
İlkini

1
import osve os.path.existsüç bayt daha kısadır.
Jonathan Allan

1
Rick Rongen önerdi import globve while glob.glob(s):...bir düzenleme yaptı.
Martin Ender

@MartinEnder bana söylediğin için teşekkürler :)
HyperNeutrino

3

C #, 101 bayt

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

4 geçerli dönüş değerinin her biri için:

Ungolfed

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

açıklama

argümanında belirtilen dosya sistemi nesnesi yoksa File.GetAttributes () yönteminin bir istisna atmasına dayanır.


2

Powershell 3.0, 75 bayt

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

İlk girişim; Eminim yapabileceğim birkaç optimizasyon var.

Biraz daha okunabilir bir form:

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

Onsuz bile çalışmaz $PSScriptRoot\mı?
Adám

PPCG'ye Hoşgeldiniz! Birkaç hızlı golf - forbunun yerine bir döngü kullanabilirsiniz , bu da başlatmayı döngü yapıcısına taşımanıza izin verir for($x=1;$x){...}. İkincisi, boru hattında kalan herhangi bir şey için program tamamlandığında Write-Hostörtük bir Write-Outputşey olduğu için kurtulabilirsiniz , bu yüzden sadece $iorada bırakmak yeterli olacaktır.
AdmBorkBork

Aşağıdaki çözümüme bakın; Bayt sayınızı yarıya indirdim.
Jeff Zeitlin

@ Adám: Belki! Aslında bunu düşünmemiştim. : P AdmBorkBork Teşekkür ederiz! Gizlice uzun zaman geçirdim. Bunlar iyi fikirler; örtük çıktı aklımdan bile geçmedi ...
Arkitekt

2

Java 9, 87 bayt

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

Ungolfed

TIO'nun JVM'sinin görünüşe göre bir sistemi yokConsole , bu yüzden orada test edilemez (bkz. 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 bayt

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

Çevrimiçi deneyin!

Daha kısa versiyonunu çıkardığı için @ ConorO'Brien'e teşekkür ederiz. Consts kullanmak ve açıkça çıkmak yerine hata çıkış koşulunu kullanmak yerine eğik nesneler.


1
Şimdiye kadar güzel bir cevap, ama potansiyel için yer var. Bu yaklaşımı birkaç şekilde golf oynayabilirsiniz: her ikisini de atlayabilirsiniz constve her değişkeni tanımıyla değiştirebilirsiniz. Sonra kullanmak yerine s=>{if(...){...}}kullanabilirsiniz s=>require('fs').existsSync(s)||process.exit(console.log(s)). Ayrıca, bir hata ile çıkabilirsiniz, böylece lambda olarak yazabilirsiniz s=>require('fs').existsSync(s)||--console.log(s). Çevrimiçi deneyin!
Conor O'Brien

Harika fikirler! Teşekkürler!
Mart'ta Makotosan

1

Temiz , 100 94 bayt

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

Çevrimiçi deneyin!

tek ifadeli sürüm:

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

Çevrimiçi deneyin!


1

Perl 6, 39 bayt

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

Bu REPL'de çalışıyor, ancak TIO'da düzgün çalışmıyor gibi görünüyor.


Ne hakkında say first !*.IO.e,lines(23 bayt)?
nwellnhof

Yukarıdakiler komut satırında çalıştırıldığında muhtemelen süresiz olarak {}while ($_=get).IO.e;.sayengellenir , ancak benzer bir şey çalışmalıdır.
nwellnhof

1

PHP, 43 bayt

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

CLI olarak çalıştır. Anlamak oldukça kolay.





1

Ataşesi , 35 bayt

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

Çevrimiçi deneyin!

Alternatif çözümler

35 bayt:, {If[FileExists[x:=Prompt[]],$[],x]} özyinelemeli işlev.

37 bayt: {NestWhile[p:=Prompt,p[],FileExists]} yinelemeli işlev.


1

Min . 38 bayt

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

Son girilen dosya adını yığın üzerinde bırakır.

açıklama

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.