Dolmetscher sprechen

10

"Talk" ist eine baroquifizierte akkumulatorbasierte Sprache, die als Antwort auf Dennis ' Zitat auf talk.tryitonline.net erstellt wird.

Waiting for someone to create an esolang called talk. 

. Die "Talk" -Sprache hat 4 Befehle:

  • 00 Wenn der Akku 0 ist, setzen Sie den Akku auf 0.
  • 01 Wenn der Akku 0 ist, setzen Sie den Akku auf 1.
  • 10 Wenn der Akku 1 ist, setzen Sie den Akku auf 0.
  • 11 Wenn der Akku 1 ist, setzen Sie den Akku auf 1.

Eingang:

  • Die Eingabe kann über jede akzeptable Eingabemethode nach unseren Standard-E / A-Regeln erfolgen.

  • Es gibt zwei Eingänge, den anfänglichen Akkumulatorwert und das Programm. Sie können diese beiden Eingaben zu einer Eingabe zusammenführen oder Ihre Eingabe in gültige Befehle aufteilen (z. B. als Liste verwenden, z. B. [00, 01, 00]), wenn Sie möchten.

Ausgabe:

  • Am Ende einer Befehlsausführung wird der Akkumulator implizit ausgegeben.

Regeln:

  • Die Eingabe kann eine einzelne Zeichenfolge oder Zeichenliste sein.
  • Da dies ist, gewinnt die kürzeste Antwort in Bytes.
  • Wir nehmen Ziffern oder Zeichenfolgen / Zeichen.

    Testfälle:

0 0001111101 -> 1
0 000100 -> 1
0 11001000 -> 0

Bestenlisten

Hier ist ein Stack-Snippet, mit dem Sie sowohl eine regelmäßige Rangliste als auch eine Übersicht der Gewinner nach Sprache erstellen können.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift unter Verwendung der folgenden Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihrer Einreichung? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Wenn Sie dort mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder Sie die Strafen für Dolmetscherflaggen separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

# Perl, 43 + 2 (-p flag) = 45 bytes

Sie können den Sprachnamen auch zu einem Link machen, der dann im Leaderboard-Snippet angezeigt wird:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


