Sie wurden gerade von einem deutschen Automobilhersteller eingestellt. Ihre erste Aufgabe als Ingenieur ist es, ein Programm zu schreiben, das den ökologischen Fußabdruck von ASCII-Zeichenfolgen berechnet.
Der ökologische Fußabdruck des Charakters wird wie folgt berechnet:
Schreiben Sie den ASCII-Code des Zeichens binär und zählen Sie die Anzahl der Einsen.
Hat beispielsweise A
eine Grundfläche von 2, ist jedoch O
mit einer Grundfläche von 5 schmutziger.
Der globale Footprint eines Strings ist die Summe der Footprints seiner Zeichen. Eine leere Zeichenfolge hat einen Footprint von Null.
Ihr Programm muss einen ASCII-String als Parameter akzeptieren (über die Befehlszeile oder Eingabe), seinen ökologischen Fußabdruck berechnen und ausgeben. Das Programm selbst muss ASCII-codiert sein.
Es gibt jedoch einen Schluckauf. Da Ihr Unternehmen in einen neuen Markt mit strengeren Umweltvorschriften eintreten möchte, müssen Sie Ihr Programm so einstellen, dass es sich im "Testmodus" anders verhält. Somit:
Das Programm sollte 0 ausgeben, wenn es den String
test
als Parameter empfängt .
Wertung
Der Quellcode mit dem geringsten ökologischen Fußabdruck gewinnt (und ja, die Antwort test
ist verboten!)
quelle
\x7F}~_?{ow7yvu/s\x1F;=znm>k|OW[]^gc\x1Ex\x1D\eef\\'ZY+-VU.St\x173iNM5K6r\x0FG9:q<ljQ\x15\x13pC\aEF8IJL4\x0E21\x16RTh,X*)\x19\v&%\x1A#d\x1C\rab`!\"$(\x180\x05A\x14B\x12\x11DHP\x03\f\x06\n\t\x80\x10\x01@\x04\b\x02 \x00
Antworten:
CJam,
3331Es gibt 113000000009500000000340000000116000000010100000001150000000116000000003400000000610000000033000000004200000000000000000000000000000000000000000000000000000000000000000000000000000000000000 zwischen den.
Der Code ist äquivalent zu
das kann online getestet werden .
Wie das geht
Wie das funktioniert
Dieser Quellcode hat einen ökologischen Fußabdruck von 75.
quelle
Sprache , 0
Die Ausgabe erfolgt in einstelligen , da Lenguage / Brainfuck keine vernünftige Art und Weise hat ganze Zahlen von Druck in der Basis 10.
Der eigentliche Quellcode enthält
null Bytes und entspricht dem folgenden Brainfuck-Programm:
Probieren Sie es online auf brainfuck.tk .
Die Länge des Brainfuck-Codes ist höchst suboptimal - für den Anfang habe ich die Fußabdrücke aller ASCII-Zeichen fest codiert - aber Punktzahl 0 ist Punktzahl 0 ...
quelle
PowerShell,
337344304 PunkteIch rufe dich an, weil es billiger ist!
Nimmt die Eingabe als
$A
, wandelt sie dann als Zeichen-Array um, durchläuft dann eine for-Schleife für jedes Zeichen,[convert]::ToString()
konvertiert das Zeichen an dieser Position mit lächerlich wortreichen Worten in binäre Zeichen, ersetzt alle Nullen durch nichts und zählt dann die Länge und fügt das hinzu$B
. Verwendet am Ende eine Äquivalenz, um ein dynamisches Array zu indizieren (dh, wenn es$A
isttest
, dann-CEQ
ist es$TRUE
so, dass es auf das zweite Element indiziert0
).Edit1 - Korrigierter Testfall
"TEST"
Edit2 - Golf ein paar Punkte durch Iteration über die Zeichen selbst und nicht über ihre Indizes, und indem Sie sich daran erinnern, dass Sie
-replace
keinen zweiten Parameter benötigen, wenn Sie ihn durch nichts ersetzen.quelle
" 00100010
sind umweltfreundlicher als einfache Anführungszeichen' 00100111
."TEST"
"
. Auch korrigiert mit-CEQ
für Groß- und Kleinschreibung. Es hat die Punkte ein wenig angehoben, weil ich das falsch gewertet habe, da ich' '
es bei meinen Tests nicht richtig eingegrenzt habe.Pyth -
5249Drei Punkte sparen dank @orlp.
Nimmt Eingaben in Anführungszeichen vor, um Platz zu sparen.
Test Suite .
quelle
@,0
durch*
, um 3 zu speichern :)@,0
, hast du einfach vergessen, dich zu ändern?Gemeines Lisp,
294281235Um die Punktzahl zu verringern, habe ich
@
(Kosten 1) und!
(Kosten 2) als Variablennamen verwendet (Bearbeiten: und es ist noch besser, wenn ich@
für die Variable verwende, die in der Funktion am häufigsten vorkommt). ICH SCHREIE TOO , weil es billiger ist.Hübsch bedruckt
quelle
;)
JavaScript, 279
Fehlerbehebung bearbeiten (Bit 1 jedes Zeichens wurde nicht gezählt)
Ein komplettes Programm mit Ein- und Ausgabe über Popup. Getestet in Firefox, sollte in jedem modernen Browser funktionieren.
Einige Tools (Getestet mit Firefox)
quelle
test
statt 0 aus.prompt
Funktion.prompt
Übersetzt in Firefox die Zeilenumbrüche (2 Bit) in Leerzeichen (1 Bit), sodass wir 277 anstelle von 279 erhaltenJulia,
254246232Die
count_ones
Funktion zählt die Anzahl der Einsen in der Binärdarstellung ihres Eingangs.Reduzierte meinen ökologischen Fußabdruck dank FryAmTheEggman!
quelle
Python 3, 271
quelle
z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test"))
.... @ FryAmTheEggman jinx?Perl,
136,118,73Ersetzen Sie alle
@
durch\0
Anwendungsbeispiel:
quelle
MATLAB,
198194 BytesZunächst wird der String über die
input
Funktion aus STDIN eingelesen . In diesem Fall vergleichen wir die Eingabezeichenfolge mit der Zeichenfolgetest
. Wenn das Ergebnis nichttest
stimmt, konvertieren wir jedes Zeichen in seinen ASCII-Code und dann in seine Binärdarstellung überdec2bin
. Eine schöne Folge dieser Funktion ist, dass die binäre Darstellung des ASCII-Codes durch ein Zeichen pro Zeile begrenzt wird, wenn Sie eine Zeichenfolge übergeben.Als Beispiel:
dec2bin
gibt ein Zeichenarray aus. Subtrahieren Sie in diesem Fall den ASCII-Code für 0 mit 48, damit die Matrix indouble
0 und 1 konvertiert wird . Sobald dies geschieht, wird ein Aufruf zumnnz
Aufzählen der Gesamtzahl der von Null verschiedenen Elemente in dieser Matrix ausgeführt. Beachten Sie, dass dieses Ergebnis mit dem Gegenteil der Zeichenfolge multipliziert wird, mit der verglichen wirdtest
. Sollte der String nicht seintest
, erhalten wir die Footprint-Berechnung. Wenn es gleich ist, ergibt die Multiplikation 0.Einige Beispiele:
quelle
de2bi
stattdessen die verwenden und vermeiden-48
, sie in einen numerischen Typ umzuwandeln (sowie die 2 zusätzlichen Zeichen im Funktionsnamen).Bash
440430412405403Ziemlich einfach. Schleifen von Zeichen in der Eingabe, die zuerst in ASCII konvertiert werden (mit
printf %d
und dem führenden Zeichen in der'
Zahl, dann in binär (mitbc
), entfernen die Nullen und zählen die Anzahl der Zeichen.Keine gute Antwort, hatte aber noch keinen Bash-Versuch gesehen.
Geändert, seit meine erste Antwort erlaubte, dass der Eingabe-String einfach auf der Kommandozeile angegeben wurde (dh es wurden mehrere Eingabe-Parameter, wenn Wörter mit mehreren Ausdrücken geschrieben wurden), aber nachdem ich einige andere Antworten gelesen habe, kann ich davon ausgehen, dass der gesamte String in Anführungszeichen steht
$1
quelle
do
mit{
unddone
mit ersetzen}
. 2. Sie brauchen auch keine Leerzeichen<<<
. 3. Sie können durch\n
einen wörtlichen Zeilenumbruch ersetzen .=
und||
kostet 15, während Verwenden!=
und&&
nur 13 ist! Ein zusätzlicher Charakter, spart aber zwei Punkte ...Ceylon,
1431,764,697,571,547,538,501,493,467, 451Dies war das Original, ungolfed:
Das Argument stammt aus einem Befehlszeilenparameter ... process.arguments ist eine (möglicherweise leere) Folge von Zeichenfolgen. Bevor Sie eine dieser Zeichenfolgen verwenden, müssen Sie überprüfen, ob sie tatsächlich vorhanden sind. Im anderen Fall geben wir eine Fehlermeldung aus (diese wird von der Frage nicht benötigt und wird in den nächsten Versionen weggeworfen).
Ceylons
sum
Funktion nimmt eine nicht leere Iterable von Elementen eines Typs an, die erfüllt sein müssenSummable
, dh eineplus
Methode wie Integer haben müssen. (Es funktioniert nicht mit leeren Sequenzen, da jeder Summable-Typ eine eigene Null hat und die Laufzeit keine Chance hat, zu wissen, welche gemeint ist.)Die Elemente einer Zeichenfolge oder die Bits einer Ganzzahl sind keine nicht leeren iterierbaren Elemente. Aus diesem Grund verwenden wir hier die Funktion, um eine Iteration zu erstellen, indem Sie einige Elemente und dann ein "Verständnis" angeben (das mit null oder mehr Elementen bewertet wird). Im Zeichenfall addieren wir also Einsen (aber nur, wenn das entsprechende Bit gesetzt ist), im Zeichenfall addieren wir das Ergebnis der Zeichen. (Das Verständnis wird nur bewertet, wenn die Empfangsfunktion tatsächlich darüber iteriert, nicht wenn die Iterable erstellt wird.)
Mal sehen, wie wir das reduzieren können. Erstens wird jede der Funktionen nur an einer Stelle aufgerufen, damit wir sie einbinden können. Beseitigen Sie auch, wie oben erwähnt, die Fehlermeldung. (764 Footprint-Punkte.)
Wir brauchen das Verschachtelte nicht wirklich
sum
, wir können dies zu einem großen Verständnis machen. (Dies erspart uns 37 Footprint-Punktesum({0,})
und noch mehr für Whitespace, was am Ende sowieso beseitigt wird.) Dies ist 697:Wir können ein ähnliches Prinzip auf die Sonderzeichenfolge anwenden
"test"
: Da in diesem Fall das Ergebnis 0 ist (dh es wird nichts zur Summe beigetragen), können wir dies nur als Teil der Summierung tun (aber wir müssen die Bedingung invertieren). . Dies erspart uns hauptsächlich dieprint(0);
, einige Klammern und eine Reihe von Einrückungsräumen, die sich auf eine Stellfläche von 571 reduzieren:Das Gleiche machen wir zum ersten Mal
if
, mit dem Nebeneffekt, dass jetzt kein Argument mehr ausgegeben wird,0
anstatt nichts zu tun. (Zumindest dachte ich, dass das hier passieren würde, stattdessen scheint es mit einer ewigen Schleife zu hängen? Seltsam.)Wir können das
()
für diesum
Funktion hier weglassen , indem wir eine alternative Funktionsaufrufsyntax verwenden , die{...}
anstelle von verwendet wird()
, und Verständnis in iterierbare Argumente eintragen. Das hat Footprint 538:Das Ersetzen des Funktionsnamens
footprint
(40) durchp
(3) spart weitere 37 Punkte und bringt uns auf 501. (Ceylon-Funktionsnamen müssen mit Kleinbuchstaben beginnen, daher können wir hier nicht weniger als 3 Punkte erhalten.)Die Variablennamen
s
(5) undc
(4),i
(4) sind ebenfalls nicht optimal. Ersetzen wir sie durcha
(Argument),d
(Ziffer?) Undb
(Bit-Index). Stellfläche 493:Ich sehe keine verbleibende Nicht-Leerzeichen-Optimierung. Entfernen wir also das nicht benötigte Leerzeichen (1 Punkt für jedes Leerzeichen, zwei für jeden der beiden Zeilenumbrüche):
Beim Durchsuchen der API stellte ich fest, dass Character.hash tatsächlich denselben Wert wie sein
integer
Attribut zurückgibt . Aber es hat nur 14 statt 30 Punkte, also kommen wir auf 451!quelle
PowerShell,
273336328324293288295edit - habe den "Test" -Fall vergessen ... so teuer.
Bearbeitet - hat eine GROSSBUCHSTABEN-Gelegenheit verpasst.
editeditedit - hat die Kommentarvorschläge aufgenommen (Danke TimmyD).
edit 4 - D ist eine billigere Variable als C (2 vs. 3)
edit 5 - Zurück zu 295 aufgrund der Prüfung der Groß- und Kleinschreibung.
Durchläuft die Zeichenfolge und zählt die Einsen, die vom ASCII-Wert der Zeichen abweichen.
Hut ab vor TimmyD, der mir die Voraussicht gegeben hat, Großbuchstaben UND den Array-Index am Ende zu verwenden.
quelle
PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
PS C:\scripts> .\ecological-footprint.ps1
"TEST"
PARAM($A)(([CHAR[]]$A|%{$B=$_;0..9|?{[INT]$B-SHR$_-BAND1}}).LENGTH,0)[("TEST"-EQ$A)]
Matlab, 320
quelle
C 374
Zeilenumbrüche (nicht in der Partitur enthalten) wurden der Übersichtlichkeit halber hinzugefügt. Könnte durch Ändern von Variablennamen in Großbuchstaben auf 360 verbessert werden, aber ich werde versuchen, mir etwas Besseres auszudenken.
Die Eingabe erfolgt über die Befehlszeile. Dies bedeutet, dass bei fehlender Eingabe keine Fehler auftreten. Ich erwarte eine schlechtere Bewertung für die Eingabe durch stdin.
quelle
PHP,
377337299 Ökologischer Fußabdruck (immer noch viel) ,10291 BytesScheint, dass PHP nur im Testmodus umweltfreundlich ist. ;)
Läuft von der Kommandozeile aus wie:
while
ist umweltfreundlicher alsfor
, obwohl sie die gleiche Zeichenanzahl haben. Auch Variablennamen in Großbuchstaben haben einen besseren Footprint als die Namen in Kleinbuchstaben.Bearbeiten
decbin
anstelle vonbase_convert
quelle
VBA,
475418Danke Jacob für 57 Punkte
Konvertiert einen String in ein Byte-Array (128 ist eine vba-Abkürzung für "Konvertiert den String von Unicode in die Standard-Codepage des Systems". Funktioniert also nicht auf einem Mac ....)
Schleifen durch Byte-Array, das alles in Binär umwandelt und zusammen verkettet.
VBA, warum bist du so schlecht im Golfen ... :(
quelle
"test"
natürlich)JavaScript,
418410quelle
" 00100010
sind umweltfreundlicher als einfache Anführungszeichen' 00100111
.Pyth, 64
Überprüft, ob es sich bei dem Eingang um einen Test handelt, und zählt, falls nicht, die Anzahl der Einsen in der Binärdarstellung des Eingangs.
quelle
Haskell, 292
Hier gibt es nicht viel zu sagen: Verwandle jedes Zeichen in einen ASCII-Wert (
fromEnum
) und berechne das1
s (viaa
). Fassen Sie alle Ergebnisse zusammen.quelle
JavaScript (ES6),
521478458449473465Dies ist mein erster Versuch mit einem JavaScript-Golf, daher ist es wahrscheinlich sehr ungolfed.
quelle
Ruby,
316313Sehr unkompliziert und auf der Suche nach weiteren Golfmöglichkeiten:
b
verwendetx
, um 3 Punkte zu speichern.quelle
$*[0]
anstelle vongets.chomp
(Eingaben werden als Befehlszeilenargument verwendet)" 00100010
sind umweltfreundlicher als einfache Anführungszeichen' 00100111
.H
ist besser alsI
aus dem gleichen Grund.Python 2,
294281269266Ein Port meiner Pyth-Antwort oben.
Die Eingabe wird als Zeichenfolge (mit Anführungszeichen) empfangen:
quelle
" 00100010
sind umweltfreundlicher als einfache Anführungszeichen' 00100111
.A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]
mit einer Punktzahl von 243.CJam, 123
quelle
Pyth, 96
Ein Port meiner CJam-Antwort, oben / unten.
quelle
I
versuchen, das Ternäre zu verwenden?
, aber in diesem Fall, da es ein Bool ist, können Sie es einfach verwenden*
(nach dem Umschalten aufn
anstelle vonq
),k
wird automatisch""
unds
auf Strings das gleiche ajk
. Ich wünsche Ihnen viel Spaß beim Lernen von Pyth! :)CJam,
83817977Am besten bisher, nachdem Sie eine Reihe von Variationen ausprobiert haben:
Probieren Sie es online aus
Erläuterung:
quelle
Ruby, 247
Einfacher Ansatz, der alle Bytes der Eingabe und alle Bits in jedem Byte durchläuft und zu einer Variablen summiert
d
.d
wird auf -2 initialisiert, weil esh
den abschließenden Zeilenumbruch vom Eingang enthält (Wert 2 Bit) und wir das nicht zählen wollen.Ebenso
h
wirdtest
mit einem abschließenden Zeilenumbruch ein Zeilenumbruch enthalten, so dass im Vergleichswert ein Zeilenumbruch enthalten sein muss.quelle
R 279
Ziemlich selbsterklärend.
Tests:
quelle
C, 378 Fußabdruck, 98 Bytes
Eine andere C-Lösung:
Dies funktioniert folgendermaßen: s wird normalerweise mit 0 initialisiert, wird jedoch zu -17, wenn das Befehlszeilenargument "test" lautet (strcmp gibt 0 für gleiche Zeichenfolgen und ungleich Null für unterschiedliche Zeichenfolgen zurück, sodass beim Invertieren 1 für Zeichenfolgen ausgegeben wird ist "test"). Die Zahl -17 wurde gewählt, um den Fußabdruck von 17 zu kompensieren, der für "Test" berechnet wird. Die Berechnung des Footprints ist mit bitweisen Operatoren einfach.
Schnapp! Anfangs habe ich die "kürzesten Footprint-Siege" verpasst, also habe ich den kürzesten Code angestrebt ... Ich werde sehen, ob ich den "Footprint" verkleinern kann.
quelle
Java, 594
Java ist nicht sehr grün.
Ungolfed-Version:
D
wird als deklariert,Integer
damit wir umweltbewusst aufInteger
die statischebitCount
Methode zugreifen können . DiebitCount
Methode behandelt daschar
s als Ganzzahl und gibt die Anzahl der gesetzten Bits zurück.quelle