C başlık adlarını C ++ başlık adlarına dönüştür


27

C standart kütüphanesinde başlık isimleri bir .hsonek ile biter :

stdio.h

C ++ 'da, bu başlık isimleri alternatif bir formda ve cbunun yerine bir önek ile kullanılabilir:

cstdio

İlk formu ikinciye dönüştüren bir fonksiyon yazın. Dönüştürme işlemini yerinde yapabilir veya orijinal dizeyi değişmeden bırakıp yeni bir dize döndürebilirsiniz. Tercih ettiğiniz dilde doğal olarak ne hissediyorsa.

Kod hatasız olarak derlenmeli / yorumlanmalıdır. Derleyici uyarıları kabul edilebilir.

İşte temel C çözümünüz. Bu sahiptir 70 karakter ve yaklaşık bir uyarı oluşturur strlen:

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

En kısa çözüm (karakter sayısıyla ölçülür) kazanır.

Güncelleme: Seçtiğiniz dil işlevleri desteklemiyorsa, tüm programlar da kabul edilebilir.

Güncelleme: FUZxxl tarafından önerildiği gibi, C standart kütüphanesindeki başlık dosyalarının tam listesi:

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

Özellikle, içinde birden çok nokta bulunan başlık adları yoktur.

Yanıtlar:


37

80386 makine kodu, 13 bayt

Kodun Hexdump:

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

Kaynak kodu (Visual Studio tarafından derlenebilir):

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

Dize yerinde dönüştürür. Kod (sadece kullanan kayıtlarını kaydetmek ve geri yükleme gerekmez, çok basit alve ecx, fastcallkongre clobber sağlar).


Güzel, bu beni geri alır :)
fredoverflow

Kesinlikle soğutucu çözümlerden biri! Ancak kaynak kodu gerçekten 13 byte değil, sadece derlenmiş halidir (bir çoğumuzun hex editöründe yazmak isteyeceğini düşünüyorum).
Lundberg Başına

3
Ona galibiyetini ver. Bayt = karakter burada mükemmel bir yorumdur.
Joshua,

7
@PerLundberg Bu durumda kaynak kodunu bir çok insanın ultra-kompakt dillerinde içerdiğinin "nasıl çalıştığını" genişletti / yorumladı olarak görüyorum. Böyle küçük bir program için çok iyi yazılmış olabilir. :)
kabarık

Fluffy Fair point. Ve evet, ikili kodu kalbe yazabilecek olan kişi sayısı kesinlikle> 0'dır, gerçi kendimi bilen birini tanımıyorum. ;)
Per Lundberg,


14

CJam, 6 bayt

'clW(<

Bu, dizgiyi STDIN aracılığıyla okuyan tam bir programdır

Açıklama :

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

Burada çevrimiçi deneyin


