একটি নতুন ফাইল নাম জোর


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

ব্যবহারকারীর ইনপুটগুলির উদাহরণগুলি যা টিআইওতে থাকাকালীন পুনরায় অনুরোধ করবে:

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

ব্যবহারকারী ইনপুট উদাহরণ যা টিআইওতে যখন ফিরে আসবে:

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

আমি এখানে কোড গল্ফের পক্ষে মোটামুটি নতুন এবং সমাধান হিসাবে কী গণনা করা হয় তার কোনও তথ্য খুঁজে পাওয়া যায় না বলে মনে হয়। কোন প্রোগ্রামে এটির প্রয়োজনীয় ভাষাগুলির জন্য আমাকে কী () ফাংশন অন্তর্ভুক্ত করতে হবে, বা এটি শিরোনামের অংশ হতে পারে? টিআইওতে বিবৃতিগুলি শিরোনামের অংশ হতে পারে, বা তাদের কোডের অংশ হতে হবে এবং বাইট গণনার বিপরীতে গণনা করা দরকার? উদাহরণস্বরূপ, আমার এই সমাধানটি রয়েছে: 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

এটি গণিতের নোটবুক পরিবেশটি ধরে নিয়েছে যেখানে আমরা ব্যবহারকারীর কাছ থেকে ইনপুটটি জিজ্ঞাসা করতে পারি Input[]। ব্যবহারকারীর ইনপুটটি একটি আসল স্ট্রিং আক্ষরিক হওয়া উচিত , সুতরাং উদাহরণস্বরূপ কেবল "ab/cd.ef"পরিবর্তে ab/cd.ef। উলটোটি হ'ল ইনপুটটি একটি স্বেচ্ছামূলক গণিতের প্রকাশ হতে পারে যা ইনপুট স্ট্রিংটি গণনা করে।

এটি একটি প্রতীককে সংজ্ঞায়িত করে fযা মূল্যায়ন করা হলে প্রয়োজনীয় গণনা সম্পাদন করে এবং শেষ পর্যন্ত প্রথম অস্তিত্বহীন ব্যবহারকারী ইনপুটকে মূল্যায়ন করে। এটি মূলত একটি nullary ফাংশন, যেখানে আমাদের ...[]এটি কল করার জন্য অন্তর্ভুক্ত করতে হবে না।

আমরা Ifপ্যাটার্ন সাবস্টিটিউশন অপারেটরটি ব্যবহার করে একটি traditional তিহ্যবাহী ভাব প্রকাশের মাধ্যমে একগুচ্ছ বাইটগুলিও সংরক্ষণ করতে পারি /.


এটি ব্যর্থ হয় যদি ব্যবহারকারী একই জিনিস দু'বার ইনপুট করে
লুকাশ ল্যাং

@ ম্যাথ 172 খুব ভাল ক্যাচ, খুব খারাপ, তাহলে আমাকে বিরক্তিকর লুপ দিয়ে যেতে হবে।
মার্টিন এন্ডার

দেখা যাচ্ছে না, এবং এটি এমনকি একটি বাইটও খাটো। :)
মার্টিন ইন্ডার

7

পার্ল 5 -ln , 12 10 বাইট

-২ বাইটস @ ডোমহাস্টিংসকে ধন্যবাদ

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

এটি অনলাইন চেষ্টা করুন!


1
আমি মনে করি -eনির্দিষ্টকরণ ব্যতীত কাজ করে $_, কিছুটা ক্ষেত্রে কাজ না করা আমার ধারণা হলেও ...
ডম হেস্টিংস

@ ডোমহাস্টিংস সকল ক্ষেত্রে কাজ করা উচিত। এটি নথিভুক্ত করা হয়েছে যে যখন -e-তে কোনও যুক্তি না থাকে $ _ ব্যবহৃত হয়।
পাইপ

@ ডোমহাস্টিংস ধন্যবাদ। কিছু কারণে আমি ভেবেছিলাম -eব্যতিক্রম তবে অবশ্যই তা নয়
টন হসপেল

4

বাশ, 29

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


