Horizontales Diagramm der Wortlänge


28

Eingang

Eine Liste von Wörtern, die durch eine beliebige Anzahl von Leerzeichen getrennt sind.

Ausgabe

Ein horizontales ASCII-Grafikdiagramm, bei dem die n-te Linie aus so vielen Sternchen ( *) besteht, wie das n-te Wort lang ist.

Anwendungsbeispiel

Die >Signale, die der Benutzer eingibt, sollten Sie beim Testen des Programms nicht eingeben.

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

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

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

Referenzimplementierung

Im Zweifelsfall über die Spezifikation sollte die Ausgabe Ihres Programms unter allen Eingaben genau der des folgenden Programms entsprechen.

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

Ist also ein abschließender Zeilenumbruch erlaubt? Daumen drücken
Beta-Zerfall

@BetaDecay Ja, erlaubt ...........
Caridorc

Wird die Eingabe jemals führende oder nachfolgende Leerzeichen enthalten?
PhiNotPi

8
Was Sie beschreiben, ist kein Histogramm. Ein Histogramm würde die Anzahl der Wörter mit x Zeichen in Zeile x anzeigen. Im ersten Beispiel hätte Zeile 1 0 Sternchen (keine Wörter mit der Länge 1), Zeile 2 hätte 3 Sternchen (ist, ein, von) und so weiter.
nitro2k01

1
Ok, mir ist klar, dass du recht hast. Horizontal ist es.
Nitro2k01

Antworten:


24

Retina , 5 + 3 = 8 Bytes

 +
\n
.
*

Jede Zeile geht in eine eigene Datei, also habe ich für jede weitere Datei 1 Byte hinzugefügt. Außerdem \nsollte der durch einen tatsächlichen Zeilenumbruch ersetzt werden.

Jedes Linienpaar ist ein Musterersetzungspaar. +Stimmt mit einem oder mehreren Leerzeichen überein und ersetzt es durch eine neue Zeile. .stimmt mit jedem Zeichen außer einem Zeilenumbruch überein und ersetzt dieses durch ein *. Dies wird global angewendet, sodass jedes Zeichen durch ein ersetzt wird *.


11

Pyth, 9 Bytes

jm*ld\*cz

Erläuterung:

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 Bytes

r{,'**Nr}h

Wie es funktioniert :

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

Probieren Sie es hier online aus


10

R - 33

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

woher

  • scan(,"") Liest aus stdin und teilt den Leerraum in einen Zeichenvektor auf.
  • gsub(".", "*", ...)ersetzt alle Zeichen in *.
  • write(..., "") druckt auf Standardausgabe mit "\ n" als Standardtrennzeichen.

10

Python 3, 43 Bytes:

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

Vielen Dank an @BetaDecay für den Hinweis auf einen Syntaxfehler.

Probelauf:

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

(Die folgende Zeichenfolge wird als Literal und nicht als Text eingegeben.)

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

Bonus: vertikales Histogramm

Vielen Dank an @Caridorc für den Hinweis auf meinen Fehler, dass die Boni 1 bis viele Zeilen enthalten.

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

Demo:

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

Bonus: vertikales Histogramm (verkehrt herum)

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

Demo:

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

Vertikal ist um eins aus
Caridorc

6

R, 38 Bytes (mit etwas Hilfe in Kommentaren)

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

Wie es funktioniert

  • gsub Ersetzt alle Leerzeichen durch *
  • second gsubfügt \n(newline) am Ende jedes Elements hinzu
  • cat druckt entsprechend

Demo


6

> <> , 38 37 Bytes

Fluch du doppelter Raum Fall * schüttelt Fisch *.

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

Sie können es online ausprobieren (alles, was Sie tun müssen, ist eine Eingabe über das Feld am unteren Rand und Givedrücken Sie dann die Taste). Vorschläge für weiteres Golfen sind immer willkommen, insbesondere Ideen, um diese verschwenderischen Räume vor der zweiten und dritten Zeile zu entfernen.

Wenn Sie eine zusätzliche neue Zeile für zusätzliche Leerzeichen drucken könnten, könnte der Code ganze 27 Bytes umfassen :

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

Erläuterung

Anmerkung: Die Reihenfolge der Erklärung entspricht der Position des Zeigers (wenn der Code also in einer anderen Reihenfolge erklärt wird, als dies der Fall wäre, führt der Zeiger ihn in dieser Reihenfolge aus).

Linie 1:

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

Zeile 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

Zeile 3:

Hinweis: Diese Zeile verläuft in umgekehrter Reihenfolge. Lesen Sie also von rechts nach links.

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

Grundsätzlich prüft das Programm, ob die Eingabe (die zeichenweise gelesen wird) kein Leerzeichen ist und gibt dann einen Stern aus. Es wird beendet, wenn keine Eingabe vorliegt (der Eingabewert ist -1). Um sicherzustellen, dass keine zusätzlichen Zeilenumbrüche gedruckt werden, wird der Registerwert verwendet, der entweder auf 0 oder 1 gesetzt wird. Aufgrund der Art und Weise, wie ich ihn einrichte, ist es egal, welche Werte auf den Stapel übertragen werden (z. B. den Wert des Registers, auf den es 1nach dem Drucken eines Sternchens gesetzt wird); Sie verbleiben auf dem Stapel, wenn das Programm beendet wird, tun aber nichts.

Ich weiß , es könnte ein bisschen verwirrend , da ich verwenden , 84*und 67*statt " "und "*"jeweils, aber das war , weil ich nicht aus irgendeinem Grunde , wie wenn man Strings im Programm fühlen.



6

Javascript ES6

Funktion, 46 Zeichen

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

Programm, 55 Zeichen

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

Ihre Funktion ist 46 Zeichen lang und Ihr Programm ist 55.
adroitwhiz

@ darkness3560, danke für die korrektur. Ich benutzte Ausdrücke "f=s=>s.replace(/\S/g,'*').replace(/\s+/g,'\n')".length, um die Länge zu messen und vergaß \.
Qwertiy

6

Perl, 16 Bytes (15 Zeichen + -p)

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

Rennen wie:

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

Dank @ThisSuitIsBlackNot wurde ein zusätzliches Byte gespeichert , auf das ich noch nie gestoßen y///swar!


Das ist ausgezeichnet! Sie können 1 Byte sparen, indem Sie die erste Ersetzung in eine Transliteration y/ /\n/s;
ändern

@ThisSuitIsBlackNot Ooh schön! Danke dir!
Dom Hastings

5

Gema, 11 9 Zeichen

 =\n
?=\*

Probelauf:

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 Bytes

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


Verbrauch:
Rufen Sie das Script und definieren eine globale Variable ($ a)
php -d error_reporting=0 script.php?a="This is an example histogram of word length"

Ausgabe:

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

4

Java, 102 Bytes

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

4

Haskell, 31 Bytes

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

Anwendungsbeispiel:

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

Sie können ersetzen putStr.mit f=der Bytezahl zu senken, oder verwenden Sie main=interact$statt putStr.von STDIN zu lesen und ein komplettes Programm zu machen
HEGX64

@ HEGX64: Gibt aber so f=unlines.map(>>"*").wordsetwas zurück "****\n**\n**\n"und gibt nicht wie gewünscht ein "horizontales ASCII- Kunstdiagramm " aus.
nimi

4

CJam, 11 Bytes

Im Wettbewerb um den zweiten Platz in CJam fand @Optimizer eine clevere 10-Byte-Lösung. Dies ist eine einfache 11-Byte-Lösung:

lS%:,'*f*N*

Probieren Sie es online aus

Alternative Lösung, die anstelle der beiden Maps eine Schleife verwendet, ebenfalls 11 Byte:

lS%{,'**N}/

Erklärung zur ersten Lösung:

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<"!"?`
`:'*')

Kürzere Version mit nur einer replace.


2
Verdammt, ich habe gerade meine ES6-Funktion beendet, 38 Bytes. Nimm mein Votum an, während ich beschämt davonlaufe! : D
MayorMonty

4

J, 10 Bytes

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

Bonus: vertikal (12 Bytes)

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

Bonus: vertikal gespiegelt (14 Bytes)

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

3

Python 3, 72 Bytes

Ein schöner Einzeiler :)

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

