Ubah nama header C menjadi nama header C ++

27

Di pustaka standar C, nama header diakhiri dengan .hakhiran:

stdio.h

Dalam C ++, nama-nama header itu tersedia dalam bentuk alternatif, dengan cawalan sebagai gantinya:

cstdio

Tulis fungsi yang mengubah bentuk pertama menjadi bentuk kedua. Anda dapat melakukan konversi di tempat, atau membiarkan string asli tetap utuh dan mengembalikan string baru. Apapun terasa alami dalam bahasa pilihan Anda.

Kode harus dikompilasi / ditafsirkan tanpa kesalahan. Peringatan kompiler dapat diterima.

Inilah solusi baseline C Anda. Ini memiliki 70 karakter dan menghasilkan peringatan tentang strlen:

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

Solusi terpendek (diukur dalam jumlah karakter) menang.

Pembaruan: Jika bahasa pilihan Anda tidak mendukung fungsi, seluruh program juga dapat diterima.

Pembaruan: Seperti yang disarankan oleh FUZxxl, berikut adalah daftar lengkap file header di pustaka standar 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

Secara khusus, tidak ada nama header dengan banyak titik di dalamnya.

fredoverflow
sumber

Jawaban:

37

80386 kode mesin, 13 byte

Hexdump kode:

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

Kode sumber (dapat dikompilasi oleh 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
    }
}

Itu mengkonversi string di tempat. Kode ini sangat sederhana, tidak perlu menyimpan dan mengembalikan register (hanya menggunakan aldan ecx, yang fastcallmemungkinkan konvensi untuk clobber).

anatolyg
sumber
Bagus, ini membawaku kembali :)
fredoverflow
Pasti salah satu solusi keren! Tetapi kode sumber sebenarnya bukan 13 byte, hanya bentuk yang dikompilasi (yang saya pikir beberapa dari kita ingin menulis dalam hex editor).
Per Lundberg
3
Beri dia kemenangannya. Byte = karakter adalah interpretasi yang sangat masuk akal di sini.
Yosua
7
@ PerLundberg Saya melihat kode sumber dalam kasus ini sebagai penjelasan "cara kerjanya" memperluas / berkomentar bahwa banyak orang memasukkan dalam bahasa ultra-kompak mereka. Untuk program sekecil itu bisa sangat baik ditulis tangan. :)
fluffy
@Fluffy Fair point. Dan ya, jumlah orang yang bisa menulis kode biner dengan hati tentu> 0, meskipun saya sendiri tidak tahu siapa yang culun. ;)
Per Lundberg
14

Python: 19 karakter

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

CJam, 6 byte

'clW(<

Ini adalah program lengkap yang membaca string melalui STDIN

Penjelasan :

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

Cobalah online di sini

