2017-04-07 47 views
1

我試圖讓我的代碼隨機生成一個字母來開始每個單詞的「zip」,「zap」和「zop」。每次運行代碼時應選擇不同的字母,但每個單詞需要以相同的字母開頭。如何重用隨機字母

我似乎無法得到它的重複使用隨機字母三次:

def generate 
    puts "3... 2... 1... IMPROV: (enter any letter)" 
    text = gets.chomp.upcase 
    puts text + "IP, " + text + "AP, " + text + "OP!" 
    puts "My turn!" 
    yield 
    puts g_l(1) + "IP, " + "#{g_l(1)}AP, " + "#{g_l(1)}OP!" 
end 

generate do 
    def g_l(number) 
    charset = Array('A'..'Z') - Array["A", "E", "I", "O", "U"] 
    Array.new(number) { charset.sample } .join 
    end 
end 

我的目標是什麼了:

Run 1: HIP, HAP, HOP! 
Run 2: DIP, DAP, DOP! 
Run 3: SIP, SAP, SOP! 

什麼我越來越:

Run 1: HIP, ZAP COP 
Run 2: FIP, WAP, DOP 
Run 3: RIP, TAP, BOP 

我試圖找到使用類似術語的結果:「生成相同的隨機字母」,「重複使用的隨機字母」,「存儲的隨機數」等的但這些搜索沒有幫助。

+1

那些嘻哈帥哥一定是很高興你沒有寫自己命名的應用程序。 FIP DOP ... RIP BOP ... HIP COP?! – steenslag

+1

這實際上是Big Bird的下一張專輯。 – cartwrightforeman

回答

3

每次你重採樣使用g_l(1) 而是保存char = g_l(1)和重複使用相同的char

def generate 
    puts "3... 2... 1... IMPROV: (enter any letter)" 
     text = gets.chomp.upcase 
    puts text + "IP, " + text + "AP, " + text + "OP!" 
    puts "My turn!" 
    yield 
    char = g_l(1) 
    puts char + "IP, " + "#{char}AP, " + "#{char}OP!" 
end 

generate do 
    def g_l(number) 
     charset = Array('A'..'Z') - Array["A", "E", "I", "O", "U"] 
     Array.new(number) { charset.sample } .join 
    end 
end 

或使整個事情一個功能,你可以撥打:

def answer 
    puts "3... 2... 1... IMPROV: (enter any letter)" 
    text = gets.chomp[0].upcase # Should they be able to type more than one letter? 
    charset = Array('A'..'Z') - Array["A", "E", "I", "O", "U"] 
    puts text + "IP, " + text + "AP, " + text + "OP!" 
    puts "My turn!" 
    char = charset.sample 
    puts char + "IP, " + "#{char}AP, " + "#{char}OP!" 
end 

answer 
1

的問題你的代碼是你三次調用你的角色生成器,產生三個不同的字母,當你真的只想調用一次來得到一個單一的角色,你會使用三次:

g_l(1) + "IP, " + "#{g_l(1)}AP, " + "#{g_l(1)}OP!" 

每次致電g_l(1)會產生一個新的字母。

僅供參考,這裏就是我會寫:

LPHBT = (('A'..'Z').to_a - %w[A E I O U]) 

def output(c) 
    '%sIP, %sAP, %sOP!' % ([c] * 3) 
end 

def play 
    puts '3... 2... 1... IMPROV: (enter any letter)' 
    # text = gets.chomp.upcase 
    text = 'A' 
    puts output(text) 
    puts 'My turn!' 

    puts output(yield) 
end 

play { LPHBT.sample } 

# >> 3... 2... 1... IMPROV: (enter any letter) 
# >> AIP, AAP, AOP! 
# >> My turn! 
# >> TIP, TAP, TOP! 

下面是一些正在發生的事情的:

'%sIP, %sAP, %sOP!' % ([c] * 3) 

使用一個簡單的格式字符串中的([c] * 3)其結果產生了堵塞三元素陣列c

['c'] * 3 # => ["c", "c", "c"] 

Usin g Array.new像你一樣是在浪費擊鍵和降低可讀性。

('A'..'Z').to_a - %w[A E I O U] # => ["B", "C", "D", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "X", "Y", "Z"] 

完成同樣的事情,噪音少得多。