Горизонтальный график длины слова


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

Так разрешен ли завершающий перевод строки? скрещивает пальцы
бета-распад

@BetaDecay Да, разрешено ...........
Caridorc

Будет ли вход когда-либо иметь начальные или конечные пробелы?
PhiNotPi

8
То, что вы описываете, не является гистограммой. Гистограмма будет показывать количество слов с символами x в строке x. В первом примере строка 1 будет иметь 0 звездочек (без слов длиной 1), строка 2 будет иметь 3 звездочки (is, an, of) и так далее.
nitro2k01

1
Хорошо, я понимаю, что ты прав. Горизонтально это.
nitro2k01

Ответы:


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

R - 33

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

где

  • scan(,"") читает из стандартного ввода и разбивает пробел на символьный вектор.
  • 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:

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). Чтобы убедиться, что он не печатает дополнительные символы новой строки, он использует значение регистра, которое он либо устанавливает в 0 или 1. Из-за способа, которым я его установил, он не заботится о посторонних значениях, помещаемых в стек (например, значение регистра, когда оно устанавливает его1 после печати звездочки); они остаются в стеке, когда программа завершается, но ничего не делают.

Я знаю, что это может немного сбивать с толку, так как я использовал 84*и 67*вместо " "и "*"соответственно, но это было потому, что я не чувствовал желания вставлять строки в программу по любой причине.



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

@ThisSuitIsBlackNot О, хорошо! Спасибо!
Дом Гастингс

5

Гема, 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-искусства» в соответствии с запросом.
Ними

4

CJam, 11 байт

Соревнование за второе место в CJam после @Optimizer нашло умное 10-байтовое решение. Это простое 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

JavaScript (ES6), 37

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

Укороченная версия с использованием только одного 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.

Ungolfed:

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:

Exemple:

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

Спасибо Хоки за обнаружение ошибки, которая помешала обнаружить последнее слово.

Пример использования (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 байт

Довольно конкурентоспособны для разнообразия. Иди иди гаджет, унарные операторы. Я также постоянно забываю, что паренсы на некоторые функции, такие как -splitи -replaceиспользуемые здесь, являются необязательными.

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

Вызывается через конвейерный ввод (эквивалентно stdin для PowerShell):

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

Решение Regex (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-Пролог, 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
}

Ungolfed

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 ""}}'

выход:-

****
**
***********
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.