Konvertieren Sie C-Headernamen in C ++ - Headernamen

27

In der C-Standardbibliothek enden die Headernamen mit einem .hSuffix:

stdio.h

In C ++ stehen diese Headernamen in einer alternativen Form mit einem cPräfix zur Verfügung:

cstdio

Schreiben Sie eine Funktion, die das erste Formular in das zweite konvertiert. Sie können die Konvertierung direkt durchführen oder die ursprüngliche Zeichenfolge intakt lassen und eine neue Zeichenfolge zurückgeben. Was auch immer sich in der Sprache Ihrer Wahl natürlich anfühlt.

Der Code muss fehlerfrei übersetzt / interpretiert werden. Compiler-Warnungen sind akzeptabel.

Hier ist Ihre C-Basislösung. Es hat 70 Zeichen und erzeugt eine Warnung über strlen:

void f(char*h){int i=strlen(h);h[--i]=0;while(--i)h[i]=h[i-1];*h='c';}

Die kürzeste Lösung (gemessen in Anzahl der Zeichen) gewinnt.

Update: Wenn Ihre Sprache keine Funktionen unterstützt, sind auch ganze Programme akzeptabel.

Update: Wie von FUZxxl vorgeschlagen, finden Sie hier eine vollständige Liste der Header-Dateien in der C-Standardbibliothek:

assert.h
ctype.h
errno.h
float.h
limits.h
locale.h
math.h
setjmp.h
signal.h
stdarg.h
stddef.h
stdio.h
stdlib.h
string.h
time.h

Insbesondere gibt es keine Kopfzeilennamen mit mehreren Punkten.

fredoverflow
quelle

Antworten:

37

80386 Maschinencode, 13 Bytes

Hexdump des Codes:

b0 63 86 01 41 3c 2e 75 f9 c6 01 00 c3

Quellcode (kann von Visual Studio kompiliert werden):

__declspec(naked) void __fastcall conv(char s[])
{
    _asm {
        mov al, 'c';            // b0 63
    myloop:
        xchg al, [ecx];         // 86 01
        inc ecx;                // 41
        cmp al, '.';            // 3c 2e
        jne myloop;             // 75 f9
        mov byte ptr [ecx], 0;  // c6 01 00
        ret;                    // c3
    }
}

Es konvertiert die Zeichenfolge an Ort und Stelle. Der Code ist so einfach, dass keine Register gespeichert und wiederhergestellt werden müssen (nur mit alund ecx, was fastcalllaut Konvention erlaubt ist, zu löschen).

anatolyg
quelle
Schön, das bringt mich zurück :)
Fredoverflow
Auf jeden Fall eine der cooleren Lösungen! Aber der Quellcode ist nicht wirklich 13 Bytes, sondern nur die kompilierte Form davon (von der ich denke, dass nur wenige von uns in einem Hex-Editor schreiben möchten).
Per Lundberg,
3
Gib ihm seinen Gewinn. Byte = Zeichen ist hier eine durchaus sinnvolle Interpretation.
Joshua,
7
@PerLundberg Ich sehe den Quellcode in diesem Fall als die "Funktionsweise" der erweiterten / kommentierten Erklärung, die viele Leute in ihre ultrakompakten Sprachen aufnehmen. Für ein so kleines Programm hätte es sehr gut von Hand geschrieben sein können. :)
flauschige
@ flauschige Fair Point. Und ja, die Anzahl der Leute, die den Binärcode auswendig schreiben könnten, ist mit Sicherheit> 0, auch wenn ich niemanden kenne, der selbst geeky ist. ;)
Per Lundberg
14

Python: 19 buchstaben

lambda s:'c'+s[:-2]
Funktino
quelle
14

CJam, 6 Bytes

'clW(<

Dies ist ein vollständiges Programm, das den String über STDIN liest

Erklärung :

