Cヘッダー名をC ++ヘッダー名に変換する


27

C標準ライブラリでは、ヘッダー名は.hサフィックスで終わります。

stdio.h

C ++では、これらのヘッダー名は代替形式で利用できますが、代わりにcプレフィックスが付いています。

cstdio

最初の形式を2番目の形式に変換する関数を作成します。変換はインプレースで行うことも、元の文字列をそのままにして新しい文字列を返すこともできます。選択した言語で自然に感じるものは何でも。

コードはエラーなしでコンパイル/解釈する必要があります。コンパイラの警告は受け入れられます。

これがベースライン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

具体的には、複数のドットを含むヘッダー名はありません。

回答:


37

80386マシンコード、13バイト

コードのHexdump:

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

文字列をその場で変換します。コードはシンプルなのであり、それは(のみ使用してレジスタを保存および復元する必要はありませんalし、ecxこれは、fastcall大会がクロバーすることができます)。


ニース、これは私を取り戻します:)
fredoverflow

間違いなくクールなソリューションの1つです!ただし、ソースコードは実際には13バイトではなく、コンパイルされた形式のみです(16進エディタで記述したい人はほとんどいないと思います)。
ルンドバーグあたり

3
彼に彼の勝利を与えます。ここでは、バイト=文字は完全に合理的な解釈です。
ジョシュア

7
@PerLundbergこの場合のソースコードは、多くの人が超コンパクト言語に含める「仕組み」の拡張/コメント付きの説明だと思います。このような小さなプログラムの場合、手書きで作成することもできます。:)
ふわふわ

@ふわふわフェアポイント。ええ、私が自分でこっけいな人を知らない場合でも、バイナリコードを暗記できる人の数は確かに0を超えています。;)
ランドバーグあたり


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(か?
エソランジングフルーツ


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

@feersum通訳者が左端から降りることを許可している場合、はい。私が使ったことのある人は全員テープをループします。
地下

2
@feersumあなたがそれを試してみたいが、あなたの通訳があなたを落とすことを許すなら、あなた>は最初にそれを修正することができます。
地下

10

Haskell — 23文字

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

Haskell — nimiが示唆する16文字

('c':).init.init

2
init.init最初の文字をすべて使用する代わりに、最後の2文字を使用すると.、数バイト節約できます。
-nimi

@nimiそれは素晴らしい提案です!
fredoverflow

10

C、38

イデオンで見る

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

s 入力文字列へのポインタであり、 oであり、出力の書き込み先です。

虐待する方法を見つけましたsnprintf。出力文字列は、入力よりも1文字短くなるのが便利であり、書き込まれる文字列の最大長は引数snprintfより1少ないnため、を切り捨てます.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ソリューションとまったく同じですが、が1文字少ないために1文字少なくなり}.ます。


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、8文字

););"c\+

)「正しい不一致」演算子です。文字列に適用された場合、それは、例えば、ターン`foo``fo` `o`;余分な文字をポップするために使用され、これは再び行われます。

その後、"cプッシュされます。これは単にの省略形です`c`

\+ 上の2つのスタック要素を交換して連結します。


この言語はあなたによって作成されましたか?
イスマエルミゲル

@IsmaelMiguelはい。(メインのGithubリポジトリを参照してください。)
ドアノブ

私もそうだ。私はすでにそれをチェックしたので、それについて考えました。その言語に関する参照はどこにもありません。ここだけ。だから、私はそれがあなたによって作られたと仮定しました。14歳の男性の場合、あなたはプログラミングに本当に行きました。そのために+1000!
イスマエルミゲル

@IsmaelMiguel Whoops、すみません、私はGithubのKeyboardFireだと言っているはずです。ありがとう!
ドアノブ

する必要はありません。それはほとんど暗示されています。私は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( '。')を生成する必要があるため、はるかに小さくすることは難しく、スペースを節約します。


1
ピートのあなたは0文字に言及する必要はありませんので、ビット:)また、白のたくさんだと、文字のみcodelsで測定されたことはありません
SP3000

圧縮しようとしていますが、少し難しいです。さらに別の行または列を削除すると、終了に問題が発生します。
captncraig

これは少し不正行為ですが、私はそれが好きです。これは/dev/null、ソースコードとして使用するようなものです。
イスマエルミゲル

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

3
@FUZxxl C標準ライブラリにはそのようなヘッダーはありません。
fredoverflow

@FredOverflow変換が機能する必要のある名前のセットを指定することができます。現在、あなたの質問は、この種の入力が正しく機能する必要があると人々が思うようになるような言葉で表現されています。
FUZxxl

@FUZxxlそれに応じて質問を更新しました。
fredoverflow



4

GNU sed -r、14

