2010-03-22 11 views
8

में एक सूची दोहराएं मैं एक स्कैला नोब हूं। मैंने सामान्य रूप से भाषा और कार्यात्मक प्रोग्रामिंग सीखने के लिए पहले अभ्यास के रूप में एक स्पाइडर सॉलिटेयर सॉल्वर लिखने का निर्णय लिया है।स्कैला

मैं 1, 2, या 4 सूट वाले कार्ड के यादृच्छिक रूप से शफल डेक उत्पन्न करना चाहता हूं।

val numberOfSuits = 1 
(List("clubs", "diamonds", "hearts", "spades").take(numberOfSuits) * 4).take(4) 

जो

List("clubs", "clubs", "clubs", "clubs") 
List("clubs", "diamonds", "clubs", "diamonds") 
List("clubs", "diamonds", "hearts", "spades") 

लौटना चाहिए numberOfSuits के मूल्य पर निर्भर करता है, को छोड़कर कोई सूची "गुणा" आपरेशन है कि मैं मिल सकती है: यहाँ है कि मैं क्या के साथ आया है। क्या मुझे याद आया? शफल होने से पहले पूरा डेक उत्पन्न करने का कोई बेहतर तरीका है?

बीटीडब्ल्यू, मैं सूट के लिए गणना का उपयोग करने की योजना बना रहा हूं, लेकिन स्ट्रिंग के साथ अपना प्रश्न टाइप करना आसान था। मैं ऊपर उत्पन्न सूची लेता हूं और समझ के लिए उपयोग करता हूं, सूट पर फिर से भरता हूं और एक पूर्ण डेक उत्पन्न करने के लिए कार्ड "रैंक" की एक समान सूची लेता हूं।

+0

इस परियोजना का दिलचस्प हिस्सा झांकी (कार्ड के वर्तमान लेआउट) की अपरिवर्तनीय पीढ़ी बना देगा। मैं कानूनी चाल की सूची के लिए वर्तमान झुकाव से पूछता हूं, (स्रोत कॉलम, गंतव्य कॉलम, और स्रोत स्थिति) के tuples के रूप में लौटाया। मैं फिर "सर्वश्रेष्ठ" चाल खोजने के लिए किसी प्रकार के मिनी-अधिकतम एल्गोरिदम का उपयोग करके एक पुनरावर्ती फैशन में वर्तमान झुकाव में प्रत्येक को लागू करता हूं।मैं यह भी चाहता हूं कि कार्ड ऑब्जेक्ट अपरिवर्तनीय हो, इसलिए टेबलोज़ ("टेबलॉक्स?") को यह जानना होगा कि कार्ड का सामना करना है या नहीं। – Ralph

उत्तर

7

आपको ऑब्जेक्ट List ऑब्जेक्ट के लिए स्केलैडोक देखना चाहिए। इसमें सूचियों के निर्माण के लिए दिलचस्प तरीकों के सभी शिष्टाचार हैं। उदाहरण के लिए, निम्नलिखित करता है वास्तव में क्या आप के लिए कोशिश कर रहे थे:

List.flatten(List.make(4, List("clubs", "diamonds", "hearts", "spades").take(numberOfSuits))).take(4) 

एक बहुत अच्छे कोड, हालांकि, इस (स्काला 2.7) होगा:

val suits = List("clubs", "diamonds", "hearts", "spades") 
List.tabulate(4, i => suits.apply(i % numberOfSuits)) 

स्काला 2.8 tabulate पर curried है, इसलिए सही वाक्यविन्यास होगा:

List.tabulate(4)(i => suits.apply(i % numberOfSuits)) 
+0

मैंने आपके उदाहरण की कोशिश की, लेकिन 2.8.0. बीटा 1-प्रीरलीज पर एक त्रुटि प्राप्त करें। असल में, मुझे यह त्रुटि List.tabulate के अधिकांश नमूनों पर मिलती है जो मुझे मिल सकती है। क्या देता है? स्केला> List.tabulate (4, मैं => suits.apply (i% numberOfSuits)) : 5: त्रुटि: लापता पैरामीटर प्रकार List.tabulate (4, मैं => suits.apply (i% numberOfSuits)) स्कैला> List.tabulate (4, (i: Int) => suits.apply (i% numberOfSuits)) : 7: त्रुटि: ओवरलोडेड विधि मान विकल्पों के साथ सारणीबद्ध करें ... (Int , (Int) => java.lang.String) List.tabulate (4, (i: int) => suits.apply (i% numberOfSuits)) ^ –

+0

@Adam वाक्यविन्यास 2.7 से 2.8 तक थोड़ा बदल गया। संपादित उत्तर देखें। –

+0

मजेदार आपको इसका जिक्र करना चाहिए। मैं भूल गया कि सिंगलटन दस्तावेज़ पैकेज दस्तावेज़ पृष्ठों के नीचे थे। मैंने ऊपर लिखी टिप्पणी में, मैं * EXACT * उसी उत्तर के साथ आया जो आपने ऊपर दिया था। – Ralph

16

सूचियों की एक निश्चित सूचियों फ़्लैट करें:

scala> List.fill(2)(List(1, 2, 3, 4)).flatten 
res18: List[Int] = List(1, 2, 3, 4, 1, 2, 3, 4) 

सूचियों की एक अनंत स्ट्रीम फ़्लैट करें, पहले एन तत्वों ले:

scala> Stream.continually(List(1, 2, 3, 4)).flatten.take(8).toList 
res19: List[Int] = List(1, 2, 3, 4, 1, 2, 3, 4) 
+0

क्या यह 2.8.0 में एक नई विधि है? मैं इसे काम करने के लिए नहीं मिला, लेकिन यह किया: वैल सूट = सूची ("क्लब", "हीरे", "दिल", "हुकुम"); List.flatten (List.make (4, suits.take (1))), जहां "1" संख्याOfSuits मान है। – Ralph

+0

हां, इनमें से कुछ 2.8 में नए हैं। – retronym

6

आप गुणा के बजाय एक संख्यात्मक अनुक्रम और flatMap विस्तार कर सकते हैं।

scala> (1 to 3).flatMap(_=>List(1,2,3,4).take(2)).take(4) 
res1: Seq[Int] = List(1, 2, 1, 2) 

यह 2.7.x में भी काम करता है।


संपादित करें: चूंकि आप स्कैला के साथ कम अनुभवी हैं, तो आप अभी तक पिंप-माय-लाइब्रेरी पैटर्न में नहीं आ सकते हैं। आप अपनी सूची एक बहुत गुणा करने के लिए चाहते हैं, आप एक कस्टम रूपांतरण वर्ग जोड़ सकते हैं:

class MultipliableList[T](l: List[T]) { 
    def *(n: Int) = (1 to n).flatMap(_=>l).toList 
} 
implicit def list2multipliable[T](l: List[T]) = new MultipliableList[T](l) 

और अब आप कर सकते हैं

scala> List(1,2,3)*4 
res2: List[Int] = List(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3) 

(आम तौर पर, इस तरह के implicits पुन: उपयोग करने के लिए, उन्हें एक वस्तु में घोषित करने और फिर अंतर्निहित रूपांतरण और स्कोप में संबंधित वर्ग प्राप्त करने के लिए MyObject._ आयात करें।)