Der kürzeste Code zum bitweisen Invertieren einer Binärzeichenfolge


79

Ich denke, es gibt hier nicht genug einfache Fragen, die Anfänger versuchen können!

Die Herausforderung: Bei einer zufälligen Eingabe von Einsen und Nullen wie:

10101110101010010100010001010110101001010

Schreiben Sie den kürzesten Code, der die bitweise Inverse ausgibt, wie folgt:

01010001010101101011101110101001010110101

Antworten:


88

J, 5 Bytes

Angenommen, die Eingabezeichenfolge ist variabel b.

b='0'

Dies ist in den meisten Sprachen nicht das, was es tun würde ...

Der J-Vergleichsoperator ist gerecht =( =:und =.ist eine globale bzw. eine lokale Zuweisung). Funktioniert jedoch =nicht wie der normale ==Operator: Er vergleicht Artikel für Artikel. Beachten Sie, dass ein Array wie folgt gebildet wird: 0 2 3 2 3 1 2 3 4. 2 = 0 2 3 2 3 1 2 3 4gibt 0 1 0 1 0 0 1 0 0zum Beispiel. Dies ist ähnlich wie bei einem String: 'a'='abcadcadda'nicht nur zurückkehren 0, gibt sie 1 0 0 1 0 0 1 0 0 1(diese hochgerechnet werden kann bedeuten , 0mit */, was im Grunde bedeutet all) . In diesem Fall jedoch ist dieses Verhalten ausgezeichnet, da wir eine Reihe von Einsen und Nullen werden sollen, oder wahr und falsch. Da J bools ist 1 und 0führt dies in einer Reihe von 1‚s und0's (Es handelt sich nicht um Zeichenfolgen, und jedes andere Zeichen als das 1würde ebenfalls zu 0diesem Array führen.) Dies muss nicht gedruckt werden: J druckt automatisch das Ergebnis eines Ausdrucks. Ich hoffe, dies war eine angemessene Erklärung. Wenn nicht, fragen Sie bitte nach etwas, das in den Kommentaren noch nicht klar ist. Diese Antwort hätte auch '0'&=(oder =&'0') sein können, aber ich fand das b='0'klarer.


1
Ich habe es mit J. versucht. Vermutlich habe ich keine guten Dokumente gefunden. Hier hast du eine +1, wenn du ein Verrückter bist.
Siehe auch

1
Und aus diesem Grund werde ich J.
Qix am

2
@Qix So unleserlich J auch ist, für mich ergibt dies einen Sinn, und andere Sprachen mit Operatoren, die einen Vektor LHS und einen Skalar RHS verwenden, verhalten sich ähnlich.
HDV

1
Was? Es gibt nicht das richtige Ergebnis zurück, oder? Das Ergebnis sollte eine Textzeichenfolge (ohne Leerzeichen) sein, aber mit meinen begrenzten Kenntnissen über J wird dies meiner Meinung nach eine Boolesche Liste mit der Anzeigeform 0 1 0 1 0 ...
Adám

4
Dies ist nicht zulässig, da Sie nicht davon ausgehen können, dass die Eingabe in einer bestimmten Variablen gespeichert ist. =&'0'funktioniert für die gleiche Anzahl von Bytes.
Esolanging Fruit

43

GolfScript , 5 Bytes

{1^}%

Probieren Sie es online aus.

Wie es funktioniert

  • GolfScript liest die gesamte Eingabe von STDIN und platziert sie als Zeichenfolge auf dem Stapel.

  • {}% Durchläuft alle Zeichen in der Zeichenfolge und führt den Codeblock für alle aus.

  • 1^ Berechnet das exklusive ODER der Zeichen des ASCII-Codes mit 1. "0" entspricht dem ASCII-Code 48, "1" dem ASCII-Code 49.

    Seit 48 ^ 1 = 49und 49 ^ 1 = 48werden 0en zu Einsen und 1en zu Nullen.

  • Anschließend druckt GolfScript die geänderte Zeichenfolge.


6
Warten Sie, Golfscript ?
ToonAlfrink

Ich hatte deine Frage falsch interpretiert. Jetzt behoben.
Dennis

1
@tolos: Ich habe meine Antwort bearbeitet.
Dennis

