Chuyển đổi tên tiêu đề C thành tên tiêu đề C ++


27

Trong thư viện chuẩn C, tên tiêu đề kết thúc bằng .hhậu tố:

stdio.h

Trong C ++, các tên tiêu đề đó có sẵn ở dạng thay thế, với ctiền tố thay thế:

cstdio

Viết hàm chuyển đổi dạng thứ nhất thành dạng thứ hai. Bạn có thể thực hiện chuyển đổi tại chỗ hoặc giữ nguyên chuỗi gốc và trả về một chuỗi mới. Bất cứ điều gì cảm thấy tự nhiên trong ngôn ngữ của bạn lựa chọn.

Mã phải được biên dịch / giải thích mà không có lỗi. Trình biên dịch cảnh báo được chấp nhận.

Đây là giải pháp C cơ bản của bạn. Nó có 70 ký tự và tạo cảnh báo về strlen:

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

Giải pháp ngắn nhất (tính theo số lượng ký tự) sẽ thắng.

Cập nhật: Nếu ngôn ngữ bạn chọn không hỗ trợ các chức năng, toàn bộ chương trình cũng được chấp nhận.

Cập nhật: Theo đề xuất của FUZxxl, đây là danh sách đầy đủ các tệp tiêu đề trong thư viện chuẩn 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

Cụ thể, không có tên tiêu đề có nhiều dấu chấm trong đó.

Câu trả lời:


37

Mã máy 80386, 13 byte

Mã thập phân của mã:

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

Mã nguồn (có thể được biên dịch bởi 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
    }
}

Nó chuyển đổi chuỗi tại chỗ. Mã này rất đơn giản, nó không cần phải lưu và khôi phục các thanh ghi (chỉ sử dụng alecx, theo fastcallquy ước cho phép ghi đè).


Thật tuyệt, điều này đưa tôi trở lại :)
fredoverflow

Chắc chắn là một trong những giải pháp mát mẻ! Nhưng mã nguồn không thực sự là 13 byte, chỉ là dạng được biên dịch của nó (mà tôi nghĩ rằng ít người trong chúng ta muốn viết trong trình soạn thảo hex).
Per Lundberg

3
Hãy cho anh ta chiến thắng. Byte = character là một cách giải thích hoàn toàn hợp lý ở đây.
Joshua

7
@PerLundberg Tôi thấy mã nguồn trong trường hợp này là "cách thức hoạt động" mở rộng / nhận xét giải thích rằng rất nhiều người bao gồm trong các ngôn ngữ siêu nhỏ gọn của họ. Đối với một chương trình nhỏ như vậy, nó rất có thể đã được viết bằng tay. :)
fluffy

@fluffy Điểm công bằng. Và vâng, số người có thể viết mã nhị phân bằng trái tim chắc chắn là> 0, mặc dù tôi không biết bất cứ ai tự làm phiền mình. ;)
Per Lundberg


14

CJam, 6 byte

'clW(<

Đây là một chương trình đầy đủ đọc chuỗi thông qua STDIN

Giải thích :

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

Dùng thử trực tuyến tại đây