-2Sadece kadar iyi değil W(mi?
Esolanging Fruit


11

brainfuck - 25 23 bayt

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

Seçtiğiniz dil işlevleri desteklemiyorsa, tüm programlar da kabul edilebilir.

Bu STDIN'den girdi alan bütün bir programdır.

,[>,]      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

Bu, kasetin sol kenarından
çıkmayacak mıydı

@ feersum Tercümanınız sol kenardan çıkmanıza izin veriyorsa, evet. Şimdiye kadar kullandığım her biri kaseti döngüler.
undergroundmonorail

2
@feersum Denemek istiyorsanız, ancak tercümanınız düşmenize izin veriyorsa >, başlangıçta bir ile düzeltebilirsiniz .
undergroundmonorail

10

Haskell - 23 karakter

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

Haskell - nimi tarafından önerildiği gibi 16 karakter

('c':).init.init

2
Son 2 karakterin init.inithepsini ilk yerine bırakmak yerine bırakarak .birkaç bayt kaydeder.
nimi

@ nimi Bu harika bir öneri!
fredoverflow

10

C, 38

İdeone bakın

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

sgiriş dizesine bir işaretçidir ove çıktının yazılacağı yer burasıdır.

Kötüye kullanmanın bir yolunu buldum snprintf. Çıkış dizgisi uygun bir şekilde girdiden daha kısa bir karakter olur ve yazılan dizginin azami uzunluğu argümandan snprintf1 daha azdır n, dolayısıyla keser .h. Not: Bu teknik, Microsoft'un uygulamasıyla çalışmaz çünkü yanlış bir şey yapar ve dizeyi boşa alamaz.


8

Windows Toplu iş dosyası 11

@echo c%~n1

Girilen ilk parametre% 1'dir. ~ N değiştiricisi, sadece dosya adını uzantısız döndürür.

Genişletilmiş komutun ekrana da eklenmesi kabul edilebilirse, ilk @ kaldırılabilir.


8

TIS Düğümü Tipi T21 Mimarisi - 85 bayt

Bu cevap sadece eğlence içindir; Dil bu zorluğun yazıldıktan sonra ortaya çıktı ve bu yüzden onunla kazanamam. (Yapacağımdan değil.)

Tamam, bununla biraz eğlendim. Muhtemelen gerektiğini sadece dil "TIS-100", ama neden molası karakter diyoruz? : D

TIS-100 tamamen benzersiz ve tuhaf bir mimariye sahip bir bilgisayar programlama hakkında bir oyundur. Bu meydan okuma için özel bir bilmece yazdım , bu da girdi almamı ve çıktıyı bilinen bir "dizge" ye karşı kontrol etmemi sağlıyor. Ne yazık ki, dizeleri veya karakterleri kullanmanın bir yolu yoktur, bu nedenle bu program giriş ve çıkış için her karakterin ASCII değerini kullanır.

Eğer eylem görmek isterseniz kullanabileceğiniz bu emülatör , ya da sadece beni asıl oyunda çalıştırın izle burada . Videoda, ilk düğümün son satırının olduğuna dikkat edin D:MOV UP NIL. Videoyu bitirdikten sonra, golf oynayabileceğimi farkettim D:ADD UP. İşlevsel olarak hiçbir fark yoktur, çünkü ACC'nin değeri hemen üzerine yazılır.

Bayt sayım için kullandığım dize:

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

Bu, boş olmayan her düğümün metnidir, yeni satırlarla ayrılmıştır (ilk düğümün ötesinde kullanılan her düğüm için etkin bir şekilde 1 bayt ekleyerek, kuralımızı çoklu dosyalarda kodla yansıtır).


7

Dyalog APL (8 karakter)

'c',¯2↓⊢

Bu çözelti, tam olarak sunulan J çözeltisi ile aynıdır, ancak bir karakter az dolayı kullanan bir karakter az olan }..


7

J (9 karakter)

'c',_2}.]
  • |ybir büyüklüğü ve y(aynı zamanda mutlak değer)
  • x }. y|xöğeleri damla y; xPozitif ise öğeler önden x, negatif ise sondan atılır.
  • x , yekler xve y.
  • 'c' , _2 }. yistediğiniz dönüşümü yapar; zımni notasyonda bu, olarak ifade edilebilir 'c' , _2 }. ].

7

Devekuşu 0.6.0 , 8 karakter

););"c\+

)"sağdaki uncons" operatörüdür. Bir dizeye uygulandığında, örneğin, `foo`içine dönüşür `fo` `o`. ;fazladan karakteri kapatmak için kullanılır ve bu tekrar yapılır.

Sonra, "citilir. Bu sadece bir steno `c`.

\+ ilk iki yığın öğesini değiştirir ve birleştirir.


Bu dil sizin tarafınızdan yaratıldı mı?
Ismael Miguel,

@IsmaelMiguel Evet. ( Ana Github
deposuna

Ben öyle olsa. Ben zaten kontrol ettim, bu yüzden düşünüyorum. Hiçbir yerde bu dile referans yok. Sadece burada. Yani, senin yaptığını sandım. 14 yaşında bir erkek için programlama konusunda çok ileri gittin. Bunun için +1000!
Ismael Miguel,

@IsmaelMiguel Whoops, üzgünüm, sana Github'da KeyboardFire olduğumu söylemeliydi . Teşekkürler!
Doorknob

Buna gerek yok. Neredeyse ima edildi. Ben Ben-Miguel-Miguel (çok orijinal, github.com/ismael-miguel adresini ziyaret edin ). Orada ilginç ve yararlı hiçbir şeyim yok, ancak kontrol edebilirsiniz. Ama senin dilinle ilgileniyorum. Tamamlanan tek şey php için UIntArray sınıfıdır ( ilgileniyorsanız github.com/ismael-miguel/php-uintarray ).
Ismael Miguel,

7

piet ( 9x11 = 99 8X11 = 88)

v2

başka bir deneme (2x37 = 74)

görüntü tanımını buraya girin

Bir 99 ('c') ve 46 ('.') Üretmesi gerektiğinden ve piette yer kaplaması gerektiğinden çok daha küçük hale getirmek zor.


1
Piet, asla karakter cinsinden ölçülmez, sadece kodeller, bu nedenle 0 karakter bitten bahsetmenize gerek yok :) Ayrıca, bu çok fazla beyaz
Sp3000

