अपनी खुद की साहसिक चुनें


17

अपनी खुद की एडवेंचर बुक्स चुनें इंटरएक्टिव साहित्य का एक रूप है जहां पाठक को कहानी के परिणाम को प्रभावित करने वाले निर्णय लेने चाहिए। कहानी के कुछ बिंदुओं पर, पाठक के पास कई विकल्प होते हैं जिन्हें चुना जा सकता है, प्रत्येक पाठक को पुस्तक में एक अलग पृष्ठ पर भेज सकता है।

उदाहरण के लिए, एक फंतासी सेटिंग में, किसी को पेज 14 पर यह तय करना पड़ सकता है कि क्या पेज 22 पर "जंपिंग" करके एक रहस्यमयी गुफा में जाना है, या पेज 8 पर जाकर पास के जंगल का पता लगाना है। इन "जंप" को व्यक्त किया जा सकता है। पृष्ठ संख्याओं के जोड़े के रूप में, जैसे:

14 22
14 8

ज्यादातर मामलों में, कहानी के कई अंत होते हैं लेकिन कुछ ही अच्छे होते हैं। लक्ष्य एक अच्छा अंत तक पहुंचने के लिए कहानी को नेविगेट करना है।

कार्य:

दी गई पुस्तक के लिए "छलांग" की एक सूची को देखते हुए, आपका कार्य एक ऐसे मार्ग को निर्धारित करना है जो एक विशिष्ट समाप्ति की ओर ले जाएगा। चूंकि यह काफी आसान है, सच्ची चुनौती इसे अधिक से अधिक पात्रों में करने की है।

यह कोड गोल्फ है

नमूना इनपुट (जहां 1 प्रारंभ है और 100 का लक्ष्य है):

1 10
10 5
10 13
5 12
5 19
13 15
12 20
15 100

नमूना उत्पादन:

1 10 13 15 100

नमूना इनपुट:

15 2
1 4
2 12
1 9
3 1
1 15
9 3
12 64
4 10
2 6
80 100
5 10
6 24
12 80
6 150
120 9
150 120

नमूना उत्पादन:

1 15 2 12 80 100

टिप्पणियाँ:

  • छलांग की सूची उपयोगकर्ता द्वारा इनपुट की जाएगी, या तो फ़ाइल या स्टड से। आप चुन सकते हैं जो भी सबसे सुविधाजनक है।
  • इनपुट में प्रति पंक्ति 1 जंप होगा, जिसमें मूल और गंतव्य एक ही स्थान से अलग होगा।
  • इनपुट में लाइनें किसी विशिष्ट क्रम में होने की गारंटी नहीं है।
  • एक सफल पथ पृष्ठ 1 पर शुरू होगा और पृष्ठ 100 पर समाप्त होगा।
  • आप मान सकते हैं कि लक्ष्य के लिए कम से कम 1 रास्ता है। आपको सभी रास्तों को खोजने की आवश्यकता नहीं है, और न ही आपको सबसे छोटा रास्ता खोजने की आवश्यकता है। बस कम से कम एक ढूंढो।
  • सबसे छोटी पृष्ठ संख्या होगी 1. सबसे बड़ी पृष्ठ संख्या की कोई सीमा नहीं है। (आप मान सकते हैं कि यह एक इंट की सीमा में फिट होगा।)
  • लूप मौजूद हो सकते हैं। उदाहरण के लिए, सूची में पेज 5 से 10, 10 से 19, और 19 से 5 तक की छलांग हो सकती है।
  • डेड-एंड हो सकते हैं। यानी, गंतव्य पृष्ठ पर कूदने के लिए कहीं भी नहीं हो सकता है।
  • इसके विपरीत, अगम्य पृष्ठ हो सकते हैं। अर्थात्, एक मूल पृष्ठ किसी भी छलांग का गंतव्य नहीं हो सकता है।
  • 1 और 100 के बीच सभी पृष्ठ संख्याओं का उपयोग करने की गारंटी नहीं है।
  • आपके आउटपुट में पृष्ठ संख्याओं का एक मान्य मार्ग शामिल होना चाहिए, जो 1 से शुरू होता है और 100 से समाप्त होता है, रिक्त स्थान से अलग होता है।

याद रखें, यह कोड गोल्फ है, इसलिए सबसे छोटा समाधान जीतता है!

संपादित करें: परीक्षण के लिए एक और नमूना जोड़ा गया।


1
क्या हम मान सकते हैं कि पेज 100 से कोई छलांग नहीं है?
पीटर टेलर

