Convertir les noms d'en-tête C en noms d'en-tête C ++

27

Dans la bibliothèque standard C, les noms d'en-tête se terminent par un .hsuffixe:

stdio.h

En C ++, ces noms d'en-tête sont disponibles sous une forme alternative, avec un cpréfixe à la place:

cstdio

Écrivez une fonction qui convertit le premier formulaire en deuxième. Vous pouvez effectuer la conversion sur place ou laisser la chaîne d'origine intacte et renvoyer une nouvelle chaîne. Quelle que soit la sensation naturelle dans la langue de votre choix.

Le code doit être compilé / interprété sans erreur. Les avertissements du compilateur sont acceptables.

Voici votre solution de base C. Il contient 70 caractères et génère un avertissement concernant strlen:

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

La solution la plus courte (mesurée en nombre de caractères) l'emporte.

Mise à jour: si la langue de votre choix ne prend pas en charge les fonctions, des programmes entiers sont également acceptables.

Mise à jour: Comme suggéré par FUZxxl, voici une liste complète des fichiers d'en-tête dans la bibliothèque standard C:

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

Plus précisément, il n'y a aucun nom d'en-tête contenant plusieurs points.

fredoverflow
la source

Réponses:

37

80386 code machine, 13 octets

Hexdump du code:

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

Code source (peut être compilé par Visual Studio):

__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
    }
}

Il convertit la chaîne en place. Le code est si simple qu'il n'a pas besoin de sauvegarder et de restaurer les registres (en utilisant uniquement alet ecxque la fastcallconvention permet de clobber).

anatolyg
la source
Bien
Certainement l'une des solutions les plus cool! Mais le code source n'est pas vraiment 13 octets, seulement la forme compilée de celui-ci (que je pense que peu d'entre nous voudraient écrire dans un éditeur hexadécimal).
Per Lundberg
3
Donnez-lui sa victoire. Octet = caractère est une interprétation parfaitement raisonnable ici.
Joshua
7
@PerLundberg Je vois le code source dans ce cas comme étant l'explication développée / commentée "comment ça marche" que beaucoup de gens incluent dans leurs langages ultra-compacts. Pour un si petit programme, il aurait très bien pu être écrit à la main. :)
moelleux
@fluffy Fair point. Et oui, le nombre de personnes qui pourraient écrire le code binaire par cœur est certainement> 0, même si je ne connais personne de geek moi-même. ;)
Per Lundberg
14

Python: 19 caractères

lambda s:'c'+s[:-2]
Functino
la source
14

CJam, 6 octets

'clW(<

Ceci est un programme complet qui lit la chaîne via STDIN

Explication :

'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";

Essayez-le en ligne ici

Optimiseur
la source
N'est-ce pas -2aussi bon que W(?
Esolanging Fruit
12

Java 8-25 caractères

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

brainfuck - 25 23 octets

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

Si la langue de votre choix ne prend pas en charge les fonctions, des programmes entiers sont également acceptables.

Il s'agit d'un programme complet qui prend en entrée STDIN.

,[>,]      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
métro monorail
la source
Cette étape ne serait-elle pas sur le bord gauche de la bande le [<]
feersum
@feersum Si votre interprète vous permet de descendre du bord gauche, oui. Tout le monde que j'ai jamais utilisé boucle la bande.
undergroundmonorail
2
@feersum Si vous souhaitez l'essayer mais que votre interprète vous permet de tomber, vous pouvez le corriger avec un >au début.
undergroundmonorail
10

Haskell - 23 caractères

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

Haskell - 16 caractères, comme suggéré par nimi

('c':).init.init
fredoverflow
la source
2
Supprimer les 2 derniers caractères avec init.initau lieu de tout prendre jusqu'au premier .permet d'économiser quelques octets.
nimi
@nimi C'est une super suggestion!
fredoverflow
10

C, 38

Voir sur Ideone

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

sest un pointeur vers la chaîne d'entrée et oest l'endroit où la sortie doit être écrite.

J'ai trouvé un moyen d'abuser snprintf. La chaîne de sortie se trouve commodément être un caractère plus court que l'entrée, et la longueur maximale de la chaîne écrite par snprintfest inférieure de 1 à l' nargument, donc elle coupe le .h. Remarque: cette technique ne fonctionnera pas avec l'implémentation de Microsoft car elle fait la mauvaise chose et ne parvient pas à terminer la chaîne par null.