@ অ্যাডাম আমি নিশ্চিত নই কেন এটি টিআইওতে কাজ করে না। আপনি যদি স্ক্রিপ্ট ফাইল হিসাবে এটি সংরক্ষণ করেন এবং চালনা করেন তবে যথেষ্ট মনে হয়, এটি আশানুরূপভাবে কাজ করে
ডিজিটাল ট্রমা

1
@ অ্যাডম এটি কাজ করে, আপনার যে সমস্যাটি হয়েছিল তা হ'ল প্রোগ্রামটি কল করার চেষ্টা করছিল .code.tioযা স্ক্রিপ্টের মূল অংশ রয়েছে, তবে কীভাবে এটি চালানো যায় সে সম্পর্কে কোনও তথ্য নেই। যদিও শেবাং বা এই স্ক্রিপ্টটি আপনার পথে থাকার দরকার আছে তার চারপাশে কাজ করার কোনও দুর্দান্ত উপায় আছে কিনা তা আমি নিশ্চিত নই।
FryAmTheEggman

2
আপনি উভয় কাছাকাছি যেতে পারেন (দুটি বাইটের দামে) এ পরিবর্তন $0করে . $0এটি অনলাইন চেষ্টা করুন! । যেহেতু .আপেক্ষিক পাথের নাম এবং বর্তমান শেল ব্যবহার করে।
ক্রিস

1
এটি *ইনপুট হিসাবে কি মনে করে ?
টবি স্পিড 10

4

পাওয়ারশেল 2 (6 এর মাধ্যমে), 35 বাইট

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

Read-Hostইনপুটটির জন্য অপেক্ষা করে (যদি একটি প্যারামিটার হিসাবে একটি স্ট্রিং দেওয়া হয় তবে প্রম্পট হিসাবে স্ট্রিংটি ব্যবহার করে)। প্রদত্ত ইনপুট যদি বিদ্যমান থাকে তবে তার জন্য একটি ফাইলের নাম (বা ফোল্ডার নাম) হয়, Test-Pathফিরে আসে $trueএবং {}ডু -কিছুই ব্লক কার্যকর হয় না এবং এটি ইনপুটটির জন্য পুনরায় অনুরোধ জানায়। যদি ইনপুটটি কোনও অতিরিক্ত ফাইল বা ফোল্ডার না হওয়ায় Test-Pathপ্রত্যাবর্তন করে $falseতবে ডু-কিছুই ব্লক কার্যকর হয় না এবং ইনপুট নামটি মুদ্রিত হয়।


1
পিপিসিজিতে আপনাকে স্বাগতম!
মার্টিন ইন্ডার

বাইট সংরক্ষণ করতে আপনার {after এর পরে আধা-কোলোন লাগবে না।
ভেসকা

@ ভেস্কাহ - আমি পিএস 2-এ করেছি, এবং এটি পিএস 3 + কে ভাঙ্গবে না
জেফ জিটলিন

আহ, আমার খারাপ। এটি ২. তে পরীক্ষা করে নি
ভেসকাঃ

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
}

পিপিসিজিতে আপনাকে স্বাগতম! আপনি 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)?
প্লানাপাস

@ প্ল্যানাপাস গ্রেট আইডিয়া! অন্তর্ভূক্ত.
ডাকমায়ের 13

আপনাকে স্বাগতম. এছাড়াও, আমি এখনই এটি সম্পর্কে ভাবিনি তবে কার্যকারিতা list.filesএবং dirপ্রতিশব্দ, তাই আপনি এটি dirএখানে দিয়ে প্রতিস্থাপন করতে পারেন ।
প্লানাপাস

আপনি এর readline()সাথে প্রতিস্থাপন করতে পারেনscan(,'')
জেডি

এবং printসহcat
জেএডি

3

পাইথন 3 , 55 বাইট

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

এটি অনলাইন চেষ্টা করুন!

-4 বাইট ম্যানফপিকে ধন্যবাদ
-6 বাইট রিক রঞ্জেনকে ধন্যবাদ জানায়


