2015-12-13 28 views
0

排列我有一個腳本,其中你必須輸入一個長度較大的字符串,然後或等於1並且小於26檢查在bash

如果這不是我想要返回一個錯誤的情況。但是,這是我想通了

lengthAlphabetInput=${#1} 

if [ $lengthAlphabetInput -lt 1 ] || [ $lengthAlphabetInput -gt 26 ] 
then 
echo "error: key needs to be between 1 and 26 characters" 
exit 1 
fi 

除此之外,我想檢查用戶是否給了輸入的置換(的一部分)字母的部分。

例如,如果用戶輸入「ABC」我想返回一個錯誤「ABC是 不是字母表的排列」

,如果用戶輸入「xxxgsdnoip」我想再次返回相同錯誤 ,因爲我不希望用戶多次使用同一個字母。

但輸入「xyz」或「jhcwslaedmviotrgzxkbynpuqf」將是正確的 ,因爲這些是字母表的排列。 (x而不是a,y代替b和z而不是c代替)。

任何人都可以幫助我將這個想法轉化爲代碼嗎?

+1

爲什麼「xyz」可以接受,但「abc」不是? – tripleee

+1

告訴我們你已經嘗試過什麼以及你卡在哪裏。解釋你會使用哪些工具。嘗試一下。告訴我們你的努力。 – tripleee

+0

字母表的排列可以是長度爲26個字母的任何字符串,每個字母只包含一次字母,其中字母順序不重要。 – chepner

回答

0
#!/usr/bin/perl 
$_=shift; 

print "not ok:repeated: $1\n" if/(.).*\1/; 

my $i=0; 
my @s= (map { ord($_)-97 != $i++ ?():($_)} split('')); 
print "not ok:samePlace: @s\n" if @s; 

用法:

$ perl ex.pl rty 

$ perl ex.pl abc 
not ok:samePlace: a b c 

$ perl ex.pl ddss 
not ok:repeated: d 
+0

是否有可能不使用perl?這是學校,我應該做bash – Joey

1

我意識到,這是由學生提出的問題,所以我沒有記下了詳細的解答,因爲閱讀手冊並想出來自己將會經歷真正幫助你學習如何使用bash(實際上是GNU/BSD核心工具),如@binaryzebra所說。你應該做的是:

  1. 學會閱讀在bash手冊,使用命令man,如man sortsort實用的手冊。按上/下箭頭鍵或PageUp/PageDown鍵進行滾動;點擊q退出。閱讀手冊是您進入Unix世界的第一步。當然,你可以跳過這一步並找到谷歌的所有信息,但從長遠來看,學習閱讀手冊會讓你更好。
  2. 閱讀sed的使用手冊,學習如何用正則表達式替代。對於新手來說,手冊有點太長了,但幸運的是,你不需要全部閱讀;只需掃描手冊並找到關於替代的部分;如果有任何情況,請閱讀示例。練習一些測試文件。現在你知道如何檢查輸入是否只包含字母(而不是空格,符號等),以及如何將每個字符分割成一行。
  3. 閱讀uniq的使用說明書。它有一個更短的手冊;閱讀整本手冊不會花費很長時間。
  4. 現在學習bash中的管道功能。我無法找到一個簡短而專注的手動輸入,因此您不妨閱讀the online manual from GNU。在流水線的幫助下,您可以結合seduniq來檢測重複的字符。
  5. 通過「置換」,看起來你不希望字符按原來的順序。如果是這樣,請閱讀sort實用程序的手冊,並考慮它如何幫助您。
  6. 你似乎並不關心是否所有的26個字母都在那裏。如果是這種情況,除非需要字母子集連續(例如「cdefg」而不是「cdhjk」),否則可能不需要wc(字數)實用程序。

這就是所有的提示;祝你的作業好運。

+0

非常感謝你的回答!這正是我所做的。我試圖想出我自己的答案,那就是我最多的學習方式(當然我也從那些幫助過的人那裏得到了一些啓發)。這是我想出了'lengthAlphabetInput = $ {#1}輸入1 = $ 1 字母= 「ABCDEFGHIJKLMNOPQRSTUVWXYZ」 AlphabetAdaptedInput = $(回聲 「$字母」 |切-C1 - 「$ lengthAlphabetInput」) 如果[$輸入1 = = $ AlphabetAdaptedInput] then echo「fout:sleutel is geen permutatie van het alfabet」 exit 2 fi if echo「$ 1」| grep -q'\([[:alpha:]] \)。* \ 1' then echo「fout:sleutel is geen permutatie van het alfabet」 exit 2 fi' – Joey

+0

不介意錯誤文本在荷蘭 – Joey

+0

@Joey評論是不正當的地方寫代碼塊;你可能想要將它們粘貼到[pastebin](http://pastebin.com/)或類似的東西。 :) –