Pengoptimal
sumber
Bukankah -2sebagus itu W(?
Buah Esolanging
12

Java 8 - 25 karakter

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

brainfuck - 25 23 byte

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

Jika bahasa pilihan Anda tidak mendukung fungsi, seluruh program juga dapat diterima.

Ini adalah keseluruhan program yang menerima masukan dari 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
monmon bawah tanah
sumber
Bukankah ini akan keluar dari tepi kiri pita pada [<]
feersum
@feersum Jika penerjemah Anda memungkinkan Anda keluar dari tepi kiri, ya. Setiap orang yang pernah saya gunakan loop rekaman.
undergroundmonorail
2
@feersum Jika Anda ingin mencobanya tetapi juru bahasa Anda memungkinkan Anda terjatuh, Anda dapat memperbaikinya dengan >di awal.
undergroundmonorail
10

Haskell - 23 karakter

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

Haskell - 16 karakter, seperti yang disarankan oleh nimi

('c':).init.init
fredoverflow
sumber
2
Menjatuhkan 2 karakter terakhir dengan init.initalih - alih mengambil semua hingga yang pertama .menghemat beberapa byte.
nimi
@nimi Itu saran yang luar biasa!
fredoverflow
10

C, 38

Lihat di Ideone

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

s adalah pointer ke string input, dan o merupakan tempat output harus ditulis.

Saya menemukan cara untuk penyalahgunaan snprintf. String keluaran dengan mudah menjadi satu karakter lebih pendek dari input, dan panjang maksimum string yang ditulis oleh snprintfadalah 1 kurang dari nargumen, sehingga memotong .h. Catatan: teknik ini tidak akan berfungsi dengan implementasi Microsoft karena melakukan hal yang salah dan gagal untuk mengakhiri-null string.

feersum
sumber
8

File Batch Windows 11

@echo c%~n1

Parameter pertama yang diteruskan adalah% 1. Pengubah ~ n mengembalikan hanya nama file tanpa ekstensi.

Jika dapat diterima untuk mengulangi perintah yang diperluas ke layar juga, maka @ awal dapat dihapus.

Ahli alkimia
sumber
8

TIS Node Type T21 Architecture - 85 byte

Jawaban ini hanya untuk bersenang-senang; bahasa muncul setelah tantangan ini ditulis dan karena itu saya tidak bisa menang dengannya. (Bukannya aku akan pergi.)

Oke, saya bersenang-senang dengan ini. Saya mungkin hanya harus memanggil bahasa "TIS-100", tetapi mengapa memecah karakter? : D

TIS-100 adalah gim tentang memprogram komputer dengan arsitektur yang benar-benar unik dan aneh. Saya menulis teka-teki khusus - untuk tantangan ini, yang memungkinkan saya untuk mengambil input dan memeriksa output terhadap "string" yang dikenal benar. Sayangnya, tidak ada cara untuk menangani string atau karakter, sehingga program ini hanya menggunakan nilai ASCII dari setiap karakter untuk input dan output.

Jika Anda ingin melihatnya dalam aksi, Anda dapat menggunakan emulator ini , atau perhatikan saya menjalankannya di gim yang sebenarnya di sini . Perhatikan bahwa dalam video, baris terakhir dari simpul pertama adalah D:MOV UP NIL. Setelah menyelesaikan videonya, saya menyadari bahwa saya bisa memainkannya D:ADD UP. Secara fungsional tidak ada perbedaan, karena nilai ACC segera ditimpa pula.

Ini adalah string yang saya gunakan untuk jumlah byte saya:

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

Itulah teks dari setiap node yang tidak kosong, dipisahkan oleh baris baru (secara efektif menambahkan 1 byte untuk setiap node yang digunakan di luar yang pertama, mencerminkan aturan kami tentang kode dalam beberapa file).

monmon bawah tanah
sumber
7

Dyalog APL (8 karakter)

'c',¯2↓⊢

Solusi ini persis sama dengan solusi J yang saya kirimkan tetapi menggunakan satu karakter lebih sedikit karena menjadi satu karakter kurang dari }..

FUZxxl
sumber
7

J (9 karakter)

'c',_2}.]
  • |yadalah besarnya dari y(juga disebut nilai absolut)
  • x }. ymenjatuhkan |xitem dari y; barang dijatuhkan dari depan jika xpositif, dari ujung jika xnegatif.
  • x , ymenambahkan xdan y.
  • 'c' , _2 }. yapakah transformasi yang Anda inginkan; dalam notasi diam-diam ini dapat dinyatakan sebagai 'c' , _2 }. ].
FUZxxl
sumber
7

Burung unta 0.6.0 , 8 karakter

););"c\+

)adalah operator "right uncons". Ketika diterapkan ke string, itu berubah, misalnya, `foo`menjadi `fo` `o`. ;digunakan untuk menghapus karakter tambahan, dan ini dilakukan lagi.

Kemudian, "cdidorong. Ini hanya singkatan untuk `c`.

\+ menukar dua elemen tumpukan teratas dan menggabungkannya.

Gagang pintu
sumber
Apakah bahasa ini dibuat oleh Anda?
Ismael Miguel
@ IsmaelMiguel Ya. (Lihat repo Github utama .)
Gagang pintu
Saya pikir begitu. Saya sudah memeriksanya, karena itu memikirkannya. Tidak ada referensi tentang bahasa itu di mana pun. Hanya disini. Jadi, saya berasumsi itu dibuat oleh Anda. Untuk seorang pria berusia 14 tahun, Anda telah melangkah jauh dalam pemrograman. +1000 untuk itu!
Ismael Miguel
@IsmaelMiguel Whoops, maaf, seharusnya memberi tahu Anda bahwa saya KeyboardFire di Github. Terima kasih!
Gagang Pintu
Anda tidak perlu melakukannya. Ini hampir tersirat. Saya ismael-miguel (sangat orisinal, periksa github.com/ismael-miguel ). Saya tidak ada yang menarik dan berguna di sana, tetapi Anda dapat memeriksanya. Tapi saya tertarik dengan bahasa Anda. Satu-satunya hal yang lengkap adalah kelas UIntArray untuk php ( github.com/ismael-miguel/php-uintarray jika Anda tertarik).
Ismael Miguel
7

piet ( 9x11 = 99 8X11 = 88)

v2

percobaan lain (2x37 = 74)

masukkan deskripsi gambar di sini

Sulit membuatnya jauh lebih kecil karena perlu menghasilkan 99 ('c') dan 46 ('.'), Dan itu membutuhkan ruang di piet.