2
@ অ্যাডম মারাত্মক ভুল ব্যাখ্যা, দুঃখিত
হাইপারনিউটারিনো

আপনি এর input()সাথে প্রথমটি প্রতিস্থাপন করতে পারেন"."
মানফপি

1
import osএবং os.path.existsতিনটি বাইট সংক্ষিপ্ত।
জোনাথন অ্যালান

1
রিক রঞ্জেন পরামর্শ দিয়েছেন import globএবং while glob.glob(s):...একটি সম্পাদনায়।
মার্টিন ইন্ডার

@ মার্টিনএন্ডার আমাকে বলার জন্য ধন্যবাদ :)
হাইপারনিউটারিনো

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

ব্যাখ্যা

ফাইল.গেটঅ্যাট্রিবিউটস () তার আর্গুমেন্টে উল্লিখিত ফাইল সিস্টেমের অস্তিত্ব উপস্থিত না থাকলে একটি ব্যতিক্রম ছুঁড়ে ফেলেছে তা নির্ভর করে।


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\কি কাজ করবে না ?
অ্যাডাম

পিপিসিজিতে আপনাকে স্বাগতম! কয়েকটি দ্রুত গল্ফ - আপনি forপরিবর্তে একটি লুপ ব্যবহার করতে পারেন , যা আপনাকে সূচনাটি লুপ কনস্ট্রাক্টরে সরানোর অনুমতি দেয় for($x=1;$x){...}। দ্বিতীয়ত, আপনি পরিত্রাণ পেতে পারেন Write-Hostযেহেতু Write-Outputপাইপলাইনে থাকা কোনও কিছুর জন্য প্রোগ্রামের সমাপ্তির অন্তর্নিহিত , তাই কেবল $iসেখানে রেখে যথেষ্ট হবে leaving
অ্যাডমবর্কবার্ক

নীচে আমার সমাধান দেখুন; আমি আপনার বাইট গণনা অর্ধেক করেছি
জেফ জিটলিন

@ অ্যাডাম: হতে পারে! আমি আসলে এটি বিবেচনা করি নি। : পি অ্যাডমবর্কবার্ক আপনাকে ধন্যবাদ! আমি দীর্ঘ সময় লুকিয়ে ছিল। সেগুলি ভাল ধারণা; অন্তর্নিহিত আউটপুট এমনকি আমার মন অতিক্রম করতে পারে না ...
Arkitekt

2

জাভা 9, 87 বাইট

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

Ungolfed

টিআইওর জেভিএমের স্পষ্টতই কোনও সিস্টেম নেই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

জাভাস্ক্রিপ্ট (নোড.জেএস) , 158 118 বাইট

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

এটি অনলাইন চেষ্টা করুন!

সংক্ষিপ্ত সংস্করণ নিয়ে আসার জন্য @ কনরও'ব্রায়েনকে ক্রেডিট। স্পষ্টভাবে প্রস্থান করার পরিবর্তে অনিচ্ছাকৃত জিনিসগুলি কনসেট ব্যবহার না করে এবং ত্রুটির প্রস্থান শর্তটি ব্যবহার করে।


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;

এটি আরপিএলে কাজ করে তবে টিআইওতে এটি সঠিকভাবে কাজ করছে বলে মনে হয় না।


say first !*.IO.e,lines(23 বাইট) সম্পর্কে কি ?
নওহ্নহোফ

কমান্ড লাইনে চলাকালীন উপরেরগুলি সম্ভবত অনির্দিষ্টকালের জন্য অবরুদ্ধ করে, তবে এর মতো কিছু {}while ($_=get).IO.e;.sayকাজ করা উচিত।
nwellnhof

1

পিএইচপি, 43 বাইট

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

সিএলআই হিসাবে চালান। বেশ বোঝা সহজ।



1

ফেরত পাঠায় দ্বিতীয় অ বিদ্যমান ইনপুট, ( the_prev_wasnt_filenameপরিবর্তে env.tio)। পরিবর্তন এবং তারপরে আপনি এ থেকে '.'মুক্তিও পাবেন।
অ্যাডাম



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$
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.