将C标头名称转换为C ++标头名称


27

在C标准库中,标头名称以.h后缀结尾:

stdio.h

在C ++中,这些标头名称以另一种形式可用,但带有c前缀:

cstdio

编写一个将第一种形式转换为第二种形式的函数。您可以就地进行转换,也可以保留原始字符串不变并返回新字符串。无论您选择哪种语言感到自然。

该代码必须正确编译/解释。编译器警告是可以接受的。

这是您的基准C解决方案。它有70个字符,并生成有关以下内容的警告strlen

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

最短的解决方案(以字符数衡量)获胜。

更新:如果您选择的语言不支持功能,则可以接受整个程序。

更新:正如FUZxxl所建议的,这是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

具体来说,没有标题名称,其中包含多个点。

Answers:


37

80386机器代码,13个字节

代码的十六进制转储:

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

源代码(可以由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
    }
}

它就地转换字符串。代码非常简单,不需要保存和恢复寄存器(仅使用aland ecxfastcall约定可以破坏寄存器)。


很好,这带我回来:)
fredoverflow

绝对是较酷的解决方案之一!但是源代码并不是真正的13字节,只是它的编译形式(我想我们当中很少有人愿意用十六进制编辑器编写)。
Per Lundberg 2015年

3
给他他的胜利。字节=字符在这里是一个完全合理的解释。
2015年

7
@PerLundberg在这种情况下,我认为源代码是许多人在其超紧凑语言中包含的“它如何工作”的扩展/注释说明。对于这么小的程序,它很可能是手写的。:)
蓬松的

@蓬松公平点。是的,即使我不认识任何一个讨厌自己的人,可以真正编写二进制代码的人数肯定大于零。;)
Per Lundberg 2015年


14

CJam,6个字节

'clW(<

这是一个完整的程序,可通过STDIN读取字符串

说明

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

在这里在线尝试


不仅-2不如W(
硕果累累'18年


11

Brainfuck- 25 23字节

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

如果您选择的语言不支持功能,则可以接受整个程序。

这是一个整个程序,需要从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


@feersum如果您的解释器允许您离开左侧,那么可以。我曾经使用过的每个磁带都会使磁带循环播放。
地下

2
@feersum如果您想尝试一下,但是您的解释器允许您自行尝试,则可以>在开头将其修复。
Undergroundmonorail

10

Haskell — 23个字符

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

Haskell-16个字符,由nimi建议

('c':).init.init

2
删除最后两个字符init.init而不是全部占用第.一个字符会节省一些字节。
nimi 2015年

@nimi这是一个很棒的建议!
fredoverflow

10

C,38

在Ideone上看到

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

s是指向输入字符串的指针,o是输出应写入的地方。

我找到了一种虐待的方法snprintf。通常,输出字符串比输入字符串短一个字符,并且写入的字符串的最大长度snprintfn参数小1 ,因此它切断了.h。注意:此技术不适用于Microsoft的实现,因为它做错了事并且无法对字符串进行空终止。


8

Windows批处理文件11

@echo c%~n1

传入的第一个参数是%1。〜n修饰符仅返回不带扩展名的文件名。

如果也可以在屏幕上回显扩展的命令,则可以删除开头的@。


8

TIS节点类型T21体系结构-85字节

这个答案很有趣。这种语言是在写完这项挑战后才出现的,因此我无法赢得胜利。(不是我要去的。)

好吧,我对此玩得很开心。我可能应该只将语言称为“ TIS-100”,但是为什么要打断字符呢?:D

TIS-100是一款有关对具有完全独特和奇异体系结构的计算机进行编程的游戏。我为这个挑战写了一个自定义的难题,它使我能够接受输入并根据已知正确的“字符串”检查输出。不幸的是,由于无法处理字符串或字符,因此该程序仅将每个字符的ASCII值用于输入和输出。

如果您希望看到它的实际效果,则可以使用此模拟器,或者只是看着我在这里的实际游戏中运行它。请注意,在视频中,第一个节点的最后一行是D:MOV UP NIL。播放完视频后,我意识到我可以将其降低到D:ADD UP。在功能上没有区别,因为ACC的值会立即被覆盖。

这是我用于字节计数的字符串:

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

这是每个非空节点的文本,用换行符分隔(有效地为每个节点之外的第一个节点添加1个字节,以反映我们有关多个文件中代码的规则)。


7

Dyalog APL(8个字符)

'c',¯2↓⊢

此解决方案与我提交的J解决方案完全相同,但由于比少一个字符,所以减少了一个字符}.