'c               "Put character c on stack";
  l              "Read a line from STDIN";
   W             "W is a predefined variable with value -1";
    (            "Decrease the value by 1";
     <           "Remove last 2 characters from the string on stack, the input argument";

Probieren Sie es hier online aus

Optimierer
quelle
Ist nicht -2so gut wie W(?
Esolanging Fruit
12

Java 8 - 25 Zeichen

h->"c"+h.replace(".h","")
fredoverflow
quelle
11

Brainfuck - 25 23 Bytes

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

Wenn Ihre Sprache keine Funktionen unterstützt, sind auch ganze Programme zulässig.

Dies ist ein ganzes Programm, das Eingaben von STDIN erhält.

,[>,]      get all bytes of input
<-----.    subtract 5 from last byte (always "h"; "h" minus 5 = "c") and print result
<,         set second last byte to 0 by abusing comma
<[<]>      go to first byte
[.>]       print byte and move right until hitting 0
untergrundbahn
quelle
Würde das nicht am [<]
feersum
@feersum Wenn Ihr Dolmetscher es Ihnen erlaubt, von der linken Kante abzusteigen, ja. Jeder, den ich je benutzt habe, schleift das Band.
Undergroundmonorail
2
@feersum Wenn Sie es versuchen möchten, aber Ihr Dolmetscher es Ihnen erlaubt, herunterzufallen, können Sie es mit einem >am Anfang beheben .
Undergroundmonorail
10

Haskell - 23 Zeichen

('c':).takeWhile(/='.')

Haskell - 16 Zeichen, wie von Nimi vorgeschlagen

('c':).init.init
fredoverflow
quelle
2
Wenn Sie die letzten 2 Zeichen mit löschen, init.initanstatt alle Zeichen bis zum ersten Zeichen zu .belegen, werden einige Bytes gespart.
nimi
@ nimi Das ist ein toller Vorschlag!
Fredoverflow
10

C 38

Siehe auf Ideone

f(s,o){snprintf(o,strlen(s),"c%s",s);}

sist ein Zeiger auf die Eingabezeichenfolge, oin die die Ausgabe geschrieben werden soll.

Ich habe einen Weg gefunden, um zu missbrauchen snprintf. Die Ausgabezeichenfolge ist günstigerweise ein Zeichen kürzer als die Eingabe, und die maximale Länge der von geschriebenen Zeichenfolge snprintfist 1 weniger als das nArgument, sodass die Zeichenfolge abgeschnitten wird .h. Hinweis: Diese Technik funktioniert nicht mit der Implementierung von Microsoft, da sie das Falsche tut und die Zeichenfolge nicht mit Null terminiert.

Feersum
quelle
8

Windows-Batchdatei 11

@echo c%~n1

Der erste übergebene Parameter ist% 1. Der Modifikator ~ n gibt nur den Dateinamen ohne Erweiterung zurück.

Wenn es akzeptabel ist, den erweiterten Befehl auch auf dem Bildschirm wiederzugeben, kann das anfängliche @ entfernt werden.

Alchymist
quelle
8

TIS-Knotentyp T21-Architektur - 85 Byte

Diese Antwort ist nur zum Spaß; Die Sprache ist entstanden, nachdem diese Herausforderung geschrieben wurde, und ich kann daher nicht damit gewinnen. (Nicht, dass ich gehen würde.)

Okay, ich hatte ein bisschen Spaß damit. Ich sollte wahrscheinlich nur die Sprache "TIS-100" nennen, aber warum soll ich das Zeichen unterbrechen? : D

TIS-100 ist ein Spiel zum Programmieren eines Computers mit einer völlig einzigartigen und bizarren Architektur. Ich habe ein spezielles Puzzle für diese Herausforderung geschrieben, mit dem ich die Eingabe und Ausgabe mit einer bekanntermaßen korrekten "Zeichenfolge" vergleichen kann. Leider gibt es keine Möglichkeit, Zeichenfolgen oder Zeichen zu verarbeiten. Daher verwendet dieses Programm einfach den ASCII-Wert jedes Zeichens für die Eingabe und Ausgabe.

Wenn Sie es in Aktion sehen möchten, können Sie diesen Emulator verwenden oder einfach zusehen, wie ich es im aktuellen Spiel hier ausführe . Beachten Sie, dass im Video die letzte Zeile des ersten Knotens ist D:MOV UP NIL. Nachdem ich das Video fertiggestellt hatte, wurde mir klar, dass ich das bis zum Golf spielen konnte D:ADD UP. Funktionell gibt es keinen Unterschied, da der Wert von ACC sowieso sofort überschrieben wird.

Dies ist die Zeichenfolge, die ich für meine Byteanzahl verwendet habe:

MOV 99 ANY
MOV -46 ACC
ADD UP
JEZ D
ADD ACC ANY
JRO -5
D:ADD UP
MOV UP ANY
MOV UP ANY

Dies ist der Text jedes nicht leeren Knotens, der durch Zeilenumbrüche getrennt ist (effektiv wird 1 Byte für jeden Knoten hinzugefügt, der nach dem ersten verwendet wird, was unsere Regel zum Code in mehreren Dateien widerspiegelt).

untergrundbahn
quelle
7

Dyalog APL (8 Zeichen)

'c',¯2↓⊢

Diese Lösung ist genau die gleiche wie die von mir eingereichte J-Lösung, verwendet jedoch ein Zeichen weniger, da es ein Zeichen weniger ist als }..

FUZxxl
quelle
7

J (9 Zeichen)

'c',_2}.]
  • |yist die Größe von y(auch Absolutwert genannt)
  • x }. ylässt |xGegenstände fallen von y; Gegenstände werden von vorne fallen gelassen, wenn sie xpositiv sind, und am Ende, wenn sie xnegativ sind.
  • x , yhängt an xund y.
  • 'c' , _2 }. yführt die Transformation durch, die du willst; in stillschweigender Notation kann dies ausgedrückt werden als 'c' , _2 }. ].