feersum
la source
8

Fichier batch de Windows 11

@echo c%~n1

Le premier paramètre transmis est% 1. Le modificateur ~ n renvoie uniquement le nom de fichier sans extension.

S'il est également possible d'écho de la commande étendue à l'écran, le @ initial pourrait être supprimé.

Alchymiste
la source
8

Architecture du nœud TIS de type T21 - 85 octets

Cette réponse est juste pour le plaisir; la langue a vu le jour après la rédaction de ce défi et je ne peux donc pas gagner avec. (Pas que j'allais le faire.)

D'accord, je me suis un peu amusé avec celui-ci. Je devrais probablement simplement appeler la langue "TIS-100", mais pourquoi rompre le caractère? :RÉ

TIS-100 est un jeu sur la programmation d'un ordinateur avec une architecture totalement unique et bizarre. J'ai écrit un puzzle personnalisé pour ce défi, qui me permet de prendre des entrées et de vérifier les sorties par rapport à une "chaîne" correcte. Malheureusement, il n'y a aucun moyen de gérer les chaînes ou les caractères, donc ce programme utilise simplement la valeur ASCII de chaque caractère pour l'entrée et la sortie.

Si vous souhaitez le voir en action, vous pouvez utiliser cet émulateur , ou tout simplement me regarder l'exécuter dans le jeu réel ici . Notez que dans la vidéo, la dernière ligne du premier nœud est D:MOV UP NIL. Après avoir terminé la vidéo, j'ai réalisé que je pouvais jouer au golf jusqu'à D:ADD UP. Fonctionnellement, il n'y a pas de différence, car la valeur de ACC est immédiatement écrasée de toute façon.

Voici la chaîne que j'ai utilisée pour mon nombre d'octets:

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

C'est le texte de chaque nœud non vide, séparé par des sauts de ligne (ajoutant effectivement 1 octet pour chaque nœud utilisé au-delà du premier, reflétant notre règle sur le code dans plusieurs fichiers).

métro monorail
la source
7

Dyalog APL (8 caractères)

'c',¯2↓⊢

Cette solution est exactement la même que la solution J que j'ai soumise, mais utilise un caractère de moins en raison d' un caractère de moins que }..

FUZxxl
la source
7

J (9 caractères)

'c',_2}.]
  • |yest la magnitude de y(également appelée valeur absolue)
  • x }. ylaisse tomber les |xarticles de y; les articles sont déposés par l'avant si xc'est positif, à la fin si xc'est négatif.
  • x , yajoute xet y.
  • 'c' , _2 }. yfait la transformation que vous voulez; en notation tacite, cela peut être exprimé comme 'c' , _2 }. ].
FUZxxl
la source
7

Autruche 0.6.0 , 8 caractères

););"c\+

)est l'opérateur "right uncons". Lorsqu'il est appliqué à une chaîne, il se transforme, par exemple, `foo`en `fo` `o`. ;est utilisé pour supprimer le caractère supplémentaire, et cela se fait à nouveau.

Ensuite, "cest poussé. Il s'agit simplement d'un raccourci pour `c`.

\+ échange les deux premiers éléments de la pile et les concatène.

Poignée de porte
la source
Cette langue a-t-elle été créée par vous?
Ismael Miguel
@IsmaelMiguel Oui. (Voir le dépôt principal de Github .)
Poignée de porte
Je le pensais. Je l'ai déjà vérifié, y réfléchissant donc. Il n'y a aucune référence sur cette langue nulle part. Ici seulement. Donc, j'ai supposé que c'était toi. Pour un gars de 14 ans, vous êtes allé très loin dans la programmation. +1000 pour ça!
Ismael Miguel
@IsmaelMiguel Whoops, désolé, aurait dû vous dire que je suis KeyboardFire sur Github. Merci!
Poignée de porte
Vous n'en avez pas besoin. C'est presque implicite. Je suis ismael-miguel (très original, consultez github.com/ismael-miguel ). Je n'ai rien d'intéressant et d'utile là-bas, mais vous pouvez le vérifier. Mais je m'intéresse à votre langue. La seule chose complète est la classe UIntArray pour php ( github.com/ismael-miguel/php-uintarray si vous êtes intéressé).
Ismael Miguel
7

piet ( 9x11 = 99 8X11 = 88)

v2

un autre essai (2x37 = 74)

entrez la description de l'image ici

