我正在嘗試從兩個不同的輸入字串中制作成對的字母。到目前為止,這是我的代碼:
clear all
signal = input('Please enter text to be scrambled:\n ', 's');
signal = signal(randperm(numel(signal)))
noise = input ('Please enter text of the same length:\n ','s');
noise = noise(randperm(numel(noise)))
這是我正在嘗試開發的某種游戲,我正在研究所涉及的數學。想象一下黑白棋游戲,為了“匹配顏色”,人們必須翻轉和移動硬幣。我在想,如果我們嘗試“匹配字母”,以便重新創建原始訊息(在這種情況下是 Signal),那就太好了。
- 假設您有 100 個硬幣,您將它們隨機放在桌子上(無論是頭還是尾,都沒有關系)。
- 然后,您在硬幣上寫一條訊息,每個硬幣一個字母。這是信號。
- 然后,您將所有硬幣翻轉到另一側,并稍微移動它們。
- 然后,按照相同的步驟插入“噪音”。
- 我們現在有 100 個硬幣,但游戲中有 200 個字母,硬幣的每一面一個字母。如果我們翻轉和移動硬幣以插入“噪音”,我們不知道每個硬幣的另一面是什么。
- 游戲的目的是翻轉和移動硬幣,直到重新創建原始訊息(信號)。這是一種任何計算機演算法都無法破解的加密技術。
所以,請幫助我理解如何從兩個輸入字串中制作成對的字母。
uj5u.com熱心網友回復:
有很多方法可以做到這一點,但這里有一個。對于作為輸入的兩個字符向量,輸出是一個由兩個字母組成的字符向量元胞陣列,其中每對包含來自每個輸入的一個字母,沒有使用兩次字母,并且這些對隨機反轉。
% 'signal' and 'noise' are two character vectors of equal length
numChars = strlength(signal);
% randomly permute signal and noise
left = signal(randperm(numChars));
right = noise(randperm(numChars));
% make a cell array of 2-letter pairs
pairs = arrayfun(@strcat, left, right, 'UniformOutput', false);
% select half of the pairs at random and reverse them
sel = logical(randi([0, 1], 1, numChars));
pairs(sel) = cellfun(@fliplr, pairs(sel), 'UniformOutput', false);
現在pairs{1}將包含第一對、pairs{2}第二對,依此類推。
uj5u.com熱心網友回復:
nekomatic 的解決方案是一種選擇,但是當字串中包含空格時會失敗,并且使得恢復硬幣上的當前訊息有點麻煩。我只是將信號和噪聲粘貼到一個更大的字符矩陣中,例如
coins = [noise; signal]';
其中第一個維度代表硬幣,第二個維度代表它們的邊。因此,翻轉第五枚硬幣可能看起來像coins(5,:) = fliplr(coins(5,:));并且coins(:,1)'會向您顯示當前可見的字母。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/389982.html
標籤:MATLAB
下一篇:翼型圖問題