FUZxxl
quelle
7

Strauß 0.6.0 , 8 Zeichen

););"c\+

)ist der "richtige Uncon" -Operator. Wenn es auf eine Zeichenfolge angewendet wird, wird es beispielsweise `foo`zu `fo` `o`. ;wird verwendet, um das zusätzliche Zeichen zu entfernen, und dies wird erneut durchgeführt.

Dann "cwird geschoben. Dies ist einfach eine Abkürzung für `c`.

\+ tauscht die beiden obersten Stapelelemente aus und verkettet sie.

Türknauf
quelle
Wurde diese Sprache von Ihnen erstellt?
Ismael Miguel
@IsmaelMiguel Ja. (Siehe das Haupt-Repo von Github .)
Türknauf
Ich denke schon. Ich habe es bereits überprüft und darüber nachgedacht. Es gibt nirgendwo einen Hinweis auf diese Sprache. Nur hier. Also nahm ich an, dass es von dir gemacht wurde. Für einen 14-Jährigen warst du beim Programmieren wirklich weit fortgeschritten. +1000 dafür!
Ismael Miguel
@IsmaelMiguel Whoops, sorry, hätte dir sagen sollen, dass ich KeyboardFire auf Github bin . Vielen Dank!
Türknauf
Das musst du nicht. Es ist fast impliziert. Ich bin ismael-miguel (sehr originell, siehe github.com/ismael-miguel ). Ich habe dort nichts Interessantes und Nützliches, aber Sie können es überprüfen. Aber ich interessiere mich für Ihre Sprache. Die einzige vollständige Sache ist die UIntArray-Klasse für PHP ( github.com/ismael-miguel/php-uintarray, wenn Sie interessiert sind).
Ismael Miguel
7

piet ( 9x11 = 99 8 x 11 = 88)

v2

Noch ein Versuch (2x37 = 74)

Bildbeschreibung hier eingeben

Es ist schwer, es viel kleiner zu machen, da es eine 99 ('c') und eine 46 ('.') Erzeugen muss, und das braucht Platz in piet.

captncraig
quelle
1
Piet wird nie in Zeichen gemessen, nur in Codels, daher muss man das 0-Zeichen-Bit nicht erwähnen :) Auch das ist viel Weiß
Sp3000
versuchen zu komprimieren, aber es ist ein bisschen schwierig. Probleme beim Beenden, wenn ich eine weitere Zeile oder Spalte entferne.
captncraig
Das ist ein bisschen schummeln, aber ich mag es. Dies ist wie die Verwendung /dev/nullals Quellcode.
Ismael Miguel
2
Laut META ( meta.codegolf.stackexchange.com/questions/4782/… ) muss Ihr Programm nicht beendet werden. Solange es seine Aufgabe erfüllt, kann Ihr Programm für immer ausgeführt werden. Lesen Sie die erste Antwort auf die Frage.
Ismael Miguel
6

F # - 39 37 31

31 - Weil Typinferenz in F # rockt!

fun s->("c"+s).Replace(".h","")

37

fun(s:string)->"c"+s.Replace(".h","")

39

fun(s:string)->"c"+s.Remove(s.Length-2)
oopbase
quelle
Funktioniert nicht für einen Header namens foo.hoo.h.
FUZxxl,
3
@FUZxxl In der C-Standardbibliothek gibt es keine solchen Header.
Fredoverflow
@FredOverflow Möglicherweise möchten Sie die Gruppe von Namen angeben, für die die Umwandlung ausgeführt werden soll. Im Moment ist Ihre Frage so formuliert, dass die Leute davon ausgehen könnten, dass diese Art von Eingabe korrekt funktionieren muss.
FUZxxl,
@FUZxxl Ich habe die Frage entsprechend aktualisiert.
Fredoverflow
6

Gema, 6

*.h=c*

( Gema ist eine obskure Makrosprache.)

Steven Taschuk
quelle
4

Bash, 18

f()(echo c${1%.*})

Ausgabe:

