एक नए फ़ाइल नाम पर जोर दें


19

रनटाइम में, इनपुट की एक पंक्ति के लिए संकेत देते रहें, जब तक कि उपयोगकर्ता इनपुट मौजूदा फ़ाइल या निर्देशिका या अन्य फ़ाइल सिस्टम आइटम का नाम नहीं है, जो वर्तमान कार्यशील निर्देशिका के सापेक्ष है। फिर रिटर्न / प्रिंट कि अंतिम इनपुट फ़ाइल नाम। आप मान सकते हैं कि सभी उपयोगकर्ता इनपुट मान्य फ़ाइलनाम होंगे।

छद्म संहिता १

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
@ माकोतोसन दोनों कार्य और पूर्ण कार्यक्रम ठीक हैं, हालांकि कार्यों के मामले में उन्हें पुन: प्रयोज्य होने की आवश्यकता है। आम तौर पर आयात को बाइट की गिनती में शामिल करने की आवश्यकता होती है।
मार्टिन एंडर

जवाबों:


7

बैच, 37 बाइट्स

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

(किसी कारण से वर्तमान विंडोज़ 10 CMD.EXEशीर्षक निष्पादित करता है जब यह निष्पादित होता है %0।)


7

गणितज्ञ, 33 28 बाइट्स

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

यह Mathematica के नोटबुक वातावरण को मानता है जहाँ हम उपयोगकर्ता से इनपुट क्वेरी कर सकते हैं Input[]। उपयोगकर्ता इनपुट होना चाहिए एक वास्तविक स्ट्रिंग शाब्दिक , तो जैसे "ab/cd.ef"बस के बजाय ab/cd.ef। उल्टा यह है कि इनपुट एक मनमाना मैथमैटिक अभिव्यक्ति हो सकती है जो इनपुट स्ट्रिंग की गणना करती है।

यह एक प्रतीक को परिभाषित करता है f, जब मूल्यांकन किया जाता है कि आवश्यक गणना करता है और अंततः पहले गैर-मौजूद उपयोगकर्ता इनपुट का मूल्यांकन करता है। यह अनिवार्य रूप से एक अशक्त कार्य है, जहां हमें ...[]इसे कॉल करने के लिए शामिल करने की आवश्यकता नहीं है ।

हम Ifपैटर्न प्रतिस्थापन संचालक का उपयोग करके पारंपरिक अभिव्यक्ति पर बाइट्स का एक गुच्छा भी बचा सकते हैं /.


यह विफल हो जाता है यदि उपयोगकर्ता एक ही चीज को दो बार इनपुट करता है
लुकास लैंग

@ Mathe172 अच्छा पकड़, बहुत बुरा है, तो मुझे बोरिंग लूप के साथ जाना होगा।
मार्टिन एंडर

मुझे पता नहीं है, और यह भी एक बाइट कम है। :)
मार्टिन एंडर

7

पर्ल 5 -ln , 12 10 बाइट्स

-2 बाइट्स @DomHastings की बदौलत

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

इसे ऑनलाइन आज़माएं!


1
मुझे लगता है कि -eनिर्दिष्ट किए बिना काम करता है $_, कुछ मामलों के लिए काम नहीं कर सकता, हालांकि मुझे लगता है ...
डोम हेस्टिंग्स

@DomHastings को सभी मामलों में काम करना चाहिए। यह दस्तावेज है कि $ _ का उपयोग तब किया जाता है जब कोई तर्क नहीं होता है -e।
पाइप

@DomHastings धन्यवाद। कुछ कारणों से मुझे लगा कि -eयह एक अपवाद था, लेकिन निश्चित रूप से यह नहीं है
टन हास्पेल

4

बैश, २ ९

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


@ मुझे यकीन नहीं है कि यह TIO में काम क्यों नहीं करता है। यह कहने के लिए पर्याप्त है कि क्या आप इसे एक स्क्रिप्ट फ़ाइल के रूप में सहेजते हैं और इसे चलाते हैं, मुझे लगता है कि यह अपेक्षा के अनुरूप काम करता है
डिजिटल ट्रॉमा

1
@ Adám यह काम करता है, आपके पास समस्या यह थी कि प्रोग्राम कॉल करने की कोशिश कर रहा था .code.tioजिसमें स्क्रिप्ट शामिल है, लेकिन इसे चलाने के तरीके के बारे में कोई जानकारी नहीं है। मुझे यकीन नहीं है कि अगर शेबंग के आसपास काम करने का एक अच्छा तरीका है या इस स्क्रिप्ट को आपके रास्ते में होना चाहिए, हालांकि।
FryAmTheEggman

2
आप दोनों (दो बाइट्स की लागत पर) को बदलकर प्राप्त $0कर सकते हैं . $0इसे ऑनलाइन आज़माएं! । चूंकि .सापेक्ष पथ नामों और वर्तमान शेल का उपयोग करता है।
क्रिस