sıkıştırmaya çalışıyor, ama biraz zor. Başka bir satır ya da sütunu kaldırırsam sonlandırmak için sorun yaşıyor.
captncraig

Bu biraz aldatma, ama hoşuma gitti. Bu, /dev/nullkaynak kodunuz olarak kullanmak gibidir .
Ismael Miguel,

2
META'ya göre ( meta.codegolf.stackexchange.com/questions/4782/… ) programınızın bitmesi gerekmez. Görevi olduğu sürece, programınız sonsuza kadar çalışabilir. Soruya ilk cevabı oku.
Ismael Miguel, 15

6

F # - 39 37 31

31 - Çünkü F # kayalarındaki yazı tipi!

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. başlıklı bir başlık için çalışmıyor
FUZxxl

3
@ FUZxxl C standart kütüphanesinde böyle bir başlık yoktur.
fredoverflow

@FredOverflow Dönüşümün çalışması gereken ad kümesini belirtmek isteyebilirsiniz. Şu anda sorunuz, insanların bu tür bir girişin doğru şekilde çalışması gerektiğini varsaymasına neden olacak şekilde ifade edildi.
FUZxxl

@ FUZxxl Ben buna göre soruyu güncelledik.
fredoverflow



4

GNU sed -r, 14

sed'de gerçekten hiçbir fonksiyon kavramı yoktur, bu yüzden işte tam bir sed programı var:

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

Çıktı

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

-rBir ekstra karakter olarak skor dahil edilmiştir.


Bu çözüm geçersiz: Bunun s/\(.*\)\.h/c\1/yerine muhtemelen olmalı .
FUZxxl

@ FUZxxl - Sanırım sed'e -rgeçti. Her zamanki kod golfüne göre, bunu ekstra bir puan olarak saymam gerekiyor.
Dijital Travma

@DigitalTraume -rStandart bir seçenek değildir ve GNU sed dışında mevcut değildir. Bunu yansıtmak için dil adını GNU sed olarak değiştirmek isteyebilirsiniz.
FUZxxl

@FUZxxl Evet. Bitti.
Dijital Travma

2
\.hkısaltılabilir..
Steven Taschuk 14:15

3

Prelude , 31 karakter

Tam program başvuruları görünüşte kabul edilebilir olduğu için, C tipi başlık STDIN'den okuyan ve C ++ tarzı başlık STDOUT'a yazdıran bir program:

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

Bu, çıktıyı karakter kodları olarak basan standart uyumlu bir tercüman gerektirir. Python yorumlayıcısını kullanıyorsanız ayarlamanız gerekir NUMERIC_OUTPUT = False.

Ayrıca STDIN'de takip eden bir yeni satır olmamasını gerektirir.

açıklama

Prelude'da tüm satırlar paralel olarak, bir defada bir sütun olarak yürütülür. Her çizginin sonsuz bir miktar 0s ile ilklendirilen kendi yığını vardır .

99+9+
9(1-)

Bu, en 99üstteki yığına (karakter kodu c) girmek için bulabildiğim en kısa şey . İlk önce 18üstteki yığının 9üzerine topladım ve alttaki yığının üzerine bastırdım. En 0üstteki yığın daha fazla eklerken, en alttaki bir döngü içinde geri sayım yapar 9. Bu 99üst yığına kadar ekler ve alt yığın 0tekrar s ile kalır . Hepsinin +9+döngünün bir parçası olduğuna dikkat edin, bu nedenle her yineleme için iki ek işlem var, ancak 0altındaki s sonsuz kaynağı sayesinde bu bir sorun değil .

Şimdi (?), her seferinde bir karakter olan STDIN'i okur ve üstteki yığının üzerine iter. Döngü, ?sıfıra bastığında girişin sonunda sona erer . ###bu sıfırdan kurtulur hve .. Şimdi bir sonraki döngü, alt yığına kopyalarken, üst yığındaki sayıları açar. Bu temelde yığını tersine çevirir. Açma ve kapatma parantezlerinin farklı çizgiler üzerinde olduğuna dikkat edin - bu bir sorun değildir, çünkü )Prelude'deki dikey konumu önemsizdir, ancak ilk satırda bana bir bayt kazandırır.