Không phải -2là tốt như W(?
Esolanging Fruit


11

cân não - 25 23 byte

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

Nếu ngôn ngữ bạn chọn không hỗ trợ các chức năng, toàn bộ chương trình cũng được chấp nhận.

Đây là toàn bộ chương trình lấy đầu vào từ 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

Điều này sẽ không bước ra khỏi cạnh trái của băng khi [<]
frageum

@feersum Nếu trình thông dịch của bạn cho phép bạn rời khỏi cạnh trái, vâng. Mỗi cái tôi từng sử dụng vòng lặp băng.
undergroundmonorail

2
@feersum Nếu bạn muốn dùng thử nhưng trình thông dịch của bạn không cho phép bạn rơi ra, bạn có thể sửa nó >ngay từ đầu.
undergroundmonorail

10

Haskell - 23 ký tự

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

Haskell - 16 ký tự, theo đề xuất của nimi

('c':).init.init

2
Việc thả 2 ký tự cuối cùng init.initthay vì lấy hết ký tự đầu tiên sẽ .tiết kiệm được một vài byte.
nimi

@nimi Đó là một gợi ý tuyệt vời!
dòng chảy

10

C, 38

Xem trên Ideone

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

slà một con trỏ tới chuỗi đầu vào và olà nơi đầu ra phải được ghi vào.

Tôi tìm thấy một cách để lạm dụng snprintf. Chuỗi đầu ra thuận tiện xảy ra ngắn hơn một ký tự so với đầu vào và độ dài tối đa của chuỗi được viết bởi snprintfít hơn 1 so với nđối số, vì vậy nó cắt bỏ .h. Lưu ý: kỹ thuật này sẽ không hoạt động với triển khai của Microsoft vì nó thực hiện sai và không thể kết thúc chuỗi.


8

Tập tin Windows Batch 11

@echo c%~n1

Tham số đầu tiên được truyền vào là% 1. Công cụ sửa đổi ~ n chỉ trả về tên tệp mà không có phần mở rộng.

Nếu cũng có thể lặp lại lệnh mở rộng ra màn hình, thì @ ban đầu có thể bị xóa.


8

Kiến trúc TIS Node Kiểu T21 - 85 byte

Câu trả lời này chỉ để cho vui; ngôn ngữ ra đời sau khi thử thách này được viết và do đó tôi không thể chiến thắng với nó. (Không phải là tôi sẽ.)

Được rồi, tôi đã có một niềm vui nhỏ với cái này. Tôi có lẽ chỉ nên gọi ngôn ngữ là "TIS-100", nhưng tại sao lại phá vỡ tính cách? : D

TIS-100 là một trò chơi về lập trình máy tính với kiến ​​trúc hoàn toàn độc đáo và kỳ quái. Tôi đã viết một câu đố tùy chỉnh cho thử thách này, cho phép tôi lấy đầu vào và kiểm tra đầu ra dựa trên một "chuỗi" đã biết chính xác. Thật không may, không có cách nào để xử lý chuỗi hoặc ký tự, vì vậy chương trình này chỉ đơn giản sử dụng giá trị ASCII của mỗi ký tự cho đầu vào và đầu ra.

Nếu bạn muốn thấy nó hoạt động, bạn có thể sử dụng trình giả lập này hoặc chỉ cần xem tôi chạy nó trong trò chơi thực tế ở đây . Lưu ý rằng trong video, dòng cuối cùng của nút đầu tiên là D:MOV UP NIL. Sau khi hoàn thành video, tôi nhận ra rằng tôi có thể đánh golf xuống D:ADD UP. Về mặt chức năng không có sự khác biệt, vì giá trị của ACC ngay lập tức bị ghi đè.

Đây là chuỗi tôi đã sử dụng cho số byte của mình:

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

Đó là văn bản của mỗi nút không trống, được phân tách bằng các dòng mới (thêm hiệu quả 1 byte cho mỗi nút được sử dụng ngoài nút đầu tiên, phản ánh quy tắc của chúng tôi về mã trong nhiều tệp).


7

APL Dyalog (8 ký tự)

'c',¯2↓⊢

Giải pháp này hoàn toàn giống với giải pháp J tôi đã gửi nhưng sử dụng ít hơn một ký tự do ít hơn một ký tự }..


7

J (9 ký tự)

'c',_2}.]
  • |yđộ lớn của y(còn gọi là giá trị tuyệt đối)
  • x }. ythả |xvật phẩm từ y; các mục được thả từ phía trước nếu xlà dương, từ cuối nếu xlà âm.
  • x , yphụ lục xy.
  • 'c' , _2 }. ysự chuyển đổi bạn muốn; trong ký hiệu ngầm, điều này có thể được thể hiện như 'c' , _2 }. ].