हाँ, आप यह मान सकते हैं।
मिगिमारू

मुझे लगता है कि लिस्प या मिश्र धातु जैसी चीज बहुत कम वर्णों में इसे पूरा कर सकती है, मैं इसे बाद में प्रयास करूंगा जब मैं काम से दूर हो जाऊंगा।
जोसिनोफेरेरा

जवाबों:


7

गोल्फस्क्रिप्ट, 58 57 वर्ण

~]2/.,{:A{){=}+{0=}\+A\,\`{\+}+/}/]A+}*{)100=\0=1=*}?' '*

चेतावनी : यह सुपर-अक्षम है। यह आसन्न मैट्रिक्स को बार-बार चुकाने और फिर मार्ग की तलाश में काम करता है; यदि Eग्राफ़ में किनारे हैं तो यह 2 E तक की लंबाई का हर रास्ता ढूंढेगा (और जितने छोटे इसे कई बार मिलेंगे)। यह आपको उचित समय में पहले परीक्षण के मामले के लिए एक परिणाम देना चाहिए, लेकिन यदि आप दूसरे प्रयास करना चाहते हैं तो सुनिश्चित करें कि आपको कुछ गिग्स मुफ्त में मिले हैं और लंबी सैर के लिए जाना है।

यदि आप एक उचित रूप से कुशल समाधान चाहते हैं, तो मैं 67 वर्णों की पेशकश करता हूं:

~]2/:A,[1]]({A{{{?)}+1$\,,}%~!*},{({\-1==}+2$?\[+]+}/}*{100?)}?' '*

मुझे नहीं पता था कि आप गोल्फस्क्रिप्ट में मैट्रिक्स गुणा कर सकते हैं!
मिगिमारू

@ मिगिमारू, यह एक ट्यूरिंग-शक्तिशाली भाषा है, हालांकि इसकी सरणी हैंडलिंग में कई कमियां हो सकती हैं।
पीटर टेलर

यह सच है। मुझे लगता है कि मुझे उम्मीद नहीं थी कि आसन्न
मेट्रिक्स

@Peter क्षमा करें, मैंने इसे चलाने की कोशिश की cat input | ruby1.9 golfscript.rb peter.gsऔर जो कुछ हुआ वह मेरी मैकबुक वास्तव में गर्म था। मुझे इसे कैसे चलाना चाहिए?
गारेथ

3
@ गैरेथ, हाँ। जब मैंने इसे आधे घंटे के बाद मार दिया, तो यह 2GB मेमोरी तक था। मैं चेतावनी को थोड़ा और स्पष्ट करूँगा।
पीटर टेलर

14

पायथन, 232 213 157 143 135 132 चार सबसे छोटा रास्ता

यह कार्यान्वयन वर्णित सभी किनारे के मामलों (लूप्स, डेड एंड्स, अनाथ पृष्ठों आदि) को संभाल सकता है और गारंटी देता है कि यह अंत तक का सबसे छोटा मार्ग ढूंढेगा। यह जिक्स्ट्रा के सबसे छोटे पथ एल्गोरिथम पर आधारित है।

import sys
l=[k.split()for k in sys.stdin]
s={"100":"100"}
while"1"not in s:
 for i,j in l:
    if j in s:s[i]=i+" "+s[j]
print s["1"]

3

जावास्क्रिप्ट: 189 वर्ण

यह एक पुनरावर्ती समाधान है जो साहसिक के माध्यम से सबसे छोटा रास्ता ढूंढता है।

कोड-golfed:

a=prompt().split('\\n');b=0;while(!(d=c(b++,1)));function c(e,f,i,g){if(e>0)for(i=0;h=a[i++];){g=h.split(' ');if(g[0]==f){if(g[1]==100)return h;if(j=c(e-1,g[1]))return g[0]+' '+j}}}alert(d)

परीक्षण करने के लिए ( खराब : खराब इनपुट के लिए अनंत लूप! ):

  1. निम्नलिखित इनपुट स्ट्रिंग्स में से एक को कॉपी करें (या अपने स्वयं के एडवेंचर को चुनने के लिए एक समान प्रारूप का उपयोग करें):

    • 1 10\n10 5\n10 13\n5 12\n5 19\n13 15\n12 20\n15 100
    • 15 2\n1 4\n2 12\n1 9\n3 1\n1 15\n9 3\n12 64\n4 10\n2 6\n80 100\n5 10\n6 24\n12 80\n6 150\n120 9\n150 120
  2. टेस्ट फिडल प्रॉम्प्ट में पेस्ट करें ।

प्रारूपित और टिप्पणी कोड:

//Get Input from user
inputLines = prompt().split('\\n');

//Starting at 0, check for solutions with more moves
moves = 0;
while (!(solution = getSolution(moves++, 1)));

/**
 * Recursive function that returns the moves string or nothing if no
 * solution is available.
 *
 * @param numMoves - number of moves to check
 * @param startPage - the starting page to check
 * @param i - A counter.  Only included to make this a local variable.
 * @param line - The line being tested.  Only included to make this a local variable.
 */
function getSolution(numMoves, startPage, i, line) {
    //Only check for solutions if there are more than one moves left
    if (numMoves > 0) {
        //Iterate through all the lines
        for (i=0; text = inputLines[i++];) {
            line = text.split(' ');
            //If the line's start page matches the current start page
            if (line[0] == startPage) {
                //If the goal page is the to page return the step
                if (line[1] == 100) {
                    return text;
                }
                //If there is a solution in less moves from the to page, return that
                if (partialSolution = getSolution(numMoves - 1, line[1])) {
                    return line[0] + ' ' + partialSolution;
                }
            }
        }
    }
}

//Output the solution
alert(solution);

परीक्षण करने के लिए ( खराब : खराब इनपुट के लिए अनंत लूप! ):

  1. निम्नलिखित इनपुट स्ट्रिंग्स में से एक को कॉपी करें (या अपने स्वयं के एडवेंचर को चुनने के लिए एक समान प्रारूप का उपयोग करें):

    • 1 10\n10 5\n10 13\n5 12\n5 19\n13 15\n12 20\n15 100
    • 15 2\n1 4\n2 12\n1 9\n3 1\n1 15\n9 3\n12 64\n4 10\n2 6\n80 100\n5 10\n6 24\n12 80\n6 150\n120 9\n150 120
  2. टेस्ट फिडल प्रॉम्प्ट में पेस्ट करें ।


यहाँ पुनरावृत्ति का अच्छा उपयोग। मुझे फंक्शन को अतिरिक्त तर्क देने की चाल भी पसंद है, बस चर के दायरे को सीमित करने के लिए :)
मिगुइमारू

@ मिमिमारु: धन्यवाद! संबंधित पक्ष नोट: यह समस्या तब तक डिबग करने वाली थी जब तक मुझे पता नहीं चला कि varकीवर्ड के बिना जावास्क्रिप्ट चर में वैश्विक गुंजाइश नहीं है :)
Briguy37

3

रूबी 1.9, 98

j=$<.map &:split
f=->*p,c{c=='100'?abort(p*' '):j.map{|a,b|a==c&&!p.index(b)&&f[*p,b,b]}}
f[?1,?1]

Ungolfed:

$lines = $<.map &:split
def f (*path)
    if path[-1] == '100' # story is over
        abort path.join ' ' # print out the path and exit
    else
        # for each jump from the current page
        $lines.each do |from, to|
            if from == path[-1] && !path.include?(to) # avoid loops
                # jump to the second page in the line
                f *path, to
            end
        end
    end
end

वहाँ के बहुत अच्छे उपयोग।
मिगिमारू

3

पर्ल, 88 वर्ण

मूल रूप से क्लूलेस की प्रविष्टि का एक अव्यवस्थित संस्करण; मैच पूर्व और बाद के मैच मजेदार हैं :)

@t=<>;%s=(100,100);until($s{1}){for(@t){chomp;/ /;$s{$`}="$` $s{$'}"if$s{$'}}}print$s{1}

1

अजगर - 239 237 236

import sys
global d
d={}
for i in sys.stdin:
 a,b=[int(c) for c in i.split(' ')]
 try: d[b]+=[a]
 except: d[b]=[a]
def f(x,h):
 j=h+[x]
 if x==1:
  print ''.join([str(a)+" " for a in j[::-1]])
  exit()
 for i in d[x]:
  f(i,j)
f(100,[])

दुर्भाग्य से, यह पूंछ-पुनरावर्ती समाधान "कहानी" में लूप के लिए कमजोर है ...

उपयोग : बिल्ली ।/test0 | परीक्षण केस 1 के लिए ./sol.py आउटपुट:

1 10 13 15 100

परीक्षण मामले 2 के लिए आउटपुट:

1 15 2 12 80 100

0

स्केल 2.9, 260 256 254 252 248 247 241 239 234 227 225 212 205 वर्ण

object C extends App{var i=io.Source.stdin.getLines.toList.map(_.split(" "))
def m(c:String):String=(for(b<-i)yield if(b(1)==c)if(b(0)!="1")m(b(0))+" "+b(0)).filter(()!=).mkString
print(1+m("100")+" 100")}

Ungolfed:

object Choose extends App
{
    var input=io.Source.stdin.getLines.toList.map(_.split(" "))
    def findroute(current:String):String=
    (
        for(branch<-input)
        yield 
        if(branch(1)==current)
            if(branch(0)!="1")findroute(branch(0))+" "+branch(0)
    ).filter(()!=).mkString
    print(1+findroute("100")+" 100")
}

उपयोग:

के साथ संकलन करें scalac filenameऔर चलाएं scala C। इनपुट के माध्यम से लिया जाता है STDIN
Ideone.com पर चलने के लिए, इसे Scala 2.8 के रूप में चलाने के लिए परिवर्तित object C extends Appकरें object Main extends Application


0

PHP, 166 146 138 चार्ट

$a[]=100;while(1<$c=$a[0])for($i=1;$i<$argc;$i++){list($p,$q)=explode(' ',$argv[$i]);if($q==$c)array_unshift($a,$p);}echo implode(' ',$a);

अधूरा:

$a[]=100;
while(1<$c=$a[0])
    for($i=1;$i<$argc;$i++){
        list($p,$q)=explode(' ',$argv[$i]);
        if($q==$c)array_unshift($a,$p);
    }
echo implode(' ',$a);

उपयोग:

php golf.php "1 10" "10 5" "10 13" "5 12" "5 19" "13 15" "12 20" "15 100"

यह मेरे लिए कोई आउटपुट नहीं देता जब मैं इसे कमांड लाइन से विंडोज़ में या ideone.com पर चलाता हूं?
गारेथ

यह मेरे कंप्यूटर (विंडोज़) पर काम करता है। मैंने एक उपयोग छूट जोड़ी। मैं इसे ideone.com पर काम नहीं करवा सकता हूँ
अल्फवेड

आह ... जो इसे समझाता है, मैं STDINतर्कों के बजाय इनपुट भेजने की कोशिश कर रहा था ।
गारेथ

1
उपयोगकर्ता की उत्पत्ति esis ने वर्ण गणना को सही करने के लिए एक संपादन का प्रस्ताव रखा। यह स्थानीय सम्मेलन के लोगों की अपेक्षाओं को पूरा करने के लिए, अन-गोफ़र्ड संस्करण से पहले बिना व्हाट्सएप के एक गोल्फ संस्करण लगाने के लायक हो सकता है।
पीटर टेलर

-1

मैं उन सभी को 2d सरणी में रखूंगा और सभी आइटमों को एकाधिक लूप के साथ खोजूंगा, यदि वे अंतिम आइटम तक पहुंच सकते हैं तो मैं संबंधित आइटमों को दूसरे परिणाम सरणी में एकत्रित करूंगा, और परिणामों से मैं एक सरणी चुनूंगा जो एक छोटी है ।

EDIT => जावा: मैंने नीचे दिए गए पुनरावर्ती कार्य का भी उपयोग किया है;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class Jumper {
    static int x = 0;
    public static ArrayList<ArrayList<String>> c = new ArrayList<ArrayList<String>>();  
    public static void main(String[] args) throws IOException {
       //Read from line and parse into array
        BufferedReader in = new BufferedReader(new FileReader("list.txt"));
        ArrayList<String> s = new ArrayList<String>();
        String line = null; 
        while ((line = in.readLine()) != null){s.add(line);}
        c.add(new ArrayList<String>());
            //When you get all items forward to method
        checkPages(0, s,Integer.parseInt(s.get(0).split(" ")[0]),Integer.parseInt(s.get(s.size()-1).split(" ")[1]));
    }   

    public static void checkPages (int level,ArrayList<String> list,int from, int dest){
        if(level <= list.size()){           
            for(int i=level;i<list.size();i++){
                int a = Integer.parseInt(list.get(i).split(" ")[0]);
                int b = Integer.parseInt(list.get(i).split(" ")[1]);
                if(a == from){
                    c.get(x).add(list.get(i));
                    if(b==dest){
                        c.add(new ArrayList<String>());
                        x++;
                    }else{
                        checkPages(i, list, b,dest);
                        c.get(x).remove(list.get(i));
                    }
                }

            }

        }
    }

}

यह कोड-गोल्फ है, इसलिए आपको एक कार्यान्वयन प्रदान करने की आवश्यकता है।
गारेथ

हाय गैरेथ, मुझे अब छोड़ देना चाहिए जब मैं घर पर आऊँगा।
burak
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.