Programm: Dezimal in Binär umrechnen



  • SeppJ schrieb:

    EOP schrieb:

    "10"[ !( ich & 1 << i ) ]
    

    sieht mir schwer nach "ich bin kein Zeh" aus

    Ist es aber. Das ist kein Lambdaausdruck oder was immer man vielleicht auf den ersten Blick denken mag. Das ist ein Zeichenkettenliteral(Arraytyp) direkt gefolgt von einem Elementzugriff auf eben dieses Literal

    Ich wusste nicht, daß sowas in C geht.
    Wiedermal: Man kann immer noch was dazulernen und selbst ich als alter Knochen freue mich darüber. Wobei ich es wohl nicht in der Form verwenden werde, weil zu unoffensichtlich (falls es dieses Wort noch nicht geben sollte, gibt es es ab sofort :)) ist, was gemeint ist.


  • Mod

    EOP schrieb:

    SeppJ schrieb:

    EOP schrieb:

    "10"[ !( ich & 1 << i ) ]
    

    sieht mir schwer nach "ich bin kein Zeh" aus

    Ist es aber. Das ist kein Lambdaausdruck oder was immer man vielleicht auf den ersten Blick denken mag. Das ist ein Zeichenkettenliteral(Arraytyp) direkt gefolgt von einem Elementzugriff auf eben dieses Literal

    Ich wusste nicht, daß sowas in C geht.
    Wiedermal: Man kann immer noch was dazulernen und selbst ich als alter Knochen freue mich darüber.

    Ist doch schön. 👍 Was sagst du denn zu meinem Vorschlag? (Ja, das ist das gesamte Programm!) Oder sind die dort benutzten Tricks ein alter Hut, weil du C im K&R-Stil kennen gelernt hast 😃 ?

    PS: Noch eine kleine Verbesserung, wer braucht schon Schlüsselworte?

    _(I){I?_(I>>1),putchar(48+(I&1)):7;}main(){_(3001);}
    

    So entfällt auch die doofe führende 0, die vorher noch drin war.
    edit: 7 statt 0, zur weiteren Verwirrung des Lesers :p
    edit2: Wieder 1 Zeichen gespart:

    _(I){I?_(I/2),putchar(48+(I&1)):7;}main(){_(3001);}
    

    Überhaupt kann sich ja auch das include<stdio.h> sparen, putchar nimmt schließlich schon int als Argument und Rückgabewert, die implizite Deklaration passt also. Obiges ist also tatsächlich das gesamte Programm



  • @PS ... boah, ich wollts grad posten 🤡

    //edit: zwar länger, aber schöner find ich trotzdem

    o(O){O&&o(O/2),write(1,"01"+(O&1),1);}main(){o(3001);}
    

    50:

    _(I){I&&_(I/2),putchar(48+(I&1));}main(){_(3001);}
    

    48:

    _(I){I&&_(I/2),putchar(48|I&1);}main(){_(3001);}
    

  • Mod

    Swordfish schrieb:

    //edit: zwar länger, aber schöner find ich trotzdem

    o(O){O?o(O/2),write(1,"01"+(O&1),1):2;}main(){o(3001);}
    

    Damit kann der Threadersteller auch mehr lernen, da es auch für andere Basen funktioniert 🕶 :

    o(O){O?o(O/16),putchar("0123456789ABCDEF"[(O%16)]):2;}main(){o(3001);}
    

    Das ist schließlich sogar die kanonische Methode zur Ausgabe in einem bestimmten Stellenwertsystem, also genau das, wonach ursprünglich gefragt war. Bloß ein "bisschen" ungünstig aufgeschrieben.

    Man kann natürlich auch & statt % benutzen, so lange die Basis eine Zweierpotenz ist: "0123456789ABCDEF"[(O&15)] Warum sollte man? Weil man es kann! 🙂

    PS:

    Swordwfish schrieb:

    _(I){I&&_(I/2),putchar(48|I&1);}main(){_(3001);}
    

    😋 Ich wusste doch, da geht noch was! Ich mag das 48|I&1 👍



  • You freak me out!

    Ich bin dann raus aus dem code obfuscation contest. Mein level ist eindeutig zu niedrig.

    Und ja SeppJ, ich hab richtig oldschool-C gelernt. Ich mache alles immer noch q+d; obwohl meistens nicht q aber d. :p



  • und ich wollt grad zu SeppJ sagen, daß wir lieber aufhören sollten, weil sonst EOP nie wieder mit uns spielen mag 🤡

    // Herumlöscherei außerhalb Moderatorenaufgaben ist unfair, cheater! :p


  • Mod

    Swordfish schrieb:

    // Herumlöscherei außerhalb Moderatorenaufgaben ist unfair, cheater! :p

    Eigene Beiträge löschen kann doch jeder, oder? Bin schon lange kein nicht-Moderator mehr gewesen 🙂 . So sieht dann auch keiner, dass meine ^-Variante alles genau falsch rum ausgegeben hat :p . Trotzdem würde ich gerne ^ oder ~ nutzen. Aber die verdammte Operatorpriorität lässt mich elend viele Klammern setzen, damit das Ergebnis stimmt.



  • Mein code ist schon schlimm genug, aber den kann man wenigstens noch nachvollziehen ohne kryptische Konzepte zu kennen. Hoffentlich.

    EDIT:
    Und wenn ich Mod oder gar Global-Mod bin (verkürzt: GoD), dann kann ich fast alles. Zumindest ne Menge.

    Ist Alles nicht so tragisch.



  • Hm. Was muss man für die letzte Version wissen?

    _(I){I&&_(I/2),putchar(48|I&1);}main(){_(3001);}
    

    - implizit int bei Parametern
    - implizit extern returning int bei undeklarierten Funktionen
    - Kommaoperator
    - logische Operatoren (short-circuit evaluation)
    - bitweise Operatoren (inkl. soweit nachdenken, daß gerade Zahlen (48) binär eine 0 am Ende haben 😃 )
    - Operatorprioritäten

    eigentlich alles Basics? 🤡

    SeppJ schrieb:

    Aber die verdammte Operatorpriorität lässt mich elend viele Klammern setzen, damit das Ergebnis stimmt.

    Genau darum hab ich die Richtung aufgegeben.


  • Mod

    Swordfish schrieb:

    eigentlich alles Basics? 🤡

    Ich würde eher sagen: 100% Non-basics, außer I/2 🙂 .



  • Klammern setzen schadet nie. Wenn es auch nur dafür gut ist, die eigenen Gedanken zu sortieren bzw. zu strukturieren oder den code für Andere lesbarer zu machen.



  • Das mit den Klammern würd' ich mir nochmal überlegen: https://www.cise.ufl.edu/~manuel/obfuscate/spinellis 😃



  • Swordfish schrieb:

    Hm. Was muss man für die letzte Version wissen?

    _(I){I&&_(I/2),putchar(48|I&1);}main(){_(3001);}
    

    Hihi, da wird Dulfried einen Riesenspaß haben, daß zu erklären was du um 1/2 2² zusammengebastelt hast.

    Noch eine Frage: was macht die ":2;" hier?

    o(O){O?o(O/2),write(1,"01"+(O&1),1):2;}main(){o(3001);}
    

    Die 2 kapier ich auf Anhieb nicht.



  • EOP schrieb:

    da wird Dulfried einen Riesenspaß haben, daß zu erklären was du um 1/2 2² zusammengebastelt hast.

    Nene, danken muss er schon SeppJ. Er hat den klassischen _(){}main(_();) -ioccc-Weg eingeschlagen. Ich war höchstens Mittäter.

    EOP schrieb:

    Noch eine Frage: was macht die ":2;" hier?

    o(O){O?o(O/2),write(1,"01"+(O&1),1):2;}main(){o(3001);}
    

    garnix 😃



  • Swordfish schrieb:

    garnix 😃

    Fies. Muss mal bei Gelegenheit kucken, wie das der Compiler umsetzt.



  • Hoffentlich nur mit ret .



  • Swordfish schrieb:

    und ich wollt grad zu SeppJ sagen, daß wir lieber aufhören sollten, weil sonst EOP nie wieder mit uns spielen mag 🤡

    Keine Sorge.
    Lerne was ^ stirb dumm.
    Und weil ^ reversibel ist:
    Lerne nix & stirb trotzdem dumm. 🙂


Anmelden zum Antworten