Difficile de le rendre beaucoup plus petit car il doit générer un 99 ('c') et un 46 ('.'), Et cela prend de la place en piet.

captncraig
la source
1
Piet n'est jamais mesuré en caractères, seulement des codels, donc vous n'avez pas besoin de mentionner le bit 0 caractères :) C'est aussi beaucoup de blanc
Sp3000
essayer de compresser, mais c'est un peu difficile. J'ai du mal à le terminer si je supprime encore une autre ligne ou colonne.
captncraig
C'est un peu de la triche, mais j'aime ça. C'est comme utiliser /dev/nullcomme code source.
Ismael Miguel
2
Selon META ( meta.codegolf.stackexchange.com/questions/4782/… ), votre programme n'est pas obligé de terminer. Tant qu'il fait sa tâche, votre programme peut s'exécuter indéfiniment. Lisez la première réponse à la question.
Ismael Miguel
6

F# - 39 37 31

31 - Parce que la typographie dans les roches F #!

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
la source
Ne fonctionne pas pour un en-tête nommé foo.hoo.h.
FUZxxl
3
@FUZxxl Il n'y a pas de tels en-têtes dans la bibliothèque standard C.
fredoverflow
@FredOverflow Vous souhaiterez peut-être spécifier l'ensemble de noms sur lequel la transformation doit fonctionner. À l'heure actuelle, votre question est formulée d'une manière qui pourrait amener les gens à supposer que ce type de contribution doit fonctionner correctement.
FUZxxl
@FUZxxl J'ai mis à jour la question en conséquence.
fredoverflow
6

gema, 6

*.h=c*

( Gema est un langage macro obscur.)

Steven Taschuk
la source
4

Bash, 18 ans

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

Sortie:

$ f stdio.h
cstdio
$ 
Traumatisme numérique
la source
4

GNU sed -r, 14

sed n'a pas vraiment de concept de fonctions, voici donc un programme sed complet:

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

Sortie

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

Le -ra été inclus dans la partition comme un caractère supplémentaire.

Traumatisme numérique
la source
Cette solution n'est pas valide: elle devrait probablement l'être à la s/\(.*\)\.h/c\1/place.
FUZxxl
@FUZxxl - Je suppose qu'il -rest transmis à sed. Selon le code-golf habituel, je dois compter cela comme un point supplémentaire.
Digital Trauma
@DigitalTraume Notez que ce -rn'est pas une option standard et n'est pas disponible en dehors de GNU sed. Vous voudrez peut-être changer le nom de la langue en GNU sed pour refléter cela.
FUZxxl
@FUZxxl Oui. Terminé.
Digital Trauma
2
\.hpeut être raccourci en..
Steven Taschuk
3

Prélude , 31 caractères

Étant donné que les soumissions complètes de programmes sont apparemment acceptables, voici un programme qui lit l'en-tête de style C de STDIN et imprime l'en-tête de style C ++ dans STDOUT:

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

Cela nécessite un interpréteur conforme aux normes qui imprime la sortie sous forme de codes de caractères. Si vous utilisez l'interpréteur Python, vous devrez le définir NUMERIC_OUTPUT = False.

Cela nécessite également qu'il n'y ait pas de retour à la ligne sur STDIN.

Explication

Dans Prelude, toutes les lignes sont exécutées en parallèle, une colonne à la fois. Chaque ligne a sa propre pile, initialisée à une quantité infinie de 0s.

99+9+
9(1-)

C'est le plus court que j'ai pu trouver pour obtenir un 99sur la pile supérieure (le code de caractère de c). D'abord, j'additionne 18sur la pile du haut et j'enfonce un 9sur la pile du bas. Le bas décompte ensuite 0dans une boucle, tandis que la pile du haut ajoute plus de 9s. Cela s'ajoute à 99la pile du haut et la pile du bas se retrouve avec 0s. Notez que tout +9+fait partie de la boucle, donc il y a en fait deux opérations d'addition par itération, mais ce n'est pas un problème, grâce à l'offre infinie de 0s en dessous.

(?)Lit maintenant STDIN, un caractère à la fois et pousse sur la pile supérieure. La boucle se termine à la fin de l'entrée, lorsque ?pousse un zéro. ###se débarrasse de ce zéro, le het le .. Maintenant, la boucle suivante extrait les numéros de la pile supérieure tout en les copiant dans la pile inférieure. Cela inverse essentiellement la pile. Notez que les parenthèses ouvrantes et fermantes sont sur des lignes différentes - ce n'est pas un problème, car la position verticale du )n'est pas pertinente dans Prelude, mais cela me fait gagner un octet sur la première ligne.