$ f stdio.h
cstdio
$ 
Digitales Trauma
quelle
4

GNU sed -r, 14

sed hat eigentlich kein Funktionskonzept, daher hier ein komplettes sed-Programm:

s/(.*)../c\1/

Ausgabe

$ sed -r 's/(.*)../c\1/' <<< stdio.h
cstdio
$ 

Das -rwurde als ein zusätzlicher Charakter in die Partitur aufgenommen.

Digitales Trauma
quelle
Diese Lösung ist ungültig: Es sollte wahrscheinlich s/\(.*\)\.h/c\1/stattdessen sein.
FUZxxl,
@FUZxxl - Ich gehe davon aus -r, dass sed übergeben wird. Wie beim Code-Golf üblich, muss ich das als zusätzlichen Punkt zählen.
Digital Trauma
@DigitalTraume Beachten Sie, dass dies -rkeine Standardoption ist und außerhalb von GNU sed nicht verfügbar ist. Möglicherweise möchten Sie den Namen der Sprache in GNU sed ändern, um dies widerzuspiegeln.
FUZxxl,
@FUZxxl Ja. Getan.
Digital Trauma
2
\.hkann verkürzt werden auf..
Steven Taschuk
3

Vorspiel , 31 Zeichen

Da vollständige Programmübermittlungen anscheinend akzeptabel sind, ist hier ein Programm, das den C-Style-Header von STDIN liest und den C ++ - Style-Header an STDOUT ausgibt:

99+9+(?)###(#
9(1-)       ^)(!)

Dies erfordert einen standardkonformen Interpreter, der die Ausgabe als Zeichencode ausgibt. Wenn Sie den Python-Interpreter verwenden, müssen Sie festlegen NUMERIC_OUTPUT = False.

Es ist auch erforderlich, dass in STDIN kein Zeilenumbruch erfolgt.

Erläuterung

Im Prelude werden alle Zeilen spaltenweise parallel ausgeführt. Jede Zeile hat einen eigenen Stapel, der auf unendlich viele 0s initialisiert ist .

99+9+
9(1-)

Dies ist das kürzeste, das ich mir einfallen lassen könnte, um einen 99auf den obersten Stapel (den Zeichencode von c) zu bekommen. Zuerst addiere ich 18den oberen Stapel und drücke einen 9auf den unteren Stapel. Der untere Teil zählt dann 0in einer Schleife abwärts , während der obere Stapel weitere 9s aufaddiert. Dies summiert sich zu 99dem oberen Stapel, und der untere Stapel wird wieder mit 0s belassen . Beachten Sie, dass all of +9+Teil der Schleife ist, so dass es tatsächlich zwei Additionsoperationen pro Iteration gibt, aber das ist kein Problem, dank der unendlichen Zufuhr von 0s darunter.

Nun (?)liest STDIN, ein Zeichen in einer Zeit und drückt auf den oberen Stapel. Die Schleife endet am Ende der Eingabe, wenn ?eine Null gedrückt wird. ###wird diese Null los, die hund die .. In der nächsten Schleife werden die Zahlen vom oberen Stapel abgerufen, während sie in den unteren Stapel kopiert werden. Dies kehrt den Stapel im Wesentlichen um. Beachten Sie, dass sich die öffnenden und schließenden Klammern in verschiedenen Zeilen befinden - dies ist kein Problem, da die vertikale Position von )in Prelude irrelevant ist, aber mir ein Byte in der ersten Zeile erspart.

Zum (!)Schluss werden alle Zeichen gedruckt, bis der Stapel leer ist.

Martin Ender
quelle
3

Pyth, 7 Zeichen

L+\cPPb

Erläuterung:

L         def y(b):return
 +\c                      "c" +
    PPb                         b[:-1][:-1]

Versuche dies:

L+\cPPb
y"stdio.h

auf dem Online Pyth Compiler / Executor


Wenn volle Programme erlaubt wären:

Pyth, 6 Zeichen

+\cPPQ
isaacg
quelle
Ich habe Pyth noch nie gesehen. Würdest du so nett sein und den Code erklären? :)
Fredoverflow
1
@FredOverflow See codegolf.stackexchange.com/q/40039/18487
Rainbolt
Ich glaube, Sie können PPbanstelle von verwenden<b_2
FryAmTheEggman
@FryAmTheEggman Danke.
Isaacg
Es scheint , wie vollständige Programme erlaubt sind, so dass Sie bis 6 erhalten können
FryAmTheEggman
3

C ++ 14, 41 Zeichen

[](auto&s){s="c"+s.substr(0,s.size()-2);}