quelle
3
Es gibt also zwei Eingänge, die Befehlsfolge und den anfänglichen Akkumulatorwert?
xnor
4
Einige Testfälle, die den Akku nicht wechseln, mit 1 im Akku beginnen oder keine Anweisungen haben, wären gut
Jo King
8
Kann Talk wirklich als Programmiersprache angesehen werden ?
Luis Mendo
8
@A_ Dieser Kommentar war wahrscheinlich als Witz gedacht. Früher hatte eine Sprache namens Lang eine URL lang.tryitonline.net(jetzt ist es tio.run/#lang). Eine Sprache namens Talk würde also zu Verwechslungen mit der URL des kürzlich erstellten Chatrooms führen, nämlichtalk.tryitonline.net
Luis Mendo,
7
Bitte ändern Sie in Zukunft keine E / A mehr, nachdem eine Reihe von Antworten veröffentlicht wurden. Ich bin heute zurückgekommen, und wenn zulässige Eingaben zulässig sind, ist dies eine ganz andere Herausforderung als die, die ich beantwortet habe .
GammaFunction

Antworten:

21

Gelee , 3 Bytes

y@/

Die Eingabe ist eine einzelne Liste: der Akkumulator, gefolgt von den Paaren.

Probieren Sie es online aus!

Wie es funktioniert

Das yAtom führt eine Transliteration durch; [a, b] yc ersetzt a durch b , gibt also b zurück, wenn a = c und c, wenn a ≠ c .

y@/Faltet / reduziert die Eingabe durch yvertauschte Argumente und führt eine Transliteration pro Paar durch.

Dennis
quelle
13
Dies ist die einzige Jelly-Antwort, die ich bisher gesehen habe und die nur ASCII-Zeichen verwendet.
2
Es gab einige. Schau ma, kein Unicode!
Dennis
21

Python 3 , 43 Bytes

lambda s:re.sub("00|11","",s)[-1]
import re

Probieren Sie es online aus!

Die Funktion verwendet eine einzelne Zeichenfolge als Eingabe, wobei das erste Zeichen der Anfangszustand ist und der Rest der Zeichenfolge die Befehle darstellt. Diese Lösung kann problemlos in andere Sprachen portiert werden, die reguläre Ausdrücke besser unterstützen.

Der schwierige Teil besteht darin, zu beweisen, dass die Lösung das richtige Ergebnis liefert. Um dies zu sehen, benötigen wir eine gründliche Analyse der Befehle. Erstens können wir sehen, dass die Befehle die folgenden Eigenschaften haben:

  • Eigenschaft (1) : Befehle 00und 11Beibehaltung des Akkumulatorstatus.
  • Eigenschaft (2) : Befehle 01und 10machen den Akkumulatorstatus unabhängig vom ursprünglichen Status mit dem zweiten Bit identisch.

Daher ist der endgültige Akkumulatorzustand:

  • Fall 1 : Wenn kein 01oder ein 10Befehl vorhanden ist, entspricht der Endzustand dem Ausgangszustand.
  • Fall 2 : Andernfalls das letzte Bit des letzten 10oder 01Befehls.

Als nächstes werden wir zeigen, dass die Lösung in beiden Fällen das richtige Ergebnis liefert. Wir werden die Aussage für den Endzustand beweisen 0und der Endzustand von 1kann analog bewiesen werden. Wenn der Endzustand 0der Fall ist, erfolgt die Eingabe in einer der folgenden Formen:

  • ^0{2k+1}11(11|00)*

    Für Fall 1 muss die Eingabezeichenfolge smit 2k+10s beginnen, gefolgt von 11und 00Befehlen. Das Eliminieren von 00s und 11s ergibt eine einzige 0, die der Endzustand ist.

  • .+10{2k+1}11(11|00)*

    In Fall 2 endet die Eingabezeichenfolge mit einem 10Befehl, gefolgt von null oder mehr 00und 11s. Dieses Muster entspricht a 1gefolgt von 2k+10s und dann null oder mehr 11s und 00s. Durch Eliminieren von 00s und 11s bleibt die letzte der 2k+1Nullen am Ende der Zeichenfolge zurück, die den Endzustand darstellt.

Basierend auf all dem oben Gesagten ist nach dem gleichzeitigen Eliminieren von 00s und 11s in einem einzigen Durchgang ( 01001ist ein Gegenbeispiel, wenn 00in einem Durchgang und dann 11in einem anderen Durchgang eliminiert wird ) sdas letzte Zeichen der Endzustand. Damit ist die Richtigkeit der Lösung bewiesen.

Joel
quelle
Willkommen bei PPCG! Hervorragende Antwort und ein schöner formaler Beweis dafür!
GammaFunction
3
Vielen Dank. Ich bin der Meinung, dass die Leute an einer so einfachen Lösung zweifeln können, dass sie auf den ersten Blick das richtige Ergebnis liefert. Dafür muss also ein Beweis erbracht werden.
Joel
9

Perl 6 , 17 Bytes

{m/.)>[(.)$0]*$/}

Probieren Sie es online aus!

Nutzt „Sie können fusionieren diese beiden Eingänge in einen Eingang , wenn Sie wie“ durch die Eingabe als Akkumulatorwert unter verkettet mit den Befehlen zB 1,[00,11]ist 10011. Wenn dies nicht in Ordnung ist, sind es nur 5 zusätzliche Bytes, um es als zu nehmen f(accumulator, commands). Gibt ein Übereinstimmungsobjekt zurück, das zu einer Zeichenfolge gezwungen werden kann.

Erläuterung:

{                }  # Anonymous code block
 m/             /   # Find the first match from the input
   .)>              # Capture a number
      [     ]*      # Followed by any number of
       (.)$0        # Pairs of identical characters
              $     # Ending the string

Grundsätzlich funktioniert dies, weil die Befehle 00und 11buchstäblich nichts bewirken, während die Befehle 01und 10den Akkumulator nur auf die zweite Ziffer des Befehls setzen. Wenn keine Befehle vorhanden sind, wird stattdessen der Anfangswert des Akkumulators verwendet.

Scherzen
quelle
6

Zsh , 33 Bytes