7

Đà điểu 0,6,0 , 8 ký tự

););"c\+

)là toán tử "phải uncons". Khi áp dụng cho một chuỗi, nó biến, ví dụ, `foo`thành `fo` `o`. ;được sử dụng để tắt ký tự phụ và điều này được thực hiện lại.

Sau đó, "cđược đẩy. Đây chỉ đơn giản là một tốc ký cho `c`.

\+ hoán đổi hai phần tử ngăn xếp trên cùng và ghép chúng lại.


Là ngôn ngữ này được tạo ra bởi bạn?
Ismael Miguel

@IsmaelMiguel Có. (Xem repo Github chính .)
Doorknob

Tôi nghĩ vậy. Tôi đã kiểm tra nó, do đó suy nghĩ về nó. Không có tài liệu tham khảo về ngôn ngữ đó ở bất cứ đâu. Chỉ ở đây. Vì vậy, tôi cho rằng nó được thực hiện bởi bạn. Đối với một chàng trai 14 tuổi, bạn đã đi rất xa về lập trình. +1000 cho điều đó!
Ismael Miguel

@IsmaelMiguel Rất tiếc, xin lỗi, nên nói với bạn rằng tôi là Bàn phím trên Github. Cảm ơn!
Doorknob

Bạn không cần. Nó gần như ngụ ý. Tôi là ismael-Miguel (rất nguyên bản, hãy kiểm tra github.com/ismael-miguel ). Tôi không có gì thú vị và hữu ích ở đó, nhưng bạn có thể kiểm tra nó. Nhưng tôi quan tâm đến ngôn ngữ của bạn. Điều duy nhất hoàn chỉnh là lớp UIntArray cho php ( github.com/ismael-miguel/php-uintarray nếu bạn quan tâm).
Ismael Miguel

7

piet ( 9x11 = 99 8X11 = 88)

v2

thử khác (2x37 = 74)

nhập mô tả hình ảnh ở đây

Khó có thể làm cho nó nhỏ hơn nhiều vì nó cần tạo 99 ('c') và 46 ('.'), Và điều đó chiếm không gian trong piet.


1
Không bao giờ được tính bằng ký tự, chỉ có mã, vì vậy bạn không cần đề cập đến bit 0 ký tự :) Ngoài ra, đó là rất nhiều màu trắng
Sp3000

cố nén, nhưng hơi khó. Gặp sự cố khiến nó chấm dứt nếu tôi xóa một hàng hoặc cột khác.
captncraig

Đây là một chút gian lận, nhưng tôi thích nó. Điều này giống như sử dụng /dev/nulllàm mã nguồn của bạn.
Ismael Miguel

2
Theo META ( meta.codegolf.stackexchange.com/questions/4782/iêu ), chương trình của bạn không bắt buộc phải kết thúc. Miễn là nó hoạt động, chương trình của bạn có thể chạy mãi mãi. Đọc câu trả lời đầu tiên cho câu hỏi.
Ismael Miguel

6

F # - 39 37 31

31 - Bởi vì sự đánh máy trong đá 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)

Không hoạt động cho một tiêu đề có tên foo.hoo.h.
FUZxxl

3
@FUZxxl Không có tiêu đề như vậy trong thư viện chuẩn C.
dòng chảy

@FredOverflow Bạn có thể muốn chỉ định nhóm tên mà phép chuyển đổi phải hoạt động. Ngay bây giờ câu hỏi của bạn được diễn đạt theo cách có thể khiến mọi người cho rằng loại đầu vào này phải hoạt động chính xác.
FUZxxl

@FUZxxl Tôi đã cập nhật câu hỏi cho phù hợp.
dòng chảy



4

GNU sed -r, 14

sed thực sự không có bất kỳ khái niệm nào về chức năng, vì vậy đây là một chương trình sed hoàn chỉnh thay thế:

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