Inspiriert von dieser anderen Antwort. Ich habe es als separate Antwort angegeben, da ich hier eine Funktion verwende, die in c ++ 14 neu ist, generisches Lambda .

Sehen sie in Aktion hier .

anatolyg
quelle
2

T-SQL - 58 Zeichen

CREATE PROC Q(@ VARCHAR(MAX))AS
SELECT'c'+LEFT(@,LEN(@)-2)

Führen Sie als EXEC Q (Ihre Zeichenfolge hier)

Markierungen
quelle
2

Perl - 20 Zeichen

sub{c.pop=~s/..$//r}

Beachten Sie, wie cist ein Bareword und als solches erfordert dies einen Mangel an use strict. Dies muss als Ausdruck und nicht als Anweisung verwendet werden.

richtig falten
quelle
2

Marbelous, 24

@063
-Z//
3W<C+Z
]]!!
@0

Übernimmt die Eingabe über STDIN und gibt sie an STDOUT aus.

Dies funktioniert, indem jedes Byte mit .( 0x46) markiert wird . Da 0x46es nicht möglich ist, in eine einzelne Zahl zur Basis 36 zu passen, subtrahieren wir Zvor dem Vergleich 35 ( ) und addieren sie vor der Ausgabe zurück.

Jede Murmel wird von 3W(Drei-Wege-Kopierer, aber die linke Seite wird von der Seite des Bretts abgeworfen) dupliziert. Der nach unten gesendete Marmor holt das nächste Byte von STDIN. Der Marmor auf der rechten Seite wird geprüft .und dann entweder ausgegeben oder an gesendet !!, wodurch das Programm beendet wird.

Das Programm startet mit through c( 0x63), das an STDOUT ausgegeben wird.

Probieren Sie es hier online aus. Bibliotheken müssen aktiviert sein, zylindrische Karten müssen deaktiviert sein.

es1024
quelle
2

C 64

Etwas kürzer als die c-Referenz:

f(char*h){char*d=strstr(h,".");memmove(h+1,h,d++-h);*d=0;*h=99;}

Wahrscheinlich ist damit mehr Golf zu spielen.


C, 48 (libc hack)

f(char*h){strcpy(h+1,h);*strstr(h,".")=0;*h=99;}

In der strcpyManpage heißt es explizit "Die Zeichenfolgen dürfen sich nicht überlappen". Allerdings habe ich festgestellt, dass die von mir verwendete libc anscheinend sicher codiert ist, um trotzdem korrekt damit umzugehen. Dies ist die GNU C-Bibliothek (Ubuntu EGLIBC 2.19-0ubuntu6.4) unter Ubuntu 14.04.

Digitales Trauma
quelle
Ist das Weglassen des Rückgabetyps einer Funktion in C89 zulässig?
Fredoverflow
1
@FredOverflow. Ja - gcc kompiliert das ganz gut mit-std=c89 . codegolf.stackexchange.com/a/2204/11259
Digitales Trauma
@FredOverflow Ja. Der Rückgabetyp ist standardmäßig int.
FUZxxl
Die Manpage wiederholt nur den Standard - wenn Sie dies mit VC ++ (VS2012) kompilieren, erhalten Sie "cstdii" für "stdio.h". Ich habe ICC / Sun / clang nicht überprüft, aber Ihre 64-Zeichen-Version sagt "warum?" - Es ist ungefähr so ​​kurz wie es (legal) sein kann in C.
Frasnian
2

JavaScript (ES6) 20

Ich kann nicht glauben, dass ES6 noch fehlte

s=>'c'+s.slice(0,-2)
edc65
quelle
2

Perl, 15 (14 + -p)

s/(.*)\.h/c$1/
malkaroee
quelle
2

mk, 34 Zeichen

mk (1) ist der Plan 9-Ersatz für make. Aus Spaß konvertiert diese mk-Datei C-Headernamen in C ++ - Headernamen:

c%:Q:
    :

%.h:Q: c%
    echo $prereq

Vor :und gibt es einen einzelnen Tab echo. Verwenden Sie wie folgt:

% mk stdio.h
cstdio
FUZxxl
quelle
1

CoffeeScript - 16

(x)->"c"+x[..-3]
Tony Ellis
quelle
1

TI-BASIC 83/84, 15

"c"+sub(Ans,1,length(Ans)-2
Timtech
quelle
1

R 33

function(x)sub("(.+)..","c\\1",x)

Diese Funktion verwendet reguläre Ausdrücke.

Anwendungsbeispiel:

> (function(x)sub("(.+)..","c\\1",x))("stdio.h")
[1] "cstdio"
Sven Hohenstein
quelle