Die Zeichenliste wird als Argumente übergeben, der Anfangswert des Akkumulators als stdin.

read a
for x y;a=$[x^a?a:y]
<<<$a

Probieren Sie es online aus!


39 Bytes : Wenn die Befehle eine einzelne Zeichenfolge sein müssen

Eingabe ist accumulator commandsals Argumente.

for x y (${(s::)2})1=$[x^$1?$1:y]
<<<$1

Probieren Sie es online aus!


Zum Spaß hier ein rekursiver 50-Byte -Einzeiler ( TIO ):

<<<${${2+`f $[$1^${2[1]}?$1:${2[2]}] ${2:2}`}:-$1}
GammaFunktion
quelle
6

Python 3 , 52 Bytes

f=lambda a,s:s and f([s[1],a][s[0]==s[1]],s[2:])or a

Probieren Sie es online aus!

Inkonsistenter Rückgabetyp dank Chas Brown behoben

Nimmt die Eingabe als zwei Zeichenfolgen auf. der Akku und der Code.

negative sieben
quelle
Oh nein, das war schnell.
HighlyRadioactive
1
Schön, aber es hat dieses potenzielle Problem - f(1,'11')==f(1,'01')ist False; es gibt manchmal ein intund manchmal ein str. Geben Sie also an, ob die Eingabe als Zeichenfolge verwendet werden soll.
Chas Brown
@ChasBrown Guter Anruf, das ist viel einfacher als das, worüber ich nachgedacht habe.
negative sieben
Schön, aber da Ihre Funktion rekursiv ist, kann sie nicht anonym sein. Es sollte 52 Bytes sein .
Jitse
5

Brachylog , 11 9 Bytes

tġ₂≠ˢtt|h

Probieren Sie es online aus!

Da ich lange genug vergessen habe, den Akku nach jedem Befehl zu drucken , habe ich eine deutlich weniger naive Lösung formuliert, die sich von Jo Kings Perl-Antwort inspirieren lässt.

       |     The output is
     tt      the last element of the last element of
t            the last element of the input
 ġ₂          split into length-2 slices
   ≠ˢ        with equal pairs removed.
       |     If there is no such element, the input
        h    's first element is the output.

Alte Lösung:

Brachylog , 18 16 Bytes

ġ₂ᵗc{th~h?tt|h}ˡ

Probieren Sie es online aus!

-2 Bytes vom Ändern des Eingabeformats.

Nicht verwandte Zeichenfolge
quelle
5

JavaScript (ES6), 27 Byte

Nimmt die Eingabe als (a)(code), wobei Code eine Liste von 2-Bit-Ganzzahlen ist.

a=>c=>c.map(x=>a^=x==a+1)|a

Probieren Sie es online aus!


JavaScript (ES6),  47  40 Byte

Nimmt die Eingabe als (a)(code), wobei Code eine Zeichenfolge ist.

a=>c=>c.replace(/../g,x=>a^=x%4==a+1)&&a

Probieren Sie es online aus!

Wie?

(a=0,x=012)(a=1,x=102)

  a | x (bin) | int(x) % 4 | a + 1 | equal?
----+---------+------------+-------+--------
  0 |   "00"  |  0 % 4 = 0 |   1   |   N
  1 |   "00"  |  0 % 4 = 0 |   2   |   N
  0 |   "01"  |  1 % 4 = 1 |   1   |   Y
  1 |   "01"  |  1 % 4 = 1 |   2   |   N
  0 |   "10"  | 10 % 4 = 2 |   1   |   N
  1 |   "10"  | 10 % 4 = 2 |   2   |   Y
  0 |   "11"  | 11 % 4 = 3 |   1   |   N
  1 |   "11"  | 11 % 4 = 3 |   2   |   N
Arnauld
quelle
4

sed- E, 26 19 Bytes

Eine satte -7 Bytes von @Cowsquack durch Realisieren, dass alle Paare entfernt werden, funktioniert ebenfalls.

s/(.)\1//g
s/.*\B//

Nimmt Eingaben auf stdin zusammen. Inspiriert von Jo Kings Perl-Antwort . Nachlaufende Paare entfernen Entfernen Sie alle Paare und erhalten Sie die letzte Ziffer.