sedには実際には関数の概念がないため、代わりに完全なsedプログラムを示します。

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

出力

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

-r1つの余分な文字としてスコアに含まれています。


この解決策は無効ですs/\(.*\)\.h/c\1/。おそらく代わりにあるはずです。
FUZxxl

@FUZxxl- -rはsedに渡されると仮定しています。通常のコードゴルフに従って、私はそれを余分なポイントとして数える必要があります。
デジタル外傷

@DigitalTraume -rこれは標準オプションではなく、GNU sed以外では利用できないことに注意してください。それを反映するために、言語名をGNU sedに変更することをお勧めします。
-FUZxxl

@FUZxxlはい。できた
デジタル外傷

2
\.h短縮することができます..
スティーブンタシュク

3

プレリュード、31文字

完全なプログラムの提出は明らかに受け入れられるため、ここではSTDINからCスタイルのヘッダーを読み取り、C ++スタイルのヘッダーをSTDOUTに出力するプログラムを示します。

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

これには、出力を文字コードとして出力する標準準拠のインタープリターが必要です。Pythonインタープリターを使用している場合は、を設定する必要がありますNUMERIC_OUTPUT = False

また、STDINには末尾の改行がないことが必要です。

説明

Preludeでは、すべての行が一度に1列ずつ並行して実行されます。各行には、無限の0sに初期化された独自のスタックがあります。

99+9+
9(1-)

これは、一番99上のスタック(の文字コードc)に到達するために考え出した最短です。まず18、一番上のスタックに追加し、一番下のスタックにプッシュし9ます。一番下の0スタックはループ内でカウントダウンし、一番上のスタックはさらに9sを加算します。これにより99、一番上のスタックに追加され、一番下のスタックには0再びs が残ります。すべてが+9+ループの一部であることに注意してください。したがって、実際には反復ごとに2つの加算演算がありますが、それは問題ではありません。0

(?)STDIN、トップスタックに時間とプッシュで1つの文字読み込みます。ループは?、ゼロをプッシュすると、入力の終わりで終了します。###そのゼロ、the hおよびを取り除き.ます。これで、次のループは、一番上のスタックから数字をポップしながら一番下のスタックにコピーします。これは基本的にスタックを逆にします。開き括弧と閉じ括弧が異なる行にあることに注意してください-これは問題ではありません。なぜなら、)Preludeの垂直方向の位置は関係ないのですが、最初の行で1バイト節約できます。

最後に、(!)スタックが空になるまですべての文字を出力します。


3

Pyth、7文字

L+\cPPb

説明:

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

これを試して:

L+\cPPb
y"stdio.h

オンラインのPyth Compiler / Executorで


完全なプログラムが許可された場合:

パイス、6文字

+\cPPQ

私はPythを見たことがありません。あなたはとても親切でコードを説明しますか?:)
fredoverflow


PPb代わりに使用できると思います<b_2
-FryAmTheEggman

@FryAmTheEggmanありがとう。
isaacg

完全なプログラムが許可されているようですので、6に到達できます。
FryAmTheEggman15年

3

C ++ 14、41文字

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

この他の答えに触発されました。ここでは、c ++ 14の新しい機能である汎用ラムダを使用しているため、別の回答にしました。

アクションでそれを参照してくださいここに


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

マーベラス、24

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

STDINを介して入力を受け取り、STDOUTに出力します。

これは、各バイトを.0x46)でます。0x46単一ベース36桁に収まることができない、我々は(35を引きますZ比較する前)に、そして出力する前に、それを再度追加します。

各大理石は 3W(3方向の複製器でが、左側はボードの側面から捨てられます)。下向きに送信された大理石は、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ハック)

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

strcpymanページには、明示的に「文字列が重複しないかもしれません」述べています。しかし、私が使用しているlibcは、これをすべて同じように正しく処理するために安全にコーディングされているようです。これは、Ubuntu 14.04上のGNU Cライブラリ(Ubuntu EGLIBC 2.19-0ubuntu6.4)です。


C89で関数の戻り値の型の省略は有効ですか?
fredoverflow

1
@FredOverflow。はい-gccはこれをでうまくコンパイルし-std=c89ます。 codegolf.stackexchange.com/a/2204/11259
デジタルトラウマ

@FredOverflowはい。戻り値のタイプはデフォルトでintです。
FUZxxl

マニュアルページは、単に標準を繰り返しています-これを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)は、makeのPlan 9の代替です。楽しみのために、このmkfileはCヘッダー名をC ++ヘッダー名に変換します。

c%:Q:
    :

%.h:Q: c%
    echo $prereq

:との前に単一のタブがありますecho。次のように使用します。

% mk stdio.h
cstdio



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.