captncraig
sumber
1
Piet tidak pernah diukur dalam karakter, hanya kode, jadi Anda tidak perlu menyebutkan 0 karakter sedikit :) Juga itu banyak warna putih
Sp3000
mencoba kompres, tetapi agak sulit. Kesulitan menghentikannya jika saya menghapus baris atau kolom yang lain.
captncraig
Ini sedikit curang, tapi saya suka itu. Ini seperti menggunakan /dev/nullkode sumber Anda.
Ismael Miguel
2
Menurut META ( meta.codegolf.stackexchange.com/questions/4782/… ), program Anda tidak diharuskan untuk selesai. Selama mengerjakan tugasnya, program Anda dapat berjalan selamanya. Baca jawaban pertama untuk pertanyaan itu.
Ismael Miguel
6

F # - 39 37 31

31 - Karena typeinference dalam F # rocks!

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
sumber
Tidak berfungsi untuk header bernama foo.hoo.h.
FUZxxl
3
@ FuZxxl Tidak ada header seperti itu di perpustakaan standar C.
fredoverflow
@ FredOverflow Anda mungkin ingin menentukan sekumpulan nama yang harus digunakan transformasi. Sekarang pertanyaan Anda diucapkan dengan cara yang mungkin membuat orang berasumsi bahwa input semacam ini harus bekerja dengan benar.
FUZxxl
@ FuZxxl Saya telah memperbarui pertanyaan yang sesuai.
fredoverflow
6

gema, 6

*.h=c*

( Gema adalah bahasa makro yang tidak jelas.)

Steven Taschuk
sumber
4

Bash, 18

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

Keluaran:

$ f stdio.h
cstdio
$ 
Trauma Digital
sumber
4

GNU sed -r, 14

sed tidak benar-benar memiliki konsep fungsi, jadi di sini adalah program sed lengkap sebagai gantinya:

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

Keluaran

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

The -rtelah dimasukkan dalam skor sebagai salah satu karakter tambahan.

Trauma Digital
sumber
Solusi ini tidak valid: Mungkin seharusnya s/\(.*\)\.h/c\1/malah.
FUZxxl
@ FuZxxl - Saya berasumsi -rditeruskan ke sed. Seperti kode-golf biasa saya perlu menghitung itu sebagai poin tambahan.
Trauma Digital
@DigitalTraume Notice yang -rbukan opsi standar dan tidak tersedia di luar GNU sed. Anda mungkin ingin mengubah nama bahasa menjadi GNU untuk mencerminkan hal itu.
FUZxxl
@ FuZxxl Ya. Selesai
Trauma Digital
2
\.hdapat disingkat menjadi..
Steven Taschuk
3

Pendahuluan , 31 karakter

Karena pengiriman program lengkap tampaknya dapat diterima, berikut adalah program yang membaca header gaya C dari STDIN dan mencetak header gaya C ++ ke STDOUT:

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

Ini membutuhkan juru bahasa yang memenuhi standar yang mencetak hasil sebagai kode karakter. Jika Anda menggunakan juru bahasa Python, Anda harus mengaturnya NUMERIC_OUTPUT = False.

Ini juga mensyaratkan bahwa tidak ada trailing newline di STDIN.

Penjelasan

Di Prelude semua baris dieksekusi secara paralel, satu kolom sekaligus. Setiap baris memiliki tumpukan sendiri, diinisialisasi ke jumlah 0s yang tak terbatas .

99+9+
9(1-)

Ini adalah yang terpendek yang dapat saya lakukan untuk mendapatkan 99tumpukan teratas (kode karakter c). Pertama saya menjumlahkan 18di tumpukan atas dan mendorong 9ke tumpukan bawah. Bagian bawah kemudian menghitung mundur 0dalam satu lingkaran, sedangkan tumpukan atas menambah lebih banyak 9s. Ini menambahkan hingga 99pada tumpukan atas, dan tumpukan bawah dibiarkan dengan 0s lagi. Perhatikan bahwa semua +9+adalah bagian dari loop, jadi sebenarnya ada dua operasi tambahan per iterasi, tapi itu bukan masalah, berkat persediaan infinite 0di bawahnya.

Sekarang (?)membaca STDIN, satu karakter pada satu waktu dan mendorong ke tumpukan atas. Loop berakhir pada akhir input, ketika ?menekan nol. ###menghilangkan nol itu, hdan .. Sekarang loop berikutnya muncul angka dari tumpukan atas sambil menyalinnya ke tumpukan bawah. Ini pada dasarnya membalikkan tumpukan. Perhatikan bahwa tanda kurung buka dan tutup ada di baris yang berbeda - ini bukan masalah, karena posisi vertikal )tidak relevan di Prelude, tetapi saya menghemat satu byte di baris pertama.

