سؤال

كنت أعود السكك الحديدية ورأيت البطانة التالية

('a'..'z').to_a.shuffle[0..7].join

يخلق اسم نطاق الحرف عشوائي 7 مثل ما يلي:

 hwpcbmze.heroku.com
 seyjhflo.heroku.com
 jhyicevg.heroku.com

حاولت تحويل البطانة الواحدة إلى رائعة ، لكنني لم أستطع إلا أن أتوصل إلى:

def range = ('a'..'z')
def tempList = new ArrayList (range)
Collections.shuffle(tempList)
println tempList[0..7].join()+".heroku.com"

هل يمكن تحسين ما ورد أعلاه وصنعه إلى بطانة واحدة؟ حاولت جعل الرمز أعلاه أقصر

println Collections.shuffle(new ArrayList ( ('a'..'z') ))[0..7].join()+".heroku.com"

ومع ذلك ، على ما يبدو Collections.shuffle(new ArrayList ( ('a'..'z') )) هو null

هل كانت مفيدة؟

المحلول

إن عدم وجود خلط مدمج يضيف أكثر إلى الطول ، ولكن إليك بطانة واحدة ستفعل ذلك:

('a'..'z').toList().sort{new Random().nextInt()}[1..7].join()+".heroku.com"

لا يعمل لك لأن collections.shuffle يقوم بمفحخ في مكانه ولكنه لا يعيد أي شيء. لاستخدام ذلك كبطانة واحدة ، ستحتاج إلى القيام بذلك:

('a'..'z').toList().with{Collections.shuffle(it); it[1..7].join()+".heroku.com"}

نصائح أخرى

إنها ليست خطوة واحدة ، ولكن هناك طريقة أخرى رائعة للقيام بذلك وهي إضافة طريقة خلط ورق اللعب ...

String.metaClass.shuffle = { range ->
def r = new Random()
delegate.toList().sort { r.nextInt() }.join()[range]}

ثم لديك شيء يشبه الياقوت ...

('a'..'z').join().shuffle(0..7)+'.heroku.com'

هذه هي محاولتي. إنه خط واحد ولكنه يسمح بتكرار الشخصيات. لا يؤدي خلط خلافق ، على الرغم من أنه يولد إخراج مناسب لاسم مجال عشوائي.

أنا أنشرها كمثال على إغلاق مجهول العودية:

{ i -> i > 0 ? "${(97 + new Random().nextInt(26) as char)}" + call(i-1) : "" }.call(7) + ".heroku.com"

هذا بالتأكيد ليس جميلًا مثل نظير روبي ولكن ، مثل تيد المشار, ، يرجع ذلك في الغالب إلى حقيقة ذلك shuffle الطريقة هي طريقة ثابتة في Collections.

[*'a'..'z'].with{ Collections.shuffle it; it }.take(7).join() + '.heroku.com'

أنا أستخدم خدعة مشغل الانتشار لتحويل النطاق إلى قائمة :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top