Probieren Sie es online aus! Probieren Sie es online aus!

GammaFunktion
quelle
1
Die letzte Zeile kann einfach sein s/.*\B//, aber wenn Sie den Ansatz leicht ändern, erhalten Sie noch kürzere 19 Bytes. Probieren Sie es online aus!
user41805
1
Huh, ich hätte nicht gedacht, dass s/(.)\1//gdas funktionieren würde, da es das Ende eines Paares und den Anfang des nächsten entfernen könnte, aber es funktioniert immer noch. Ausgezeichnet!
GammaFunction
@GammaFunction s/(.)\1//gentspricht der s/00|11//gin meiner Lösung gezeigten.
Joel
4

Retina 0,8,2 , 18 11 Bytes

(.)\1

!`.$

Probieren Sie es online aus! Link enthält Testfälle. Nimmt verkettete Eingaben entgegen. Dank @CowsQuack wurden 6 Bytes gespart, weil darauf hingewiesen wurde, dass das Entfernen aller doppelten Zeichen und das anschließende Entfernen des letzten verbleibenden Zeichens funktioniert, obwohl der Port von @ JoKings ursprünglicher Antwort auch ohne diesen Trick um 3 Bytes hätte gespielt werden können.

Neil
quelle
12 Bytes Probieren Sie es online aus!
user41805
@Cowsquack D'oh, wenn Sie einmal über das Trennen der Stufen nachgedacht haben, ist das bereits eine 2-Byte-Einsparung, dann ein weiteres Byte, weil Sie es verwenden können !`.$, und dann weitere 4 Bytes, weil Sie sich nicht auf nachfolgende Paare beschränken müssen ...
Neil
4

Python 3 , 38 Bytes

lambda l:[y for*x,y in l if[y]!=x][-1]

Probieren Sie es online aus!

Basierend auf Joels Lösung . Nimmt die Eingabe als Liste des anfänglichen Akkumulatorwerts (Zeichenfolge Länge eins) gefolgt von den Befehlen (Zeichenfolgen Länge zwei). Findet den letzten Befehl mit zwei ungleichen Werten und gibt sein zweites Zeichen aus.

Damit dies auf den anfänglichen Akkumulatorwert fällt, wenn keine solchen Befehle vorhanden sind, machen wir es so, dass die Zeichenfolge mit einem einzelnen Zeichen den Test besteht. Dazu prüfen wir, ob eine Singleton-Liste mit dem letzten Zeichen ungleich einer Liste aller vorhergehenden Zeichen ist, die von einer beliebigen Zeichenfolge der Länge 1 oder 2 mit zwei verschiedenen Zeichen übergeben wird.

xnor
quelle
3

Perl 5 -p , 37 33 Bytes