7

J(9个字符)

'c',_2}.]
  • |y大小y(也称绝对值)
  • x }. y|x从掉落物品y; 如果x为正,则从前面开始删除项目;如果为负,则从结尾开始删除项目x
  • x , y追加xy
  • 'c' , _2 }. y进行您想要的转换;用隐性表示可以表示为'c' , _2 }. ]

7

鸵鸟0.6.0字符

););"c\+

)是“正确的uncons”运算符。当应用于字符串时,例如,它变为`foo``fo` `o`;用于弹出多余的字符,然后再次执行此操作。

然后, "c被推。这只是的简写`c`

\+ 交换顶部的两个堆栈元素并将其连接。


这是您创造的语言吗?
Ismael Miguel

@IsmaelMiguel是的。(请参阅主要的Github回购。)
Doorknob

我是这样 我已经检查过,因此正在考虑。该语言在任何地方都没有参考。只有这里。所以,我以为是你做的。对于一个14岁的家伙,您在编程方面走得很远。+1000!
Ismael Miguel 2015年

@IsmaelMiguel抱歉,Whoops应该告诉您我是Github上的KeyboardFire。谢谢!
Doorknob

不用了 这几乎是隐含的。我是ismael-miguel(非常原始,请查看github.com/ismael-miguel)。我在那里没有任何有趣和有用的东西,但是您可以检查一下。但我对您的语言感兴趣。唯一完整的是php的UIntArray类(如果您感兴趣的话,请访问github.com/ismael-miguel/php-uintarray)。
伊斯梅尔·米格尔

7

piet(9x11 = 99 8X11 = 88)

v2

再试一次(2x37 = 74)

enter image description here

很难将其缩小,因为它需要生成一个99('c')和一个46('。'),并且需要在piet中占用空间。


1
Piet从来没有用字符来度量,只有密码,所以您无需提及0个字符:)另外,还有很多白色
Sp3000,2015年

尝试压缩,但这有点困难。如果删除另一行或另一列,则无法终止它。
captncraig 2015年

这有点作弊,但我喜欢。这就像/dev/null用作您的源代码。
Ismael Miguel

2
根据META(meta.codegolf.stackexchange.com/questions/4782/…),不需要完成程序。只要能完成任务,您的程序就可以永远运行。阅读问题的第一个答案。
伊斯梅尔·米格尔

6

F# - 39 37 31

31-因为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)

对于名为foo.hoo.h的标头不起作用。
FUZxxl 2015年

3
@FUZxxl C标准库中没有此类标头。
fredoverflow

@FredOverflow您可能要指定进行转换所必须使用的一组名称。现在,您的问题的措辞可能使人们认为这种输入必须正确运行。
FUZxxl 2015年

@FUZxxl我已经相应更新了问题。
fredoverflow



4

GNU sed -r,14

sed实际上没有任何功能概念,因此这里有一个完整的sed程序:

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

输出量

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

-r已被列入评分作为一个额外的字符。


此解决方案无效:可能应该s/\(.*\)\.h/c\1/改为。
FUZxxl 2015年

@FUZxxl-我假设-r传递给sed。按照通常的代码高尔夫,我需要将其视为额外的一点。
Digital Trauma 2015年

@DigitalTraume注意,这-r不是标准选项,在GNU sed之外不可用。您可能需要将语言名称更改为GNU sed以反映这一点。
FUZxxl 2015年

@FUZxxl是的。做完了
Digital Trauma 2015年

2
\.h可以缩短为..
Steven Taschuk

3

序幕,31个字符

由于完整的程序提交显然是可以接受的,因此以下程序可以从STDIN读取C样式的标头,然后将C ++样式的标头打印到STDOUT:

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

