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

특히 여러 점이있는 헤더 이름이 없습니다.

답변:


37

80386 머신 코드, 13 바이트

코드의 16 진 덤프 :

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

더 멋진 솔루션 중 하나! 그러나 소스 코드는 실제로 13 바이트가 아니며 컴파일 된 형식 (16 진수 편집기로 작성하고 싶지는 않습니다).
Per Lundberg

3
그의 승리를 줘. 바이트 = 문자는 여기에서 완벽하게 합리적인 해석입니다.
Joshua

7
@PerLundberg이 경우 소스 코드는 많은 사람들이 초소형 언어로 포함하는 "작동 방식"확장 / 설명 설명 인 것으로 생각합니다. 이러한 작은 프로그램의 경우 수작업으로 작성했을 수 있습니다. :)
푹신한

@ 솜털 페어 포인트. 그리고 그래, 바이너리 코드를 마음에 쓸 수있는 사람들의 수는 확실히> 0입니다. ;)
Per Lundberg




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 통역사가 왼쪽 가장자리를 내릴 수 있다면 가능합니다. 내가 사용한 모든 사람이 테이프를 반복합니다.
undergroundmonorail

2
@feersum 당신이 그것을 시도하고 싶지만 통역사가 당신을 넘어지게 할 수 있다면, 당신은 >처음에 그것을 고칠 수 있습니다 .
undergroundmonorail

10

하스켈 — 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. 출력 문자열은 편리하게 입력보다 하나의 문자보다 짧으며, 문자열의 최대 길이 snprintfn인수 보다 1이 짧 으므로을 잘라냅니다 .h. 참고 :이 기술은 잘못된 일을하고 문자열을 null로 종료하지 못하기 때문에 Microsoft의 구현에서는 작동하지 않습니다.


8

Windows 배치 파일 11

@echo c%~n1

첫 번째로 전달 된 매개 변수는 % 1입니다. ~ n 수정자는 확장자가없는 파일 이름 만 반환합니다.

확장 된 명령을 화면에 반영하는 것이 허용되는 경우 초기 @를 제거 할 수 있습니다.


8

TIS 노드 유형 T21 아키텍처-85 바이트

이 답변은 단지 재미를위한 것입니다. 이 도전이 쓰여진 후 언어가 존재하기 때문에 나는이 언어로 이길 수 없습니다. (내가 아니었다.)

좋아, 나는 이것과 약간의 재미를 가지고 있었다. 아마 해야 바로 언어 "TIS-100",하지만 왜 휴식 캐릭터를 호출? :디

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는 IS 크기y(또한 절대치)
  • x }. y에서 상품을 삭제 |x합니다 y. 항목이 x양수 이면 앞쪽에서 떨어지고 끝이면 x음수입니다.
  • x , y추가 x하고 y.
  • 'c' , _2 }. y당신이 원하는 변화를합니까; 암묵적 표기법에서 이것은 다음과 같이 표현 될 수있다 'c' , _2 }. ].

7

타조 0.6.0 , 8 자

););"c\+

)"권리없는"연산자입니다. 문자열에 적용하면, 예를 들어, 회전 `foo``fo` `o`. ;추가 문자를 튀어 나오는데 사용되며 다시 수행됩니다.

그런 다음 "c푸시됩니다. 이것은 간단히 설명합니다 `c`.

\+ 상위 2 개의 스택 요소를 교체하고 연결합니다.


이 언어는 당신에 의해 만들어 졌습니까?
Ismael Miguel

@IsmaelMiguel 예. ( 주요 Github 리포지토리 참조 )
Doorknob

그래도 그래 이미 확인 했으므로 생각했습니다. 해당 언어에 대한 참조는 어디에도 없습니다. 여기서 만. 그래서 나는 그것이 당신에 의해 만들어진 것으로 가정했습니다. 14 살짜리 녀석은 정말 프로그래밍에 갔다. 그것을 위해 +1000!
Ismael Miguel

@IsmaelMiguel Whoops, 죄송합니다 . Github의 KeyboardFire 입니다. 감사!
Doorknob

필요하지 않습니다. 거의 암시 적입니다. 나는 ismael-miguel입니다 (아주 독창적 인 github.com/ismael-miguel 확인 ). 나는 거기에 흥미롭고 유용한 것이 없지만 당신은 그것을 확인할 수 있습니다. 하지만 나는 당신의 언어에 관심이 있습니다. 유일하게 완전한 것은 PHP 용 UIntArray 클래스입니다 ( 관심이 있다면 github.com/ismael-miguel/php-uintarray ).
Ismael Miguel

7

PIET ( 9x11 = 99 8X11 = 88)

v2

다른 시도 (2x37 = 74)

여기에 이미지 설명을 입력하십시오

99 ( 'c')와 46 ( '.')을 생성해야하기 때문에 훨씬 작게 만들기가 어렵습니다.


1
당신이 0 문자는 비트 :) 또한 흰색이 많이 있다고 언급 할 필요가 없습니다 피에트는 문자 만 codels 측정 결코
SP3000

압축하려고 시도하지만 조금 어렵습니다. 다른 행이나 열을 제거하면 종료하는 데 문제가 있습니다.
captncraig

이것은 약간의 부정 행위이지만, 나는 그것을 좋아합니다. 이것은 /dev/null소스 코드로 사용하는 것과 같습니다 .
Ismael Miguel

2
META ( meta.codegolf.stackexchange.com/questions/4782/… ) 에 따르면 프로그램을 완료하지 않아도됩니다. 그것이하는 한, 당신의 프로그램은 영원히 실행될 수 있습니다. 질문에 대한 첫 번째 답변을 읽으십시오.
Ismael Miguel

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 16:13에