5
@ToonAlfrink Golfsprachen wie GolfScript werden bei allen Herausforderungen akzeptiert, sofern sie für allgemeine Zwecke gedacht sind und nicht für bestimmte Herausforderungen entwickelt wurden.
kitcar2000

4
@ Kitcar2000 Ich glaube, er war mehr überrascht, dass eine solche Sprache existierte, als dass jemand schockierte, der es wagte, GolfScript in einer Code-Golf-Frage zu verwenden;)
Chris Cirefice

35

CJam - 4

q1f^

Diese xor jedes Zeichen mit 1.
Im Gegensatz zu der anderen CJam-Antwort gehe ich nicht davon aus, dass die Eingabe bereits auf dem Stapel ist.

Versuchen Sie es unter http://cjam.aditsu.net/


2
Also das ist , wie Sie verwenden f.
Dennis

@ Tennis In der Tat. Sie können das sf-Forum verwenden, um Fragen zu stellen, btw :)
aditsu

30

x86-Maschinencode unter DOS - 14 13 11 Bytes

Nun, es wurde wieder kürzer! Nachdem ich eine Lösung für eine nicht verwandte Herausforderung geschrieben hatte , bemerkte ich, dass derselbe Trick auch hier angewendet werden konnte. Auf geht's:

00000000  b4 08 cd 21 35 01 0a 86  c2 eb f7                 |...!5......|
0000000b

Kommentierte Versammlung:

    org 100h

section .text

start:
    mov ah,8        ; start with "read character with no echo"
lop:
    ; this loop runs twice per character read; first with ah=8,
    ; so "read character with no echo", then with ah=2, so
    ; "write character"; the switch is performed by the xor below
    int 21h         ; perform syscall
    ; ah is the syscall number; xor with 0x0a changes 8 to 2 and
    ; viceversa (so, switch read <=> write)
    ; al is the read character (when we did read); xor the low
    ; bit to change 0 to 1 and reverse
    xor ax,0x0a01
    mov dl,al       ; put the read (and inverted character) in dl,
                    ; where syscall 2 looks for the character to print
    jmp lop         ; loop

Vorherige Lösung - 13 Bytes

Ich denke, es wird nicht viel kürzer.Eigentlich war es so! Vielen Dank an @ninjalj für das Abschneiden eines weiteren Bytes.

00000000  b4 08 cd 21 34 01 92 b4  02 cd 21 eb f3           |...!4.....!..|
0000000d

Diese Version bietet erweiterte Interaktivität ™ - nachdem sie über die Befehlszeile ausgeführt wurde, werden die "invertierten" Zeichen ausgespuckt, solange Sie die Eingabeziffern eingeben (die nicht wiedergegeben werden). Zum Verlassen drücken Sie einfach Strg-C.

Im Gegensatz zur vorherigen Lösung treten bei der Ausführung von DosBox einige Probleme auf. Da DosBox Strg-C nicht korrekt unterstützt , müssen Sie das DosBox-Fenster schließen, wenn Sie das Programm beenden möchten. In einer VM mit DOS 6.0 wird es stattdessen wie beabsichtigt ausgeführt.

NASM-Quelle:

org 100h

section .text

start:
    mov ah,8
    int 21h
    xor al,1
    xchg dx,ax
    mov ah,2
    int 21h
    jmp start

Alte Lösung - 27 25 22 Bytes

Dies akzeptierte seine Eingabe von der Kommandozeile; Läuft reibungslos als .COM-Datei in DosBox.

00000000  bb 01 00 b4 02 8a 97 81  00 80 f2 01 cd 21 43 3a  |.............!C:|
00000010  1e 80 00 7c f0 c3                                 |...|..|

NASM-Eingabe:

    org 100h

section .text

start:
    mov bx, 1
    mov ah, 2
loop:
    mov dl, byte[bx+81h]
    xor dl, 1
    int 21h
    inc bx
    cmp bl, byte[80h]
    jl loop
exit:
    ret

2
+1 für Code verstehen wohl nicht viele.
Knerd

1
xchg dx,axist 1 Byte kürzer alsmov dl,al
ninjalj

@ ninjalj: woa, danke! Es ist doch kürzer geworden!
Matteo Italia

26

Bash + Coreutils, 8 Bytes

tr 01 10

Übernimmt die Eingabe von STDIN.


Oder