Đầu ra

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

Các -rđã được đưa vào số điểm như là một nhân vật phụ.


Giải pháp này không hợp lệ: Có lẽ nên s/\(.*\)\.h/c\1/thay thế.
FUZxxl

@FUZxxl - Tôi giả sử -rđược truyền cho sed. Theo mã golf thông thường , tôi cần tính đó là một điểm phụ.
Chấn thương kỹ thuật số

@DigitalTraume Lưu ý rằng đó -rkhông phải là một tùy chọn tiêu chuẩn và không có sẵn bên ngoài GNU sed. Bạn có thể muốn thay đổi tên ngôn ngữ thành GNU sed để phản ánh điều đó.
FUZxxl

@FUZxxl Vâng. Làm xong.
Chấn thương kỹ thuật số

2
\.hcó thể rút ngắn thành..
Steven Taschuk 14/2/2015

3

Mở đầu , 31 ký tự

Vì việc gửi chương trình đầy đủ rõ ràng có thể chấp nhận được, đây là chương trình đọc tiêu đề kiểu C từ STDIN và in tiêu đề kiểu C ++ sang STDOUT:

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

Điều này đòi hỏi một trình thông dịch tuân thủ tiêu chuẩn in đầu ra dưới dạng mã ký tự. Nếu bạn đang sử dụng trình thông dịch Python, bạn sẽ cần đặt NUMERIC_OUTPUT = False.

Nó cũng yêu cầu rằng không có dòng mới trên STDIN.

Giải trình

Trong Prelude, tất cả các dòng được thực thi song song, mỗi cột một cột. Mỗi dòng có ngăn xếp riêng, được khởi tạo với số lượng 0s vô hạn .

99+9+
9(1-)

Đây là lần ngắn nhất tôi có thể nghĩ ra để có được một 99ngăn xếp trên cùng (mã ký tự của c). Đầu tiên tôi thêm 18vào ngăn xếp trên cùng và đẩy a 9lên ngăn xếp dưới cùng. Phía dưới sau đó đếm ngược xuống 0trong một vòng lặp, trong khi ngăn xếp trên cùng thêm nhiều 9s lên. Điều này thêm 99vào trên ngăn xếp trên cùng và ngăn xếp dưới cùng được để lại 0s. Lưu ý rằng tất cả đều +9+là một phần của vòng lặp, vì vậy thực sự có hai thao tác bổ sung cho mỗi lần lặp, nhưng đó không phải là vấn đề, nhờ vào nguồn cung cấp vô hạn của0 s bên dưới.

Bây giờ (?)đọc STDIN, một ký tự một lần và đẩy lên ngăn xếp trên cùng. Vòng lặp kết thúc ở cuối đầu vào, khi ?đẩy số không. ###được thoát khỏi điều đó không, h.. Bây giờ vòng lặp tiếp theo bật số từ ngăn xếp trên cùng trong khi sao chép chúng vào ngăn xếp dưới cùng. Điều này về cơ bản đảo ngược ngăn xếp. Lưu ý rằng dấu ngoặc đơn mở và đóng nằm trên các dòng khác nhau - đây không phải là vấn đề, vì vị trí dọc của) không liên quan trong Prelude, nhưng nó giúp tôi tiết kiệm một byte trên dòng đầu tiên.

Cuối cùng, (!)in tất cả các ký tự cho đến khi ngăn xếp trống.


3

Pyth, 7 ký tự

L+\cPPb

Giải trình:

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

Thử đi:

L+\cPPb
y"stdio.h

trên mạng Trình biên dịch / thực thi Pyth


Nếu chương trình đầy đủ được cho phép:

Bình thường, 6 ký tự

+\cPPQ

Tôi chưa bao giờ thấy Pyth. Bạn sẽ rất tử tế và giải thích mã? :)
dòng chảy