@FredOverflow 변환이 작동해야하는 이름 집합을 지정할 수 있습니다. 현재 귀하의 질문은 사람들이 이러한 종류의 입력이 올바르게 작동해야한다고 가정 할 수있는 방식으로 표현되었습니다.
FUZxxl

@ FUZxxl 그에 따라 질문을 업데이트했습니다.
fredoverflow 17



4

GNU sed -r, 14

sed에는 실제로 기능 개념이 없으므로 완전한 sed 프로그램이 있습니다.

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

산출

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

-r추가 문자로 점수에 포함되었습니다.


이 솔루션은 유효하지 않습니다. s/\(.*\)\.h/c\1/대신에 가능해야 합니다.
FUZxxl

@FUZxxl- -rsed에 전달 되었다고 가정 합니다. 일반적인 코드 골프에 따라 추가 포인트로 계산해야합니다.
디지털 외상

@DigitalTraume -r표준 옵션이 아니며 GNU sed 외부에서는 사용할 수 없습니다. 언어 이름을 GNU sed로 변경하여이를 반영 할 수 있습니다.
FUZxxl

@FUZxxl 예. 끝난.
디지털 외상

2
\.h단축 할 수있다..
스티븐 Taschuk

3

전주곡 , 31 자

전체 프로그램 제출은 분명히 수용 가능하므로 STDIN에서 C 스타일 헤더를 읽고 C ++ 스타일 헤더를 STDOUT에 인쇄하는 프로그램이 있습니다.

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

출력을 문자 코드로 인쇄하는 표준 호환 인터프리터가 필요합니다. 파이썬 인터프리터 를 사용 하는 경우 설정해야합니다.NUMERIC_OUTPUT = False .

또한 STDIN에 줄 바꿈이 없어야합니다.

설명

Prelude에서는 모든 행이 한 번에 한 열씩 병렬로 실행됩니다. 각 줄에는 고유의 스택이 있으며 무한한 양의 0s로 초기화됩니다 .

99+9+
9(1-)

이것은 99최고 스택 (의 문자 코드 c) 을 얻을 수있는 가장 짧은 것 입니다. 먼저 18상단 스택에 추가 9하고 하단 스택 에을 밀어 넣습니다 . 그런 다음 하단 0은 루프에서 카운트 다운되고 상단 스택은 더 많은 9S를 추가 합니다. 이것은 99상단 스택에 추가되고 하단 스택은 0다시 s 로 남습니다 . 모두 +9+루프의 일부이므로 반복마다 실제로 두 개의 추가 작업이 있지만 무한 공급으로 인해 문제가되지 않습니다.0 아래에 s .

이제 (?)한 번에 한 문자 씩 STDIN을 읽고 맨 위 스택으로 푸시합니다. 루프 ?는 0 을 누르면 입력 끝에서 종료 됩니다. ###그 0, 및를 제거 h합니다 .. 이제 다음 루프는 맨 위 스택에서 번호를 팝하면서 맨 아래 스택으로 복사합니다. 이것은 본질적으로 스택을 뒤집습니다. 여는 괄호와 닫는 괄호는 다른 줄 )에 있습니다. Prelude에서는 세로 위치 가 관련이 없기 때문에 문제가되지 않지만 첫 번째 줄에서 바이트를 절약 할 수 있습니다.

마지막으로, (!)스택이 비워 질 때까지 모든 문자를 인쇄합니다.


3

Pyth, 7 자

L+\cPPb

설명:

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

이 시도:

L+\cPPb
y"stdio.h

온라인 Pyth Compiler / Executor에서


전체 프로그램이 허용 된 경우 :

Pyth, 6 자

+\cPPQ

나는 Pyth를 본 적이 없다. 친절하고 코드를 설명해 주시겠습니까? :)
fredoverflow


나는 당신이 사용할 수 있다고 생각 PPb대신에<b_2
FryAmTheEggman

@FryAmTheEggman 감사합니다.
isaacg 2012

전체 프로그램이 허용되는 것 같습니다. 따라서 6시에 갈 수 있습니다.
FryAmTheEggman

3

C ++ 14, 41 자

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

다른 답변에서 영감을 얻었습니다 . 여기에서는 c ++ 14의 새로운 기능인 generic lambda를 사용하기 때문에 별도의 답변을 만들었습니다 .

여기 에서 실제로 확인 하십시오 .


2

T-SQL — 58 자

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

EXEC Q로 실행 (여기서 문자열)


2

펄 — 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에서 다음 바이트를 가져옵니다. 오른쪽에있는 구슬은로 확인 된 .다음 출력되거나 전송됩니다.!! 프로그램이 종료됩니다.

프로그램은 통과하여 시작 c ( 0x63)을 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;}

strcpy맨 명시 적으로 "문자열이 중복되지 않을 수 있습니다"상태. 그러나 내가 사용하는 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

자바 스크립트 (ES6) 20

ES6이 여전히 누락되었다고 믿을 수 없음

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


2

mk, 34 자

mk (1)은 make의 대체 계획 9입니다. 재미있게이 mkfile은 C 헤더 이름을 C ++ 헤더 이름으로 변환합니다.

c%:Q:
    :

%.h:Q: c%
    echo $prereq

:및 앞에 단일 탭이 있습니다 echo. 다음과 같이 사용하십시오.

% mk stdio.h
cstdio



1

R, 33

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

이 함수는 정규식을 사용합니다.

사용법 예 :

> (function(x)sub("(.+)..","c\\1",x))("stdio.h")
[1] "cstdio"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.