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


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 зірочки (є, an, of) тощо.
nitro2k01

1
Гаразд, я розумію, що ти маєш рацію. Він горизонтальний.
nitro2k01

Відповіді:


24

Сітківка , 5 + 3 = 8 байт

 +
\n
.
*

Кожен рядок має свій власний файл, тому я додав 1 байт для кожного додаткового файла. Крім того, \nслід замінити фактичний новий рядок.

Кожна пара ліній - пара заміни шаблону. +збігається з одним або кількома пробілами і замінює його новим рядком. .відповідає будь-якому символу, окрім нового рядка, і він замінює його на a *. Це застосовується у всьому світі, тому кожен символ замінюється символом a *.


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(..., "") друкує для stdout з "\ 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*замість цього, " "і "*"відповідно, але це було тому, що я не відчував необхідності вводити рядки в програму з будь-якої причини.



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
МерМонті

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

Матлаб - 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

Матлаб / Октава, 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 =
****     
**       
**       
*******  
*********
**       
****     
******   

Або спробуйте в Інтернеті (Octave).


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

О, 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 байт

Це взагалі не є конкурентоспроможною відповіддю і насправді досить пізно, але я останнім часом трохи пограв з Бімом і хотів побачити, чи зможу я це зробити. Нарешті отримав певний успіх :)

'''''''>`++++++)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.