Tôi tin rằng bạn có thể sử dụng PPbthay vì<b_2
FryAmTheEggman

@FryAmTheEggman Cảm ơn.
isaacg

Có vẻ như các chương trình đầy đủ được cho phép, vì vậy bạn có thể nhận được tới 6.
FryAmTheEggman

3

C ++ 14, 41 ký tự

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

Lấy cảm hứng từ câu trả lời khác này . Tôi đã làm cho nó một câu trả lời riêng vì ở đây tôi sử dụng một tính năng mới trong c ++ 14, lambda chung .

Xem nó trong hành động ở đây .


2

T-SQL - 58 ký tự

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

Chạy dưới dạng EXEC Q (chuỗi của bạn ở đây)


2

Perl - 20 ký tự

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

Lưu ý làm thế nào clà một bareword và như vậy điều này đòi hỏi thiếu use strict. Điều này phải được sử dụng như một biểu thức, không phải là một tuyên bố.


2

Tuyệt vời, 24

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

Đưa đầu vào qua STDIN, đầu ra thành STDOUT.

Điều này hoạt động bằng cách kiểm tra từng byte với .( 0x46). Vì 0x46không thể vừa trong một chữ số cơ sở 36, chúng tôi trừ 35 ( Z) trước khi so sánh và thêm lại trước khi xuất.

Mỗi viên bi được nhân đôi bởi 3W(máy sao chép ba chiều, nhưng mặt trái bị loại bỏ khỏi mặt bảng). Viên bi được gửi xuống lấy byte tiếp theo từ STDIN. Đá cẩm thạch ở bên phải được kiểm tra ., sau đó xuất ra hoặc gửi đến!! , kết thúc chương trình.

Chương trình bắt đầu bằng cách chuyển c( 0x63) qua, sẽ xuất ra STDOUT.

Hãy thử trực tuyến tại đây. Thư viện phải được kích hoạt, bảng hình trụ phải được vô hiệu hóa.


2

C, 64

Hơi ngắn hơn so với tham chiếu c:

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

Có lẽ nhiều golf để được thực hiện với điều này.


C, 48 (hack libc)

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

Trang chủ strcpynêu rõ "Các chuỗi có thể không trùng nhau". Tuy nhiên tôi thấy rằng libc tôi đang sử dụng dường như được mã hóa an toàn để xử lý chính xác tất cả như vậy. Đây là Thư viện GNU C (Ubuntu EGLIBC 2.19-0ubfox6.4) trên Ubuntu 14.04.


Là bỏ qua kiểu trả về của một hàm hợp pháp trong C89?
dòng chảy

1
@FredOverflow. Có - gcc biên dịch điều này chỉ tốt với -std=c89. codegolf.stackexchange.com/a/2204/11259
Chấn thương kỹ thuật số

@FredOverflow Có. Kiểu trả về mặc định là int.
FUZxxl

Trang man chỉ nhắc lại Tiêu chuẩn - biên dịch cái này với VC ++ (VS2012) cho "cstdii" cho "stdio.h". Không kiểm tra ICC / Sun / clang, nhưng phiên bản 64-char của bạn nói "tại sao?" - nó ngắn nhất có thể (về mặt pháp lý) ở C.
frasnian

2

JavaScript (ES6) 20

Không thể tin ES6 vẫn mất tích

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


2

mk, 34 ký tự

mk (1) là sự thay thế Plan 9 cho make. Để cho vui, mkfile này chuyển đổi tên tiêu đề C thành tên tiêu đề C ++:

c%:Q:
    :

%.h:Q: c%
    echo $prereq

Có một tab duy nhất trước :echo. Sử dụng như thế này:

% mk stdio.h
cstdio



1

R, 33

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

Hàm này sử dụng các biểu thức chính quy.

Ví dụ sử dụng:

> (function(x)sub("(.+)..","c\\1",x))("stdio.h")
[1] "cstdio"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.