这需要符合标准的解释器,该解释器将输出打印为字符代码。如果您使用的是Python解释器,则需要进行设置NUMERIC_OUTPUT = False

它还要求STDIN上没有结尾的换行符。

说明

在Prelude中,所有行都并行执行,一次执行一列。每行都有自己的堆栈,初始化为无限大的0s。

99+9+
9(1-)

这是我想出的最短方法,可以将a 99放入顶部堆栈(的字符代码c)。首先,我将18最上面的堆栈加起来并推入9推入底部堆栈。然后,底部0循环递减计数,而顶部堆栈则增加计数9。这加起来99在顶部堆栈上,而底部堆栈0再次保留s。请注意,所有+9+操作都是循环的一部分,因此每次迭代实际上有两个加法运算,但这并不是问题,这要归功于0下面 s。

现在 (?)读取STDIN,一次读取一个字符,然后推入顶部堆栈。当?推零时,循环终止于输入的末尾。###摆脱了那个零,the h和the .。现在,下一个循环从顶部堆栈弹出数字,同时将其复制到底部堆栈。这实际上使堆栈反向。请注意,左括号和右括号在不同的行上-这不是问题,因为)在Prelude中无关紧要,但是在第一行上却节省了一个字节。

最后, (!)打印所有字符,直到堆栈为空。


3

Pyth,7个字符

L+\cPPb

说明:

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

尝试这个:

L+\cPPb
y"stdio.h

在网上 Pyth编译器/执行器上


如果允许使用完整程序:

Pyth,6个字符

+\cPPQ

我从未见过Pyth。您会这​​么友善并解释代码吗?:)
fredoverflow


我相信你可以使用PPb,而不是<b_2
FryAmTheEggman

@FryAmTheEggman谢谢。
isaacg 2015年

似乎允许使用完整程序,所以您可以进入
6。– FryAmTheEggman


2

T-SQL-58个字符

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

作为EXEC Q运行(在这里输入您的字符串)


2

Perl — 20个字符

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

请注意,c裸字是如何使用的,因此需要缺少use strict。必须将其用作表达式,而不是语句。


2

Marbelous,24岁

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

通过STDIN输入,输出到STDOUT。

通过使用.0x46)检查每个字节来工作。由于0x46不能容纳一个基数为36的数字,我们Z在进行比较之前先减去35(),然后在输出之前将其加回去。

每个大理石都由 3W(三向复制器,但左侧从板的侧面丢弃)。向下发送的大理石从STDIN获取下一个字节。将右边的大理石选中.,然后输出或发送到!!,从而终止程序。

该程序通过 c0x63),并将其输出到STDOUT。

在这里在线尝试。必须启用库,必须禁用圆柱板。


2

C,64

比c引用略短:

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

大概需要打更多的高尔夫球。


C,48(libc hack)

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

strcpy联机帮助页明确指出“字符串不能重叠”。但是我发现我正在使用的libc似乎已被安全地编码以正确地全部处理。这是Ubuntu 14.04上的GNU C库(Ubuntu EGLIBC 2.19-0ubuntu6.4)。


在C89中省略合法的函数返回类型吗?
fredoverflow

1
@FredOverflow。是的-gcc用编译就很好了-std=c89codegolf.stackexchange.com/a/2204/11259
Digital Trauma

@FredOverflow是的。返回类型默认为int
FUZxxl 2015年

手册页仅重申了该标准-使用VC ++(VS2012)进行编译会为“ stdio.h”提供“ cstdii”。没有检查ICC / Sun / clang,但是您的64字符版本显示“为什么?” -在C语言中(在法律上)要尽可能短。
弗拉

2

JavaScript(ES6)20

不敢相信ES6仍然缺失

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


2

mk,34个字符

mk(1)是Plan 9的make替代品。只是为了好玩,此mkfile将C标头名称转换为C ++标头名称:

c%:Q:
    :

%.h:Q: c%
    echo $prereq

:和之前有一个标签echo。像这样使用:

% mk stdio.h
cstdio


1

TI-BASIC 83 / 84、15

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.