sed, 8 bytes

y/01/10/

2
Ich habe vor kurzem eine Golfbibliothek / einen Alias ​​für Bash github.com/professorfish/bash-shelf erstellt . Sie können eine Saibling damit rasieren:y 01 10

1
Wo ist BASH hier involviert? Was ist BASH-spezifisch? Jede Shell kann anrufen tr...
Yeti

1
@yeti Nicht jede Shell ruft Befehle wie bash oder zsh auf. In einigen Shells ist nur dieser Code ein Syntaxfehler
mniip

5
Es ist wahrscheinlich sicher anzunehmen, dass "Shell" hier "POSIX-kompatible Shell" bedeutet ...
FireFly

@professorfish Sie rasieren ein Zeichen ab, fügen dann aber 48 hinzu, indem Sie die Funktion einschließen. Wie ist das ein Gewinn?
Steven Penny

20

CJam , 4 Bytes

:~:!

Angenommen, die ursprüngliche Zeichenfolge befindet sich bereits auf dem Stapel. Druckt die geänderte Zeichenfolge.

Probieren Sie es online aus, indem Sie den folgenden Code einfügen :

"10101110101010010100010001010110101001010":~:!

Wie es funktioniert

  • :~wertet jedes Zeichen des Strings aus, dh es ersetzt das Zeichen 0 durch die Ganzzahl 0.

  • :!berechnet das logische NICHT jeder ganzen Zahl. Dies macht aus Nullen Einsen und aus Einsen Nullen.


19

Brainfuck ( 70 71)

>,[>,]<[<]>[<+++++++[>-------<-]<+>>[++<]<[>]++++++++[>++++++<-]>.[-]>]

Erläuterung:

>,[>,]                       Read characters until there are none left.
<[<]                         Return to start
>[<                          Loop as long as there are characters to invert
  +++++++[>-------<-]        Subtract 49 (ASCII value of 1)
  >[++<]                     If not 0, add 2
  +++[<++++>-]<[>>++++<<-]>> Add 48
  .                          Print
  [-]                        Set current cell to 0
>]                           Loop

1
++++++++ [<++++++> -] warum nicht für 48? 8 * 6 vs. 4 * 4 * 3
Cruncher

@Cruncher Hinzugefügt.
kitcar2000

Warum wurde es länger? liegt das an der "fehlerbehebung"?
Cruncher

1
@Cruncher Ja, ich hatte einen Fehler zu beheben , wo sie ausgeben würde afür 11.
kitcar2000


11

Pfannkuchenstapel , 532 Bytes