Son olarak, (!)yığın boşalana kadar tüm karakterleri yazdırır.


3

Pyth, 7 karakter

L+\cPPb

Açıklama:

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

Bunu dene:

L+\cPPb
y"stdio.h

çevrimiçi Pyth Compiler / Executor'da


Tam programlara izin verildiyse:

Pyth, 6 karakter

+\cPPQ

Pyth'i hiç görmedim. Çok nazik ve kodu açıklar mısın? :)
fredoverflow


Kullanabileceğin inanmak PPbyerine<b_2
FryAmTheEggman

@FryAmTheEggman Teşekkürler.
isaacg,

Tam programlara izin veriliyor gibi görünüyor, yani 6'ya
gidebilirsiniz

3

C ++ 14, 41 karakter

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

Bu diğer cevaptan ilham aldım . Ayrı bir cevap verdim çünkü burada c ++ 14 jenerik lambdada yeni olan bir özellik kullanıyorum .

Burada çalışırken görün .


2

T-SQL - 58 karakter

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

EXEC Q olarak çalıştır (burada dizginiz)


2

Perl - 20 karakter

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

cBir korkak nasıl olduğunu ve bunun için bir eksikliği gerektirir use strict. Bu ifade olarak değil ifade olarak kullanılmalıdır.


2

Mermer, 24

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

STDIN üzerinden giriş alır, STDOUT çıkışına çıkar.

Bu, her byte'ı .( 0x46) ile kontrol ederek çalışır . Gibi0x46 tek bir baz-36 basamaklı içine sığamaz, biz 35 (çıkarma Zkarşılaştırarak önce) ve çıktısını almadan geri ekleyin.

Her mermer kopyalanır 3W(üç yollu kopyalayıcı, ancak sol taraf tahtadan çıkarılır). Aşağıya doğru gönderilen mermer, STDIN'den bir sonraki baytı alır. Sağdaki mermer kontrol edilir..!! , programı sonlandırmak için , sonra gönderilir veya gönderilir .

Program geçerek başlar c0x63 STDOUT çıktısına ( ) .

Burada çevrimiçi deneyin. Kütüphaneler etkinleştirilmeli, silindirik panolar devre dışı bırakılmalıdır.


2

C, 64

C referansından biraz daha kısa:

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

Muhtemelen bu konuda yapılacak daha fazla golf.


C, 48 (libc hack)

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

strcpyManpage açıkça "dizeleri örtüşmeyebilir" belirtiyor. Bununla birlikte, kullandığım libc’in de aynı şekilde doğru şekilde ele alınması için güvenli bir şekilde kodlanmış gibi göründüğünü gördüm. Bu, Ubuntu 14.04'teki GNU C Kütüphanesidir (Ubuntu EGLIBC 2.19-0ubuntu6.4).


C89'da bir fonksiyonun dönüş tipini atlamak yasal mı?
fredoverflow

1
@FredOverflow. Evet - gcc bunu iyi bir şekilde derler -std=c89. codegolf.stackexchange.com/a/2204/11259
Dijital Travma

@FredOverflow Evet. Dönüş türü varsayılan olarak int.
FUZxxl

Man sayfası sadece Standardı tekrarlar - bunu VC ++ ile derlemek (VS2012) "stdio.h" için "cstdii" verir. ICC / Sun / clang'ı kontrol etmediniz, ancak 64 karakterli sürümünüz "Neden?" - (yasal olarak) olabildiğince kısa sürede C’de olabilir
frasnian

2

JavaScript (ES6) 20

ES6'nın hala kayıp olduğuna inanamıyorum

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


2

mk, 34 karakter

mk (1), yapmak için Plan 9 un yerine getirildi Sadece eğlence için, bu mkfile C başlık isimlerini C ++ başlık isimlerine dönüştürür:

c%:Q:
    :

%.h:Q: c%
    echo $prereq

:Ve öncesi tek bir sekme var echo. Bunun gibi kullanın:

% mk stdio.h
cstdio



1

R, 33

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

Bu işlev normal ifadeler kullanır.

Örnek kullanım:

> (function(x)sub("(.+)..","c\\1",x))("stdio.h")
[1] "cstdio"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.