語長の水平グラフ


28

入力

任意の数のスペースで区切られた単語のリスト。

出力

n番目の行が*n番目の単語と同じ数のアスタリスク()で構成される水平ASCIIアートグラフ。

使用例

>信号のユーザ入力は、入力してプログラムをテストしてはいけません。

> This is an example histogram of word length
****
**
**
*******
*********
**
****
******

> a aa aaa aaaa aaaaa
*
**
***
****
*****

> double space  example
******
*****
*******

リファレンス実装

仕様に疑問がある場合、プログラムの出力は、すべての入力の下で以下のプログラムの出力と正確に一致する必要があります。

puts gets.chomp.split.map{|word| '*' * word.length}.join("\n")

末尾の改行は許可されますか?指を交差
ベータ崩壊

@BetaDecayはい、許可されます...........
Caridorc

入力に先頭または末尾のスペースがありますか?
PhiNotPi

8
あなたが説明しているのはヒストグラムではありません。ヒストグラムは、行xにx個の文字がある単語の数を示します。最初の例では、行1に0のアスタリスク(長さ1の単語はありません)、行2に3つのアスタリスク(is、an、of)などがあります。
nitro2k01

1
わかりました、あなたが正しいとわかります。水平です。
nitro2k01

回答:


24

網膜、5 + 3 = 8バイト

 +
\n
.
*

すべての行は独自のファイルに格納されるため、追加のファイルごとに1バイトを追加しました。また、を\n実際の改行に置き換える必要があります。

行の各ペアは、パターンと置換のペアです。 +1つ以上のスペースに一致し、改行で置き換えます。改行以外の.任意の文字に一致し、それをに置き換えます。これはグローバルに適用されるため、すべての文字はに置き換えられます。**


11

Pyth、9バイト

jm*ld\*cz

説明:

jm*ld\*cz
       cz    chop input on whitespace
 m           map to
   ld        length of the segment
  *  \*      number of asterisks
j            joined on newlines


10

R-33

write(gsub(".","*",scan(,"")),"")

どこで

  • scan(,"") stdinから読み取り、空白文字を文字ベクトルに分割します。
  • gsub(".", "*", ...)すべての文字をに置き換えます*
  • write(..., "") デフォルトの区切り文字として「\ n」を使用して標準出力に出力します。

10

Python 3、43バイト:

for w in input().split():print('*'*len(w))

構文エラーを指摘してくれた@BetaDecayに感謝します。

サンプル実行:

> This is an example histogram of word length
****
**
**
*******
*********
**
****
******

(以下の文字列は、テキストではなくリテラルとして入力されます)

> 'example\twith\nweird\rwhite   space'
*******
****
*****
**********

ボーナス:垂直ヒストグラム

@Caridorcが、ボーナスに1行から多数行までのエラーを指摘してくれたことに感謝します。

l=[len(x)for x in input().split()]
for i in range(len(l)-1,0,-1):print(''.join(['*'if j>=i else' 'for j in l]))

デモ:

> This is an example histogram of word length
   **   
   **  *
   **  *
*  ** **
*  ** **
********
********

ボーナス:垂直ヒストグラム(上下逆さま)

l=[len(x)for x in input().split()]
for i in range(len(l)-1):print(''.join(['*'if j>i else' 'for j in l]))

デモ:

> This is an example histogram of word length
********
********
*  ** **
*  ** **
   **  *
   **  *
   **   

垂直が1つ
ずれている-Caridorc

6

R、38バイト(コメントの助けを借りて)

cat(gsub(" +|$","\n",gsub("\\S","*",x)))

使い方

  • gsub すべてのスペースなしを置き換えます *
  • 2番目gsub\n、各要素の最後に(改行)を追加します
  • cat それに応じて印刷する

デモ


6

> <>38 37バイト

ダブルスペースケースを呪う*魚を振る*。