Put this tasty pancake on top!
[]
Put this delicious pancake on top!
[#]
Put this  pancake on top!
How about a hotcake?
If the pancake is tasty, go over to "#".
Eat all of the pancakes!
Put this supercalifragilisticexpialidociouseventhoughtheso pancake on top!
Flip the pancakes on top!
Take from the top pancakes!
Flip the pancakes on top!
Take from the top pancakes!
Put this supercalifragilisticexpialidociouseventhoughthes pancake on top!
Put the top pancakes together!
Show me a pancake!
If the pancake is tasty, go over to "".

Es wird davon ausgegangen, dass die Eingabe durch ein Nullzeichen abgeschlossen wird. Die Strategie ist wie folgt:

  • Nehmen Sie ein Zeichen der Eingabe
  • Subtrahieren Sie den ASCII-Wert 1davon.
  • Subtrahiere das von 0(und gib ein 1wenn wir hatten 0oder ein 0wenn wir hatten 1)
  • Addieren Sie den ASCII-Wert von 0dazu
  • Zeichen drucken
  • Wiederholen

10

C: 29

i(char*s){*s^=*s?i(s+1),1:0;}

Probieren Sie es hier online aus .

Vielen Dank, dass Sie auf den XOR-Trick hingewiesen haben, Dennis.


8
Einfacher und kürzer:i(char*s){while(*s)*s++^=1;}
edc65

1
Danke, @ edc65! Ich werde das jedoch nicht verwenden, da es sich eher um eine iterative als um eine rekursive Lösung handelt. Ich würde es nicht würdigen wollen. Es ist erwähnenswert, dass Sie whiledurch ein forStandbild mit einer Länge von 28 Zeichen ersetzen .
Millinon

6
Wie Sie es vorziehen. Eine rekursive Lösung wird nicht angefordert, und meiner Meinung nach ist eine iterative Lösung immer besser als eine rekursive. Viel Spaß beim Anwenden dieses rekursiven Aufrufs auf eine 10-KB-Zeichenfolge.
Edc65

1
Da jeder Aufruf mit Ausnahme des letzten einen rekursiven Tail-Aufruf darstellt, wette ich, dass ein Compiler ihn in eine Schleife konvertiert, um den Stack-Frame wiederzuverwenden.
Millinon

1
@millinon Proof!
deed02392

9

Python 2.7 - 34 *

Oh, wie viel saugt dieser erste. Ziemlich hässlich, das ist. 63 Zeichen.

print''.join([bin(~0)[3:] if x == '0' else bin(~1)[4:] for x in ''])

Dieser ist ein bisschen besser, aber immer noch nicht so schick. 44 Zeichen.

print''.join([str(int(not(int(x)))) for x in ''])

Da wird int(x) and 1zurückgegeben, int(x)wenn es nicht 0 ist und sonst False. Die Lösung kann weiter auf 36 Zeichen reduziert werden.

print''.join([str(1-int(x)) for x in ''])

Da join()ein Generator benötigt, können die Halterungen entfernt werden. 32 Zeichen.

print''.join(str(1-int(x))for x in'')

Und Backticks können anstelle von verwendet werden str()

print''.join(`1-int(x)`for x in'')

Reduziert von 34 auf 44 dank Zeigern von @TheRare

In Python ist es schwierig, das eigene Komplement zu finden, da bin(-int)-0bxxx zurückgegeben wird.


2
Ya'know,(int(x) and 1) == int(x)
seequ

@ TheRare habe ich nicht, danke dafür :)
Bassem

1
Für den Satz: Null ist falsch und ungleich Null ist wahr. Für jede Art von Sequenz (Liste, Zeichenfolge ...) gilt dieselbe Regel, die jedoch anhand der Länge der Sequenz überprüft wird. So '' == Falseund'hi' == True
siehe auch

1
Scheint als hättest du ein paar Leerzeichen verpasst. Außerdem können Backticks verwendet werden, um repr () zu ersetzen. ''.join(`1-int(x)`for x in'')
Siehe auch

1
Fyi, repr(x)für x <maxint ist gleichstr(x)
siehequ

7

Perl, 9 Zeichen

'y/10/01/'

Das neunte Zeichen ist das 'p'-Flag

Verwendungszweck:

$ echo '10101001' | perl -pe 'y/10/01/'

2
funktioniert auch als sed-Skript, y/10/01/aber ein Zeichen kürzer, weil es keine Flags benötigt

4
Sie brauchen hier keine einfachen Anführungszeichen.
Konrad Borowski

7

Javascript ( ES6 ) 36

alert(prompt().replace(/./g,x=>x^1))

Angenommen s, Sie geben s.replace(/./g,x=>x^1)22 Zeichen ein.
Oriol

2
Ich mag es tatsächlich auszugeben und einzugeben.
nderscore

@nderscore Sparen Sie 2 Zeichen:p=prompt(p().replace(/./g,x=>x^1))
Gaurang Tandon

@GaurangTandon müsste es sein (p=prompt)(p().replace(/./g,x=>x^1))und das ist die gleiche Länge.
Nderscore

@nderscore Ich dachte auch, dass es so ist, aber seltsamerweise funktionierte es auch ohne die Klammer.
Gaurang Tandon

7

Labyrinth , 6 Bytes

(Labyrinth ist neuer als diese Herausforderung, daher konkurriert diese Antwort nicht - nicht, dass sie sowieso gewinnt ...)

1,
.$@

In diesem Code wird davon ausgegangen, dass STDIN nur die Ziffern enthält (insbesondere keine abschließenden Zeilenumbrüche).

Der Anweisungszeiger (IP) beginnt in der oberen linken Ecke und geht nach rechts. Während es zu lesende Ziffern gibt, durchläuft es den linken 2x2-Block in einer engen Schleife: 11 drücken, ,eine Ziffer lesen, $mit 1 XOR-verknüpft, um das letzte Bit .umzuschalten, das Ergebnis auszudrucken. Die IP nimmt diese Schleife, weil die Spitze des Stapels nach dem XOR positiv ist, so dass es eine Rechtskurve dauert. Wenn wir EOF drücken, ,kehren wir -1stattdessen zurück. Dann gibt das XOR nach -2und mit diesem negativen Wert biegt die IP nach links ab @und das Programm endet.