$\=<>;s/(.)(.)/$\=$2if$\==$1/ge}{

Probieren Sie es online aus!

Die Eingabe besteht aus zwei Zeilen: Die erste Zeile ist die Befehlssequenz, die zweite ist der Akkumulator.

Xcali
quelle
3

Gelee , 8 6 Bytes

EÐḟṪṪo

Probieren Sie es online aus!

-2 Bytes dank Nick Kennedy, der mich über eine Regeländerung informiert hat. (Sein vorgeschlagenes Golfspiel EÐḟFȯṪscheint etwas klüger zu sein, hat aber die gleiche Länge wie meine vorherige Lösung minus s2.) Das Eingabeformat verwendet die Befehle jetzt als Liste von Zeichenfolgen mit zwei Zeichen, aber die Testfußzeile wird aus Bequemlichkeitsgründen aus dem alten Format übersetzt.

Übersetzt aus meiner neueren Brachylog-Lösung.

Alte Version:

Gelee , 13 Bytes

ḢẎ⁼⁹a⁸o
s2ç@ƒ

Probieren Sie es online aus!

Ich bin nicht 100% sicher, ob dies korrekt ist, aber es gelingt in allen drei Testfällen. Nimmt die Befehle als linkes Argument und den anfänglichen Akkumulator als rechtes Argument.

Nicht verwandte Zeichenfolge
quelle
1
Die Eingabe darf in eine Liste aufgeteilt werden, so dass Sie EÐḟFȯṪmit der Eingabe z [[0,0],[0,1],[1,1],[1,1],[0,1]].
Nick Kennedy
Wow, die Änderungen an der Spezifikation waren wirklich ziemlich groß ...
Unrelated String
3

Haskell , 29 Bytes

Definiert eine unbenannte Funktion in der ersten Zeile mit Typ (Foldable t, Eq b) => b -> t [b] -> b. Für die Zwecke dieses Code-Golfs können wir es so instanziieren, Char -> [String] -> Chardass das erste Argument der Akkumulator und das zweite eine Liste von Zeichenfolgen ist, wobei jede Zeichenfolge ein einzelner Befehl ist.

foldl(#)
a#[x,y]|a==x=y|1>0=a

Probieren Sie es online aus!

Ankh-Morpork
quelle
1
Gleiche Bytezahl, wenn Sie sie in Präfixnotation definieren . Ich kann nicht glauben, dass ich fast die gleiche Antwort zur gleichen Zeit geschrieben habe, sogar einschließlich der Erklärung der
Typensignatur
2

Python, 111 Bytes

def f(a,b):
    c=a
    for i in range(0,len(b)-1,2):
        c=(not b[i])*(c or b[i] or b[i+1]) or c*b[i]*b[i+1]
    return c

Ungolfed. EDIT: AHHH Jemand hat mich geschlagen!

Hochradioaktiv
quelle
2

Haskell , 36 Bytes

f(x:y:s)=f s.last.(:[y|x/=y])
f _=id

Probieren Sie es online aus!

Nimmt die Eingabe so f(string)(char)an, dass das Zeichen der Akkumulator und die Zeichenfolge die Liste der Befehle ist.

Scherzen
quelle
1

Bash , 58 40 Bytes

Fügen Sie ein Byte für ein vollständiges Programm hinzu: Wechseln Sie fzu $0.

(($1=$2-a?a:$3,1))&&f $1 ${@:4}||echo $1

58 Bytes Probieren Sie es online aus!

Das Ternär gibt false zurück, wenn $1es auf gesetzt ist 0, aber das ,1am Ende stellt sicher, dass das Ganze ((expression))true zurückgibt, mit Ausnahme eines Syntaxfehlers.

Wenn alle Argumente verbraucht sind, tritt ein Syntaxfehler auf und die Rekursion endet.


GammaFunktion
quelle
1

Holzkohle , 16 Bytes

F⪪η²F⁼θ§ι⁰≔§ι¹θθ

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Nimmt separate Argumente. Erläuterung:

F⪪η²

Teilen Sie die Anweisungen in Ziffernpaare auf und durchlaufen Sie sie.

F⁼θ§ι⁰

Wenn der Akku gleich der ersten Ziffer ist ...

≔§ι¹θ

... dann weisen Sie ihm die zweite Ziffer zu.

θ

Drucken Sie den Akku am Ende der Schleife.

Neil
quelle
1

Gelee , 7 Bytes

fؽḂ⁹;Ṫ

Ein dyadischer Link, der das Programm als Liste von Ganzzahlen links und den anfänglichen Akkumulator rechts akzeptiert, der eine Ganzzahl ergibt.

Probieren Sie es online aus! Oder sehen Sie sich eine Testsuite an

Jonathan Allan
quelle
Ich entferne die Eingabezuordnung, weil @GammaFunction mir empfohlen hat, dies zu tun.
@A_ ah OK kann nicht auf dem Handy gelöscht werden, muss also später behoben werden
Jonathan Allan
@A_ behoben, um mit 0,1,2,3 zu arbeiten Die nicht zugeordnete Version der Anweisungen als Ziffern ist das in Ordnung?
Jonathan Allan
1
Ja das ist ok.
1

Runenverzauberungen , 28 Bytes

/~@/i~/i<
/=?/~iR:l}i{l1-=?!

Probieren Sie es online aus!

Nimmt die Eingabe als eine Reihe von durch Leerzeichen getrennten Bytes auf (Runic versteht keine Listen). Das erste Byte ist der Anfangszustand und jedes zweite Byte ist das Programm. Es erfolgt keine Prüfung (dh er nimmt nur dann gültig Programme werden als Eingabe gegeben und es ist egal, was Wert verwendet wird , darstellen 0und 1).

Draco18s vertraut SE nicht mehr
quelle
1

x86-Assembly, 33 Byte

Nimmt den anfänglichen Akkumulatorstatus in CL(Ganzzahl 0oder 1) und die Adresse der Befehle als ASCII-Zeichenfolge mit Nullterminierung auf ESI. Lässt den endgültigen Akkumulatorzustand in CL.

Richten Sie die Aufrufanweisung auf Offset 0x1B(Beschriftung interpretin der Erläuterung).

3C 30 74 03 B0 01 C3 30 C0 C3 E8 F1 FF FF FF 38
C8 AC 75 07 E8 E7 FF FF FF 88 C1 AC 84 C0 75 EA
C3

Erläuterung (unter Verwendung der Intel-Syntax):

; function to convert ASCII '1'/'0' into 0 or 1 int values (from AL to AL)
ctob:
        CMP AL, 0x30 ; '0'
        JE .zero
        MOV AL, 1
        RET
        .zero:
        XOR AL, AL
        RET

; interpreting function
        interp_lp:
                CALL ctob     ; convert to number
                CMP AL, CL    ; compare to current accumulator
                LODSB         ; read the next character of the string
                              ; this doesn't affect any flags and we need to do
                              ; it in both cases anyway
                JNE interpret ; if AL != CL (from above, not the new value of AL), skip forward
                CALL ctob     ; convert AL to number
                MOV CL, AL    ; store AL in CL
interpret:      LODSB         ; read the next character of the string
                TEST AL, AL   ; check if it is a zero byte
                JNZ interp_lp ; if not, jump back into the loop
        RET

Fayti1703
quelle
1

Keg , -ir16 Bytes

"(!;½|':"=['_"|_

Probieren Sie es online aus!

Erklärt:

  1. Nimmt die implizite Eingabe und verschiebt den Akkumulatorwert nach rechts nach unten

  2. Wiederholen Sie die folgenden Schritte (Länge des Stapels - 1 geteilt durch 2)

2.1. Schieben Sie den Akku wieder nach oben

2.2. Vergleichen Sie die Gleichheit mit dem ersten Teil des Befehls

2.2.1. Wenn dies der Fall ist, ersetzen Sie den Akku, andernfalls setzen Sie den Ersatz ein

Die Eingabe wird als anfänglicher acc-Wert verwendet, der mit der Quelle verknüpft ist. Z.B

010011000
  • Das erste Zeichen ist acc value
  • Ruhe ist Programm
Lyxal
quelle
0

Kristall , 46 Bytes

Mit Befehlen in einem Array(Tuple(Int32,Int32)), wie z [{0,0}, {0,1}, {0,0}].

def f(s,i);i.map{|c,v|s+=~(s^c)&(s^v)%2};s;end

Probieren Sie es online aus!

Es ist ziemlich einfach in einer besser lesbaren Form zu verstehen:

def f(state, instructions)
  instructions.map do |check, value|
    state += ~(state ^ check) & (state ^ value) % 2
  end
  state
end

Die Funktion durchläuft jeden Befehl und entpackt die Tupelwerte automatisch in cund v. Es setzt dann die statedurch die Formel

state = state + NOT(state XOR check) AND (state XOR value) mod 2

was ich meistens durch Versuch und Irrtum erreicht habe. Sobald alle Befehle verarbeitet wurden, wird der Statuswert zurückgegeben.

Kinxer
quelle
0

C (Klirren) , 68 62 Bytes

t(s,e,a)char*s,*e;{for(;s<e;++s)a=*s++-48^a?a:*s-48;puts(&a);}

Probieren Sie es online aus!

Nimmt einen Zeiger auf den Anfang der Quellzeichenfolge, einen Zeiger auf das Ende der Quellzeichenfolge (start + strlen (start)) und den anfänglichen Akkumulatorwert.

Alte Version (druckt ASCII 48/49 für 0/1):

t(s,e,a)char*s,*e;{for(;s<e;++s)a=*s++-48^a?a:*s-48;putchar(a+48);}
osuka_
quelle