मेरे पास एक सरणी है जिसमें तार शामिल हैं। उनमें से कई तार समान हो सकते हैं और यह ठीक है। वे शुरू करने के लिए किसी भी क्रम में हो सकते हैं, लेकिन अधिकतर वे वर्णानुक्रम में हैं। मेरे पास निम्नलिखित shuffle
फ़ंक्शन है जो सभी तत्वों को घुमाएगा। हालांकि, मैं एक शर्त जोड़ना चाहता हूं कि सरणी में कोई भी दो स्ट्रिंग आसन्न न हो।एक सरणी को घुमाएं ताकि कोई भी दो तत्व आसन्न
उदाहरण के लिए, यह ठीक है: ook eek ook monkey ook
लेकिन यह नहीं है: ook ook eek ook monkey
दो ook
आसन्न हैं। यह माना जाता है कि इनपुट की जांच की गई है ताकि कोई भी डुप्लिकेट तत्वों की कुल संख्या के आधे से कम हो, इसलिए गैर-आसन्न समाधानों का एक सेट मौजूद है। उदाहरण के लिए, ook ook ook eek
अस्वीकार कर दिया जाएगा। तारों में रिक्त स्थान और यूटीएफ -8 वर्ण हो सकते हैं लेकिन नई लाइनें नहीं - तार वास्तव में छवियों का फ़ाइल नाम हैं।
इस लक्ष्य को प्राप्त करने के लिए मैं shuffle
फ़ंक्शन को कैसे संशोधित कर सकता हूं?
या ऐसा करने का कोई बेहतर तरीका है? विशेष शब्द समूहों, जिनमें से प्रत्येक शब्द जो भी कसौटी द्वारा ही कर रहे हैं में -
shuffle() {
# This function shuffles the elements of an array in-place using the
# Knuth-Fisher-Yates shuffle algorithm.
local i tmp size max rand
# $RANDOM % (i+1) is biased because of the limited range of $RANDOM
# Compensate by using a range which is a multiple of the array size.
size=${#array[*]}
max=$((32768/size * size))
for ((i=size-1; i>0; i--)); do
while (((rand=$RANDOM) >= max)); do :; done
rand=$((rand % (i+1)))
tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
done
}
क्या कोई कारण है कि आप इसे बाश में कर रहे हैं? – 123
@ 123 हां, शेष लिपि में है। – Sardathrion
@iblamefish अच्छा बिंदु। प्रश्न संपादित किया गया। – Sardathrion