Enfin, (!)imprime tous les caractères jusqu'à ce que la pile soit vide.

Martin Ender
la source
3

Pyth, 7 caractères

L+\cPPb

Explication:

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

Essaye ça:

L+\cPPb
y"stdio.h

sur le compilateur / exécuteur Pyth en ligne


Si des programmes complets étaient autorisés:

Pyth, 6 caractères

+\cPPQ
isaacg
la source
Je n'ai jamais vu Pyth. Souhaitez-vous être si gentil et expliquer le code? :)
fredoverflow
1
@FredOverflow Voir codegolf.stackexchange.com/q/40039/18487
Rainbolt
Je crois que vous pouvez utiliser à la PPbplace de<b_2
FryAmTheEggman
@FryAmTheEggman Merci.
isaacg
Il semble que les programmes complets soient autorisés, vous pouvez donc arriver à 6.
FryAmTheEggman
3

C ++ 14, 41 caractères

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

Inspiré par cette autre réponse. J'en ai fait une réponse distincte car ici j'utilise une fonctionnalité nouvelle en c ++ 14, lambda générique .

Voyez-le en action ici .

anatolyg
la source
2

T-SQL - 58 caractères

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

Exécuter en tant qu'EXEC Q (votre chaîne ici)

bmarks
la source
2

Perl - 20 caractères

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

Notez comment cest un mot simple et en tant que tel, cela nécessite un manque de use strict. Cela doit être utilisé comme une expression, pas comme une déclaration.

à droite
la source
2

Marbelous, 24

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

Prend entrée via STDIN, sorties vers STDOUT.

Cela fonctionne en vérifiant chaque octet avec .( 0x46). Comme 0x46ne peut pas tenir dans un seul chiffre de base 36, nous soustrayons 35 ( Z) avant de comparer et l'ajoutons avant de produire.

Chaque marbre est dupliqué par 3W( duplicateur à trois voies, mais le côté gauche est jeté du côté de la planche). Le marbre envoyé vers le bas récupère l'octet suivant de STDIN. La bille à droite est vérifiée ., puis sortie ou envoyée à !!, ce qui met fin au programme.

Le programme commence par passer c( 0x63), qui sera envoyé à STDOUT.

Essayez-le en ligne ici. Les bibliothèques doivent être activées, les cartes cylindriques doivent être désactivées.

es1024
la source
2

C, 64

Légèrement plus court que la référence c:

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

Probablement plus de golf à faire avec cela.


C, 48 (piratage libc)

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

La strcpypage de manuel indique explicitement "Les chaînes ne peuvent pas se chevaucher". Cependant, j'ai trouvé que la libc que j'utilise semble être codée en toute sécurité pour gérer cela correctement tout de même. Il s'agit de la bibliothèque GNU C (Ubuntu EGLIBC 2.19-0ubuntu6.4) sur Ubuntu 14.04.

Traumatisme numérique
la source
L'omission du type de retour d'une fonction est-elle légale dans C89?
fredoverflow
1
@FredOverflow. Oui - gcc compile cela très bien avec -std=c89. codegolf.stackexchange.com/a/2204/11259
Digital Trauma
@FredOverflow Oui. Le type de retour par défaut est int.
FUZxxl
La page de manuel réitère simplement la norme - la compilation avec VC ++ (VS2012) donne "cstdii" pour "stdio.h". N'a pas vérifié ICC / Sun / clang, mais votre version 64 caractères dit "pourquoi?" - il est à peu près aussi court qu'il peut (légalement) être en C.
frasnian
2

JavaScript (ES6) 20

Je ne peux pas croire qu'ES6 était toujours manquant

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

Perl, 15 (14 + -p)

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

mk, 34 caractères

mk (1) est le remplacement du plan 9 pour make. Juste pour le plaisir, ce mkfile convertit les noms d'en-tête C en noms d'en-tête C ++:

c%:Q:
    :

%.h:Q: c%
    echo $prereq

Il y a un seul onglet avant :et echo. Utilisez comme ceci:

% mk stdio.h
cstdio
FUZxxl
la source
1

CoffeeScript - 16

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

TI-BASIC 83/84, 15

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

R, 33

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

Cette fonction utilise des expressions régulières.

Exemple d'utilisation:

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