<v&0
 >i:84*=?v0(?;67*o&1&
 \ &0o?&a/

オンラインで試すことができます(行う必要があるのは、下部近くのフィールドに入力してからGiveボタンを押すことだけです)。特に2行目と3行目の前にあるこれらの無駄なスペースを削除するアイデアは、さらにゴルフをするための提案を歓迎します。

余分なスペースのために追加の改行を印刷できる場合、コードは27バイトになります

>i:84*=?v0(?;67*o
^     oa<

説明

注:説明の順序は、ポインターの位置に対応します(したがって、順序を考慮するものからコードが説明される場合、それはポインターが実行する順序であるためです)。

ライン1:

<v&0
<      redirects flow leftward
   0   pushes 0 onto the stack
  &    pops 0 and puts it in the register 
 v     redirects flow downward

2行目:

>i:84*=?v0(?;67*o&1&
>                     redirects flow leftward
 i:                   pushes input and then duplicates it
   84*                pushes 32 (the space character numerically)
      =?v             pops 32 and input and redirects flow downward if they're equal
         0(?;         pops input and terminates if input is less than 0*
             67*o     pushes 42 (asterisk) and prints it
                 &1&  pushes register value and then puts 1 in the register

*in ><>, the command i returns -1 if no input is given

3行目:

NBこの行は逆になっているため、右から左に読んでください。

 ^ &0o?&a<
         <  redirects flow leftward
        a   pushes 10 (newline) onto the stack
     o?&    prints a newline if the register is not 0
   &0       sets the register to 0
 ^          redirects flow upwards (back to the second line)

基本的に、プログラムは入力(一度に1文字ずつ読み取られる)がスペースでないことを確認してから、アスタリスクを出力します。入力がない場合は終了します(入力値は-1です)。追加の改行を印刷しないようにするために、0または1に設定するレジスタ値を使用します。設定方法により、余分な値がスタックにプッシュされることは気にしません(例:1アスタリスクを印刷した後に設定するときのレジスタの値); プログラムが終了してもスタックには残りますが、何もしません。

84*andの67*代わりに" "andを"*"それぞれ使用したため、少し混乱するかもしれませんが、それは何らかの理由でプログラムに文字列を入れる気がなかったからです。



6

Javascript ES6

機能、46文字

f=s=>s.replace(/\S/g,'*').replace(/\s+/g,'\n')

プログラム、55文字

alert(prompt().replace(/\S/g,"*").replace(/\s+/g,"\n"))

あなたの関数は、46文字の長実際に、そしてあなたのプログラムは55です
adroitwhiz

@ darkness3560、修正してくれてありがとう。私"f=s=>s.replace(/\S/g,'*').replace(/\s+/g,'\n')".lengthは長さを測定するのが好きな表現を使いました\
Qwertiy

6

Perl、16バイト(15文字+ -p

y/ /
/s;s/./*/g

として実行:

$ perl -pe 's/ +/
/g;s/./*/g' <<< 'This is a test'
****
**
*
****

保存された追加のバイト、おかげ@ThisSuitIsBlackNotは、私が遭遇していなかったy///sの前に!


これは素晴らしいです!最初の置換を音訳に変更することにより、1バイトを保存できますy/ /\n/s;
。– ThisSuitIsBlackNot

@yokohama素晴らしい!ありがとうございました!
ドムヘイスティングス

5

Gema、11 9文字

 =\n
?=\*

サンプル実行:

bash-4.3$ gema ' =\n;?=\*' <<< 'This is an example histogram of word length'
****
**
**
*******
*********
**
****
******

bash-4.3$ gema ' =\n;?=\*' <<< 'a aa aaa aaaa aaaaa'
*
**
***
****
*****

bash-4.3$ gema ' =\n;?=\*' <<< 'double space  example'
******
*****
*******

5

PHP 5.3、55の 53 51 50バイト

<?for(;$i<strlen($a);){echo$a{$i++}!=' '?'*':"
";}


使用法:
スクリプトを呼び出して、グローバル変数($ a)を定義します
php -d error_reporting=0 script.php?a="This is an example histogram of word length"

出力:

****
**
**
*******
*********
**
****
******

4

Java、102バイト

class R{public static void main(String[]a){for(String s:a)System.out.println(s.replaceAll(".","*"));}}

4

Haskell、31バイト

putStr.unlines.map(>>"*").words

使用例:

Main> putStr.unlines.map(>>"*").words $ "This is an example histogram of word length"
****
**
**
*******
*********
**
****
******

に置き換えputStr.f=バイトカウントを下げるか、main=interact$代わりにputStr.STDINから読み込んで完全なプログラムにすることができます
HEGX64

HEGX64 @:しかし、f=unlines.map(>>"*").words戻って何かのように"****\n**\n**\n"、要求されたとして、「水平ASCIIアートグラフ」を出力しません。
nimi

4

CJam、11バイト

@Optimizerが賢い10バイトのソリューションを見つけた後、CJamで2位を競います。これは簡単な11バイトのソリューションです。

lS%:,'*f*N*

オンラインで試す

2つのマップ(11バイト)の代わりにループを使用する代替ソリューション:

lS%{,'**N}/

最初の解決策の説明:

l     Get input.
S%    Split at spaces.
:,    Apply length operator to each word.
'*f*  Map each length to corresponding repetitions of '*.
N*    Join with newlines.

4

JavaScript(ES6)、37

f=s=>s.replace(/./g,m=>m<"!"?`
`:'*')

1つだけを使用した短いバージョンreplace


2
くそー、私はちょうどES6機能、38バイトを終えました。恥ずかしげに逃げる間、私の賛成票を取りなさい!:D
MayorMonty

4

J、10バイト

   '*'$~$&>;:'This is an example histogram of word length'
****     
**       
**       
*******  
*********
**       
****     
******

ボーナス:垂直(12バイト)

   |:'*'$~$&>;:'This is an example histogram of word length'
********
********
*  ** **
*  ** **
   **  *
   **  *
   **   
    *   
    *   

ボーナス:上下反転(14バイト)

   |.|:'*'$~$&>;:'This is an example histogram of word length'
    *   
    *   
   **   
   **  *
   **  *
*  ** **
*  ** **
********
********

3

Python 3、72バイト

素敵なワンライナー:)

print(''.join(map(lambda x:"*"*len(x)+"\n"*int(x!=""),input().split())))

出力:

>>> print(''.join(map(lambda x:"*"*len(x)+"\n"*int(x!=""),input().split())))
Hello world  how are you?
*****
*****
***
***
****

ここには末尾に改行があります。使用したくない場合は、5バイトを追加する必要があります。

print(''.join(map(lambda x:"*"*len(x)+"\n"*int(x!=""),input().split()))[:-1])

3

ジュリア、50バイト

s->print(join(["*"^length(w)for w=split(s)],"\n"))

これにより、入力として文字列を取り、STDOUTに出力する名前のない関数が作成されます。

ゴルフをしていない:

function f(s::String)
    # Construct a vector of horizontal bars
    bars = ["*"^length(w) for w in split(s)]

    # Join the bars with newlines
    j = join(bars, "\n")

    # Print the result to STDOUT
    print(j)
end

3

JavaScript(ES5)

プログラム、54文字

alert(prompt().replace(/\S/g,'*').replace(/ +/g,'\n'))

機能、60文字

function(i){return i.replace(/\S/g,'*').replace(/ +/g,'\n')}

使用例:

var h=function(i){return i.replace(/\S/g,'*').replace(/ +/g,'\n')},
d=document,g=d.getElementById.bind(d),i=g('i'),o=g('o')
i.onchange=function(){o.textContent=h(i.value)}
<input id="i"/>
<pre id="o"></pre>


3

Matlab-54バイト

s=input('');o=repmat('*',1,numel(s));o(s==32)=char(10)

これはコンソールから実行され、入力から文字列を受け取りstdin、次の水平ワードグラフを出力しますstdout

例:

>> s=input('');o=repmat('*',1,numel(s));o(s==32)=char(10)
'This is an example histogram of word length'
o =
****
**
**
*******
*********
**
****
******

または、いくつかの派手な形を作ってみることができます。

>> s=input('');o=repmat('*',1,numel(s));o(s==32)=char(10)
'a aa aaa aaaaaa aaaaaaaaaa aaaaaaaaaaa aaaaaaaaaa aaaaaa aaa aa a aa aaa aaaaaa aaaaaaaaaa'
o =
*
**
***
******
**********
***********
**********
******
***
**
*
**
***
******
**********

非常に賢いアプローチ!
ルイスメンドー

3

Matlab / Octave、75バイト

無名関数を使用する:

@(s)char(arrayfun(@(n)repmat('*',1,n),diff([0 find([s 32]==32)])-1,'un',0))

最後の単語が検出されないようなミスを見つけてくれたHokiに感謝します。

使用例(Matlab):

>> @(s)char(arrayfun(@(n)repmat('*',1,n),diff([0 find([s 32]==32)])-1,'un',0)) % define function
ans = 
    @(s)char(arrayfun(@(n)repmat('*',1,n),diff([0,find([s,32]==32)])-1,'un',0))
>> ans('This is an example histogram of word length') % call function
ans =
****     
**       
**       
*******  
*********
**       
****     
******   

または、オンラインで試してください(Octave)。


3

PowerShell、35 31バイト

変更に対してかなり競争力があります。Go Go Gadget単項演算子。私はまた、のようないくつかの機能上の括弧、ということを忘れておく-splitと、-replaceここで使用されるが、オプションです。

%{$_-split"\s+"-replace".","*"}

パイプライン入力を介して呼び出されます(PowerShellのstdinと同等):

PS C:\Tools\Scripts\golfing> "a aa aaa" | %{$_-split"\s+"-replace".","*"}
*
**
***

ボーナスとして、代わりにコマンドライン引数を使用できる場合、20バイトになり、入力として単一の文字列を使用する場合と使用しない場合の両方で機能するものを使用できます。

$args-replace".","*"

PS C:\Tools\Scripts\golfing> .\horizontal-graph-word-length.ps1 "double space  example"
******
*****
*******

PS C:\Tools\Scripts\golfing> .\horizontal-graph-word-length.ps1 double space  example
******
*****
*******

3

Javascript(ES6)

新しいソリューション(39バイト):

s=>[...s].map(c=>c==' '?`
`:'*').join``

正規表現ソリューション(42バイト):

s=>s.replace(/\S/g,"*").replace(/ +/g,`
`)

非正規表現ソリューション(71バイト):

s=>s.split(" ").map(v=>"*".repeat(v.length)).filter(a=>a!="").join(`
`)

これらのソリューションは、匿名関数を定義します。それらを変数に割り当てるか、次のように呼び出します。

(s=>s.replace(/\S/g,"*").replace(/ +/g,`
`))("[your string here]")

(s=>s.split(" ").map(v=>"*".repeat(v.length)).filter(a=>a!="").join(`
`))("[your string here]")

2

SWI-Prolog、40バイト

a([A|T]):-(A=32,nl;put(42)),(T=[];a(T)).

コード文字列で呼び出されます、例えば a(`This is an example histogram of word length`).


2

STATA、72バイト

di _r(a)
token "$a"
while ("`1'")!=""{
di _d(`=length("`1'")')"*"
ma s
}

非ゴルフ

display _request(a) //get input via prompt
tokenize "$a" //split a by spaces into the variables 1,2,...
while ("`1'")!=""{ //while the first variable is not empty
display _dup(`=length("`1'")')"*" //display "*" duplicated for every character in variable 1.
macro shift //move variable 2 to 1, 3 to 2, etc.
}

このコードはオンラインインタープリターでは機能せず、フリーではない独自のSTATAインタープリターが必要です。


2

C ++ 14、107 106バイト

#include<iostream>
main(){std::string s;for(;std::cin>>s;){for(char c:s)std::cout<<'*';std::cout<<'\n';}}


2

O、22バイト

i' /rl{e{'.'*%p}{;}?}d

説明

i                         Read the user input
 ' /r                     Split on spaces and reverse
     l{             }d    For each element
       e           ?      If it's not empty
        {'.'*%            Replace every char with an asterick
              p}          And print it
                {;}       Else, just pop it off the stack

2

ビーム、92バイト

これはまったく競争力のある答えではなく、非常に遅いですが、私は最近少しBeamをいじっており、これを実現できるかどうか確認したかったです。最終的にいくつかの成功を得ました:)

'''''''>`++++++)v
vgLsP-(---`<''P'<
>rnp+v
  >Sv>++v
    (>`v+
    H^ )+
^Sp`@p'<+
^  @++++<


1

AWK

 awk '{for(i=1;i<=NF;i++){while(k++<length($i)){printf "*"};k=0;print ""}}'

 echo "this is programming" | awk '{for(i=1;i<=NF;i++){while(k++<length($i)){printf "*"};k=0;print ""}}'

出力:-

****
**
***********
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.