1
यह *इनपुट के रूप में क्या सोचता है ?
टोबे स्पाइट

4

पॉवरशेल 2 (6 के माध्यम से), 35 बाइट्स

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

Read-Hostइनपुट की प्रतीक्षा करता है (यदि पैरामीटर के रूप में एक स्ट्रिंग दी जाती है, तो स्ट्रिंग को संकेत के रूप में उपयोग करता है)। यदि प्रदान किया गया इनपुट मौजूद है, तो Test-Pathरिटर्न के लिए एक फ़ाइल नाम (या फ़ोल्डर नाम) है $true, और कुछ भी नहीं ब्लॉक {}निष्पादित करता है, और यह इनपुट के लिए फिर से संकेत देता है। यदि Test-Pathरिटर्न $falseक्योंकि इनपुट एक्सटैंट फाइल या फोल्डर नहीं है, तो कुछ भी ब्लॉक नहीं करता है, और इनपुट नाम प्रिंट हो जाता है।


1
PPCG में आपका स्वागत है!
मार्टिन एंडर

बाइट को बचाने के लिए आपको {} के बाद अर्ध-बृहदान्त्र की आवश्यकता नहीं है।
विस्काह

@Veskah - मैंने PS2 में किया था, और यह PS3 +
जेफ ज़िटलिन

आह, मेरी बुर। 2 में इसका परीक्षण नहीं किया था
Veskah

4

सी (जीसीसी) , 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

आर , 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 महान विचार! शामिल।
duckmayr

आपका स्वागत है। इसके अलावा, मैंने अभी इसके बारे में नहीं सोचा था लेकिन कार्य list.filesऔर dirसमानार्थक शब्द हैं, इसलिए आप इसे dirयहां से बदल सकते हैं।
प्लेनैपस

तुम भी readline()साथ बदल सकते हैंscan(,'')
JAD

और printसाथcat
JAD

3

पायथन 3 , 55 बाइट्स

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

इसे ऑनलाइन आज़माएं!

-4 बाइट्स धन्यवाद मैनफप
-6 बाइट्स के लिए धन्यवाद रिक रॉन्गेन को


2
@ अदम भयानक गलत व्याख्या, क्षमा करें
हाइपरनेट्रिनो

आप पहली बार बदल सकते input()साथ"."
ManfP

1
import osऔर os.path.existsतीन बाइट्स कम है।
जोनाथन एलन

1
रिक रॉन्गेन ने सुझाव दिया import globऔर while glob.glob(s):...एक संपादन में।
मार्टिन एंडर

@MartinEnder मुझे बताने के लिए धन्यवाद :)
HyperNeutrino

3

सी #, 101 बाइट्स

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

4 वैध रिटर्न मूल्यों में से प्रत्येक के लिए:

Ungolfed

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

व्याख्या

इस तथ्य पर निर्भर करता है कि File.GetAttributes () एक अपवाद को फेंकता है अगर फ़ाइल सिस्टम ऑब्जेक्ट इसके तर्क में निर्दिष्ट नहीं है।


2

पॉवर्सशेल 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 धन्यवाद! मैंने एक लंबा समय बिताया। वे अच्छे विचार हैं; अंतर्निहित उत्पादन भी मेरे मन को पार नहीं किया ...
Arkitekt

2

जावा 9, 87 बाइट्स

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

Ungolfed

TIO की JVM में स्पष्ट रूप से कोई प्रणाली नहीं है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

जावास्क्रिप्ट (Node.js) , 158 118 बाइट्स

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

इसे ऑनलाइन आज़माएं!

छोटे संस्करण के साथ आने के लिए @ ConorO'Brien को श्रेय। स्पष्ट रूप से बाहर निकलने के बजाय कब्ज का उपयोग करने और त्रुटि निकास स्थिति का उपयोग करने के बजाय झुकी हुई वस्तुएं।


1
अब तक अच्छा जवाब है, लेकिन क्षमता के लिए जगह है। आप कुछ तरीकों से इस दृष्टिकोण को गोल्फ कर सकते हैं: आप दोनों को छोड़ सकते हैं const, और आप प्रत्येक चर को इसकी परिभाषा से बदल सकते हैं। फिर, उपयोग करने के बजाय s=>{if(...){...}}, आप उपयोग कर सकते हैं s=>require('fs').existsSync(s)||process.exit(console.log(s))। इसके अतिरिक्त, आप एक त्रुटि के साथ बाहर निकल सकते हैं, इसलिए आप लैम्बडा को इस प्रकार लिख सकते हैं s=>require('fs').existsSync(s)||--console.log(s)इसे ऑनलाइन आज़माएं!
कॉनर ओ'ब्रायन

उच्च विचार! धन्यवाद!
मकोतोसन


1

पर्ल 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;

सीएलआई के रूप में चलाएं। समझने में आसान।






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

0

स्माइलबासिक, 27 बाइट्स

INPUT S$EXEC!CHKFILE(S$)?S$
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.