Diese Lösung sollte für Labyrinth optimal sein: Sie benötigen ,und .für eine E / A-Schleife und @zum Beenden des Programms. Sie benötigen mindestens zwei Zeichen (hier 1und $), um das letzte Bit umzuschalten. Und Sie benötigen mindestens eine neue Zeile für eine Schleife, die beendet werden kann.

Es sei denn ... wenn wir STDERR ignorieren, dh das Beenden mit einem Fehler erlauben, können wir das speichern @und wir brauchen auch keine Möglichkeit, zwischen zwei Pfaden umzuschalten. Wir lesen und drucken einfach weiter, bis wir versehentlich versuchen, einen negativen Wert (das -2) zu drucken . Dies ermöglicht mindestens zwei 5-Byte-Lösungen:

1,
.$
,_1$.



4

Python 2.x - 44 Bytes

print''.join(`1-int(x)`for x in raw_input())

Warum es komplexer machen oder einige betrügerische Variablen verwenden?


Es ist möglich , einige zusätzliche Zeichen wie diese zu speichern: print''.join('1-int(x)'for x in'input()'). Ich konnte die Backticks im Kommentarcode nicht finden, also ersetzte ich sie durch '.
Willem

@willem Zum späteren Nachschlagen können Sie sie mit einem Backslash versehen: `a\`b`-> a`b.
nyuszika7h

@willem Das funktioniert nicht für Eingaben, die mit 0 beginnen, oder Eingaben, die größer als maxint sind (in base10).
Siehe auch

Danke @ nyuszika7h und habe nicht über diese Fälle nachgedacht TheRare, so ist Ihre Lösung gut
Willem

@willem Ganz einfach, solche Sachen zu vergessen. :)
Siehe auch

4

R, 27 Zeichen

chartr("01","10",scan(,""))

Verwendungszweck:

> chartr("01","10",scan(,""))
1: 10101110101010010100010001010110101001010
2: 
Read 1 item
[1] "01010001010101101011101110101001010110101"



3

TI-BASIC, 7 Bytes

Dies ist eine Funktion, die eine Binärzeichenfolge (Through Ans) als Eingabe verwendet und die Ausgabe wie angegeben als invertierte (nicht umgekehrte) Zeichenfolge zurückgibt. Für weitere Hilfe können Sie not(die Listenanwendung im TI-BASIC-Wiki durchlesen. Ich benutze die kompilierte Version, weil sie kleiner ist:

»*r>Õ¸r

In hex:

BB 2A 72 3E D5 B8 72

Erläuterung

»*r - Funktionseingabe als String übernehmen und in Liste konvertieren

> - Geben Sie die Liste an die nächsten Bediener weiter

Õ¸r - Kehrt die Liste um


Was sind all die Leerzeichen am Ende von »*r>Õ¸r ?
Kitcar2000

@ kitcar2000 Hoppla, danach hatte ich das HEX. Aber nachdem ich es verschoben habe, habe ich vergessen, die Leerzeichen zu entfernen ... Ich habe es jetzt getan.
Timtech

Es sollte nützlich sein, Folgendes zu beachten: 1. Auf dem Taschenrechner wird dies angezeigt als expr(Ans:Returnnot(Ans; 2. Da die Zeichenfolge nicht durch Kommas getrennt ist und nicht mit einem beginnt {, wird sie zu einer Ganzzahl wie 1000010011 und nicht zu einer Liste ausgewertet. 3. Returnfunktioniert nicht so, wie Sie es geschrieben haben; 4. Dies gibt die Ausgabe als Liste und nicht als Zeichenfolge aus.
Lirtosiast

3

Haskell, 22 Bytes

map(\c->"10"!!read[c])

Der Mangel an Haskell-Lösungen für diese Herausforderung hat mich überrascht. Es wird zu einer Funktion ausgewertet, die eine Zeichenfolge akzeptiert und deren Inverse zurückgibt.

Erläuterung

Hier ist nichts Besonderes.

map(\c->             )  -- For each character c in the input string:
                  [c]   -- wrap c into a string,
              read      -- convert to integer,
        "10"!!          -- and index the string "10" with it.

3

Befunge 93, 25 Bytes

0>~1+:#v_$>:#,_@
 ^   -1<

Angenommen, leerer Stapel und EOF lesen beide -1.

0 drückt eine \ 0 als Null-Terminator

>~1+:#v_ ist eine Eingangsschleife, liest ASCII, addiert 1, prüft auf EOF + 1 = 0,

^ -1< sonst subtrahiert 1 und belässt den gepushten ASCII-Wert auf dem Stapel.

$>:#,_@ Legt die zusätzliche Kopie von Null oben auf dem Stapel ab und druckt die Binärzeichenfolge von oben nach unten

Wenn der leere Stapel 0 lautet, speichern Sie 2 Bytes mit

>~:1+#v_$>:#,_@
^   -1<

Eine Version von ungefähr 15 Bytes ist mit demselben Algorithmus möglich, wenn EOF = 0 ist, aber ich habe eine solche Implementierung nicht zum Testen zur Hand.


3

Javascript ES6, 26 Zeichen

s=>s.replace(/\d/g,x=>x^1)

3
Warum / \ d / g nicht /./g
l4m2


2

Python3, 39

Methinks Python ist dafür nicht die beste Sprache. :)

for i in input():print(1-int(i),end='')

Wenn Sie nach der Ausgabe eine neue Zeile haben möchten, finden Sie hier eine 43-stellige Alternative:

print(''.join("01"[i<"1"]for i in input()))

Code wird funktionieren ohne das end=''nur ein ,Wille zu tun :) - es sei denn, Sie kümmern sich darum, dass es keine Leerzeichen gibt
Harry Beadle

@BritishColour, nein, das ist Python2. Für die printFunktion von Python3 muss der endParameter angepasst werden, um eine neue Zeile am Ende jedes Druckvorgangs zu unterdrücken. Gemäß der OP-Spezifikation ist es mir auch wichtig, dass keine Leerzeichen vorhanden sind. :) Danke für den Kommentar!
DLosc

Oh, cool, das wusste ich nicht! Ich arbeite hauptsächlich in 2.7: /
Harry Beadle

2

J - 11 Zeichen

Boolesche Werte in J werden als Ganzzahlen dargestellt 0und 1sind natürlich auch gültige Indizes für Arrays (in diesem Fall das 2-Zeichen-Array '01').

'01'{~'0'&=

Ich denke, diese Antwort ist technisch korrekter als die oberste J-Antwort, die ein boolesches Array anstelle eines Strings ausgibt.
Gar

Ich habe die bestplatzierte J-Lösung beim Posten nicht bemerkt (ich weiß nicht, wie ich sie verpasst habe, aber ich tat es). Um dieser Lösung gerecht zu werden, heißt es ausdrücklich: "Das tut nicht das, was die anderen Lösungen tun." Übrigens, eine andere Möglichkeit, diese (wörtliche Ausgabe-) Lösung in 11 Zeichen auszudrücken, ist [:, ": @ = & '' 0 ''.
Dan Bron

Hallo, danke für einen weiteren Code! Ich werde mehr J von euch lernen. Über diese Aussage, ich denke, er bezog sich auf das Gleichheitszeichen, dass es jedes Element anstelle der Zuordnung vergleicht.
Gar

2

C # 131 Bytes

Ein bisschen zu spät zur Party, aber hier ist meins. :)

using System;class R{static void Main(string[]a){foreach(var v in a[0].ToCharArray()){Console.Write(int.Parse(v.ToString())^1);}}}

2

MATLAB, 13 Bytes

@(x)[97-x '']

Rufen Sie nach dem Ausführen des obigen Befehls einfach die Funktion mit Ihrer Eingabezeichenfolge auf, um die invertierte Zeichenfolge abzurufen. Zum Beispiel läuft:

ans('10101110101010010100010001010110101001010')

druckt:

01010001010101101011101110101001010110101

2

BotEngine , 4x8 = 32

Nicht konkurrierend, da die Sprache die Frage datiert.

Iv2 0 12
 >e>S SS
    e1e0
   ^< <P

Mit Hervorhebung:

Bildbeschreibung hier eingeben

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.