字长的水平图


28

输入值

由任意数量的空格分隔的单词列表。

输出量

水平ASCII艺术图,其中第n行由*与第n个单词一样多的星号()组成。

用法示例

>信号的用户输入,你不应该测试程序时输入它。

> 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")

那么是否允许尾随换行符?交叉手指
Beta Decay's

@BetaDecay是的,允许.........
Caridorc

输入内容中是否会有前导或尾随空格?
PhiNotPi

8
您所描述的不是直方图。直方图将显示x行上具有x个字符的单词数。在第一个示例中,第1行将带有0个星号(没有长度为1的单词),第2行将具有3个星号(is,an,of),依此类推。
nitro2k01

1
好吧,我知道你是对的。是水平的。
nitro2k01

Answers:


24

视网膜,5 + 3 = 8字节

 +
\n
.
*

每行都在其自己的文件中,因此我为每个其他文件添加了1个字节。另外,\n应将替换为实际的换行符。

每对线是一个图案替换对。 +匹配一个或多个空格,并用换行符替换。.匹配换行符以外的任何字符,并用替换*。这是全局应用的,因此每个字符都被替换为*


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

CJam,10个字节

r{,'**Nr}h

运作方式

r{     r}h         e# This do-while loop basically reads all the whitespace separated tokens
                   e# from input. It separates the tokens on running lengths of whitespace
  ,                e# Take the length of the token
   '**             e# Get a string of that many '*' characters
      N            e# Print a new line

在这里在线尝试


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
********
********
*  ** **
*  ** **
   **  *
   **  *
   **   

垂直距离减少了
Caridorc

6

R,38个字节(在注释中有帮助)

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

怎么运行的

  • gsub 将所有无空格替换为 *
  • 第二个gsub\n(换行符)添加到每个元素的末尾
  • cat 相应地打印

演示版


6

> <>38 37字节

诅咒你双倍空间情况*摇鱼*。

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

您可以在线尝试(您所要做的就是通过底部附近的字段输入内容,然后单击Give按钮)。始终欢迎进一步打高尔夫球的建议,尤其是消除第二和第三条线前面那些浪费空间的想法。

如果允许您打印额外的换行符以留出多余的空格,则代码可能高达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行:

注意:此行是反向的,因此请从右到左阅读。

 ^ &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),它将终止。为了确保它不打印其他换行符,它使用寄存器值,将其设置为0或1。由于我设置它的方式,它不在乎将多余的值压入堆栈(例如1在打印星号后将其设置为寄存器的值);当程序终止时,它们保留在堆栈中,但什么也不做。

我知道自从我分别使用84*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;
ThisSuitIsBlackNotNot

@ThisSuitIsBlackNot哦,太好了!谢谢!
Dom Hastings

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 2015年

@ HEGX64:但f=unlines.map(>>"*").words返回类似的内容"****\n**\n**\n",并且不会按要求输出“水平ASCII艺术图”。
nimi 2015年

4

CJam,11个字节

在@Optimizer找到一个聪明的10字节解决方案之后,在CJam中争夺第二名。这是一个简单的11字节解决方案:

lS%:,'*f*N*

在线尝试

使用循环而不是两个映射(也为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

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 /八度,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 =
****     
**       
**       
*******  
*********
**       
****     
******   

在线尝试(八度)。


3

PowerShell,35 31字节

变革很有竞争力。Go go小工具一元运算符。我也忘记了对某些功能(如-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 ""}}'

输出:-

****
**
***********
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.