Ausgabe:

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

Es gibt hier einen nachgestellten Zeilenumbruch. Wenn Sie es ohne wollen, müssen Sie 5 Bytes hinzufügen:

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

3

Julia, 50 Bytes

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

Dadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge als Eingabe verwendet und an STDOUT ausgegeben wird.

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)

Programm, 54 Zeichen

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

Funktion, 60 Zeichen

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

Anwendungsbeispiel:

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 Bytes

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

Dies läuft von der Konsole aus, nimmt einen String in die Eingabe von stdinund gibt das horizontale Wortdiagramm aus in stdout:

Beispiel:

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

Oder wir könnten versuchen, ausgefallene Formen zu kreieren:

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

Sehr kluger Ansatz!
Luis Mendo

3

Matlab / Octave, 75 Bytes

Verwenden einer anonymen Funktion:

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

Vielen Dank an Hoki, der einen Fehler entdeckt hat, der verhindert hat, dass das letzte Wort erkannt wird.

Anwendungsbeispiel (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 =
****     
**       
**       
*******  
*********
**       
****     
******   

Oder versuchen Sie es online (Oktave).


3

PowerShell, 35 - 31 Byte

Zur Abwechslung ziemlich konkurrenzfähig. Go go Gadget unären Operatoren. Ich vergesse auch immer wieder, dass das Paren einiger Funktionen, wie der hier verwendeten -splitund -replace, optional ist.

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

Wird über die Pipelineeingabe aufgerufen (entspricht stdin für PowerShell):

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

Als Bonus können wir, wenn wir stattdessen Befehlszeilenargumente verwenden können, bis zu 20 Bytes reduzieren und etwas haben, das sowohl mit als auch ohne eine einzelne Zeichenfolge als Eingabe funktioniert:

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

Neue Lösung (39 Bytes):

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

Regex-Lösung (42 Byte):

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

Nicht-Regex-Lösung (71 Byte):

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

Diese Lösungen definieren anonyme Funktionen. Ordnen Sie sie Variablen zu oder rufen Sie sie wie folgt auf:

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

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

Wird mit Code-Strings aufgerufen, z a(`This is an example histogram of word length`).


2

STATA, 72 Bytes

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

Beachten Sie, dass dieser Code im Online-Interpreter nicht funktioniert und den nicht-freien proprietären STATA-Interpreter erfordert.


2

C ++ 14, 107 106 Bytes

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


2

O, 22 Bytes

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

Erläuterung

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

Strahl, 92 Bytes

Dies ist überhaupt keine wettbewerbsfähige Antwort und ziemlich spät, aber ich habe in letzter Zeit ein bisschen mit Beam herumgespielt und wollte sehen, ob ich es dazu bringen kann, dies zu tun. Endlich ein paar Erfolge :)

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

Beispiele

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

Ausgabe:-

****
**
***********
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.