Terakhir, (!)cetak semua karakter hingga tumpukan kosong.

Martin Ender
sumber
3

Pyth, 7 karakter

L+\cPPb

Penjelasan:

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

Coba ini:

L+\cPPb
y"stdio.h

pada Compiler / Executor Pyth online


Jika program lengkap diizinkan:

Pyth, 6 karakter

+\cPPQ
isaacg
sumber
Saya belum pernah melihat Pyth. Apakah Anda akan baik hati dan menjelaskan kodenya? :)
fredoverflow
1
@FredOverflow Lihat codegolf.stackexchange.com/q/40039/18487
Rainbolt
Saya percaya Anda dapat menggunakan PPbsebagai gantinya<b_2
FryAmTheEggman
@FryAmTheEggman Terima kasih.
isaacg
Sepertinya program penuh diizinkan, sehingga Anda bisa mencapai 6.
FryAmTheEggman
3

C ++ 14, 41 karakter

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

Terinspirasi oleh jawaban lain ini . Saya membuatnya menjadi jawaban yang terpisah karena di sini saya menggunakan fitur yang baru di c ++ 14, lambda generik .

Lihat beraksi di sini .

anatolyg
sumber
2

T-SQL - 58 karakter

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

Jalankan sebagai EXEC Q (string Anda di sini)

tanda
sumber
2

Perl - 20 karakter

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

Perhatikan bagaimana csebuah kata bareword dan karenanya membutuhkan kekurangan use strict. Ini harus digunakan sebagai ekspresi, bukan pernyataan.

sayap kanan
sumber
2

Marbelous, 24

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

Membawa input melalui STDIN, output ke STDOUT.

Ini bekerja dengan memeriksa setiap byte dengan .( 0x46). Karena 0x46tidak dapat masuk ke dalam satu digit basis-36, kami mengurangi 35 ( Z) sebelum membandingkan, dan menambahkannya kembali sebelum menghasilkan.

Setiap marmer diduplikasi oleh 3W( duplikator tiga arah, tetapi sisi kiri dibuang dari sisi papan). Marmer yang dikirim ke bawah mengambil byte berikutnya dari STDIN. Marmer di sebelah kanan dicentang ke ., lalu dikeluarkan, atau dikirim ke!! , yang mengakhiri program.

Program dimulai dengan melewati c( 0x63) melalui, yang akan di-output ke STDOUT.

Cobalah online di sini. Perpustakaan harus diaktifkan, papan silinder harus dinonaktifkan.

es1024
sumber
2

C, 64

Agak lebih pendek dari referensi c:

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

Mungkin lebih banyak bermain golf dengan ini.


C, 48 (libc hack)

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

Halaman strcpymanual secara eksplisit menyatakan "String tidak boleh tumpang tindih". Namun saya menemukan bahwa libc yang saya gunakan tampaknya dikodekan dengan aman untuk menangani semua ini dengan benar. Ini adalah GNU C Library (Ubuntu EGLIBC 2.19-0ubuntu6.4) di Ubuntu 14.04.

Trauma Digital
sumber
Apakah menghilangkan tipe pengembalian fungsi legal di C89?
fredoverflow
1
@FredOverflow. Ya - gcc mengkompilasi ini dengan baik -std=c89. codegolf.stackexchange.com/a/2204/11259
Digital Trauma
@FredOverflow Ya. Jenis pengembalian default ke int.
FUZxxl
Halaman manual hanya mengulangi Standar - kompilasi ini dengan VC ++ (VS2012) memberikan "cstdii" untuk "stdio.h". Tidak memeriksa ICC / Sun / dentang, tetapi versi 64-char Anda mengatakan "mengapa?" - ini tentang sesingkat yang bisa (secara hukum) berada di C.
frasnian
2

JavaScript (ES6) 20

Tidak percaya ES6 masih hilang

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

Perl, 15 (14 + -p)

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

mk, 34 karakter

mk (1) adalah pengganti Plan 9 untuk make. Hanya untuk bersenang-senang, mkfile ini mengubah nama header C menjadi nama header C ++:

c%:Q:
    :

%.h:Q: c%
    echo $prereq

Ada satu tab sebelum :dan echo. Gunakan seperti ini:

% mk stdio.h
cstdio
FUZxxl
sumber
1

CoffeeScript - 16

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

TI-BASIC 83/84, 15

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

R, 33

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

Fungsi ini menggunakan ekspresi reguler.

Contoh penggunaan:

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