Перетворити назви заголовків C у назви заголовків C ++


27

У стандартній бібліотеці С назви заголовків закінчуються .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 байт

Шестнадцятковий код:

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 байт, а лише складена його форма (що, думаю, мало хто з нас хотів би записати в шестигранному редакторі).
Пер Лундберг

3
Дайте йому його виграш. Байт = символ - це цілком розумна інтерпретація.
Джошуа

7
@PerLundberg Я вважаю, що в цьому випадку вихідний код є розширеним / коментованим поясненням "як це працює", що багато людей включають у свої ультракомпактні мови. Для такої невеликої програми це цілком могло б бути написане від руки. :)
пухнастий

@fluffy Справедливий пункт. І так, кількість людей, які могли написати напам’ять бінарний код, безумовно,> 0, хоча я не знаю нікого, хто бідував себе. ;)
Пер Лундберг




11

мозковий ебать - 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 - 16 символів, як пропонує німі

('c':).init.init

2
Якщо скинути останні два символи, init.initзамість того, щоб взяти всі перші, .економиться кілька байт.
німі

@nimi Це дивовижна пропозиція!
fredoverflow

10

С, 38

Дивіться на Ideone

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

sє вказівником на рядок введення, і oсаме там слід записувати вихід.

Я знайшов спосіб зловживань snprintf. Вихідний рядок зручно мати на один символ коротший, ніж вхідний, а максимальна довжина записаного рядка на snprintf1 менша, ніж 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

Діалог APL (8 символів)

'c',¯2↓⊢

Це рішення точно таке ж, як і рішення J, яке я подав, але використовує один символ менше через те, що на один символ менше, ніж }..


7

J (9 символів)

'c',_2}.]
  • |yце величина з 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`.

\+ поміняє два верхні елементи стека і з'єднує їх.


Ця мова була створена вами?
Ісмаїл Мігель


Я хоч так. Я вже перевірив це, тому подумав про це. Ніде немає посилання на цю мову. Тільки тут. Отже, я припустив, що його виготовили ви. Для хлопця 14 років ви дуже далеко зайшли в програмування. +1000 за це!
Ісмаїл Мігель

@IsmaelMiguel Уопс, вибачте, мав би сказати вам, що я KeyboardFire на Github. Спасибі!
Дверна ручка

Вам не потрібно. Це майже мається на увазі. Я ismael-miguel (дуже оригінально, перевірити github.com/ismael-miguel ). У мене немає нічого цікавого і корисного, але ви можете це перевірити. Але мене цікавить ваша мова. Єдине повне - клас UIntArray для php ( якщо вас цікавить github.com/ismael-miguel/php-uintarray ).
Ісмаїл Мігель

7

пієт ( 9x11 = 99 8X11 = 88)

v2

ще одна спроба (2x37 = 74)

enter image description here

Важко зробити його набагато меншим, оскільки йому потрібно генерувати 99 ('c') і 46 ('.'), І це займає місце в пієті.


1
Піет ніколи не вимірюється символами, лише коделі, тому вам не потрібно згадувати 0 символів білого :) Також це дуже багато білого
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 У стандартній бібліотеці С таких заголовків немає.
fredoverflow

@FredOverflow Ви можете вказати набір імен, над якими перетворення має працювати. Зараз ваше запитання формулюється таким чином, що може змусити людей припустити, що такий вид введення повинен працювати правильно.
FUZxxl

@FUZxxl Я оновив питання відповідно.
fredoverflow



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 - Я припускаю -r, що передано на sed. Як за звичайним кодом-гольф, мені потрібно вважати це додатковою точкою.
Цифрова травма

@DigitalTraume Зауважте, що -rце не стандартний варіант і не доступний за межами GNU sed. Ви можете змінити назву мови на GNU sed, щоб це відобразило.
FUZxxl

@FUZxxl Так. Зроблено.
Цифрова травма

2
\.hможна скоротити до..
Стівен Тащук

3

Прелюдія , 31 персонаж

Оскільки повна подача програми, очевидно, прийнятна, ось програма, яка читає заголовок у стилі C зі STDIN та друкує заголовок стилю C ++ у STDOUT:

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

Для цього потрібен стандартний сумісний перекладач, який друкує вихід у вигляді символьних кодів. Якщо ви використовуєте інтерпретатор Python, вам потрібно буде встановитиNUMERIC_OUTPUT = False .

Він також вимагає, щоб на STDIN не було останнього нового рядка.

Пояснення

У прелюдії всі рядки виконуються паралельно, по одному стовпчику. Кожен рядок має свій стек, ініціалізований до нескінченної кількості 0s.

99+9+
9(1-)

Це найкоротший, який я міг би придумати, щоб отримати 99верхній стек (код символу c). Спочатку я додаю 18верхній стек і натискаю a 9на нижній стек. Низ потім відлічується до 0циклу, тоді як верхній стек додає більше 9s вгору. Це додається до 99верхнього стека, а нижній стек 0знову залишається з s. Зауважимо, що всі+9+ є частиною циклу, тому насправді є дві операції додавання за одну ітерацію, але це не проблема, завдяки нескінченному постачанню0 s під ним.

Тепер (?)читає STDIN, по одному символу, і натискає на верхній стек. Цикл закінчується в кінці вводу, коли ?натискає нуль. ###позбавляється від цього нуля, то 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

Я ніколи не бачив Піта. Чи будете ви таким добрим і поясніть код? :)
fredoverflow


Я вважаю, що ви можете використовувати PPbзамість<b_2
FryAmTheEggman

@FryAmTheEggman Дякую
isaacg

Здається, дозволені повні програми, тому ви можете дістатися до 6.
FryAmTheEggman

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(тристоронній дублікат, але лівий бік відкидається від сторони дошки). Мармур, посланий вниз, отримує наступний байт від STDIN. Мармур праворуч перевіряється на. , потім або виводиться, або надсилається!! , що завершує програму.

Програма починається з проходження c( 0x63) через, яке буде виведено в STDOUT.

Спробуйте його онлайн тут. Бібліотеки повинні бути включені, циліндричні дошки повинні бути відключені.


2

С, 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, який я використовую, схоже, кодується безпечно, щоб правильно все це впоратися. Це бібліотека GNU C (Ubuntu EGLIBC 2.19-0ubuntu6.4) на Ubuntu 14.04.


Чи правове увімкнення типу повернення функції законним у C89?
fredoverflow

1
@FredOverflow. Так - gcc компілює це просто чудово -std=c89. codegolf.stackexchange.com/a/2204/11259
Digital Trauma

@FredOverflow Так. Типовим типом повернення є int.
FUZxxl

Сторінка man просто підтверджує Стандарт - компіляція цього з VC ++ (VS2012) дає "cstdii" для "stdio.h". Не перевірили ICC / Sun / clang, але у вашій 64-графічній версії написано "чому?" - це приблизно так коротко, як це можливо (юридично) у C.
frasnian

2

JavaScript (ES6) 20

Не можу повірити, що ES6 ще не вистачає

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


2

mk, 34 символів

mk (1) - це заміна плану 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.