Літп-транслятор


28

Днями мій друг зробив перекладача lisp, тобто він взяв рядок і перетворив s => th і S => Th. Це було досить довго, і я думав, що це може бути гольф.

Таким чином, завдання полягає в тому, щоб зробити програму / функцію, яка приймає вхідний рядок, переводить його в lisp і виводить рядок

Тестовий випадок

Sam and Sally like Sheep        Tham and Thally like Thheep
Sally likes sausages            Thally liketh thauthageth
Sally sells seashells           Thally thellth theathhellth

Зауважте, що неважливо, що h постійно повторюється

Це код гольфу, тому найкоротша відповідь виграє


13
Я побажав, щоб усі змінили байт у своїх заголовках на байт .
— Лина монашка

6
Мають бути бонусні бали, якщо програма не використовує sні Sдесь в ній.
— Нейт Діамант

1
Я думаю, назви мов повинні бути чіткі. Без заміни. Деякі мови вже містять "th", тому це неоднозначно. І хто скаже, що в майбутньому хтось не створить іншу мову, яку насправді називають "Common Lithp"?
— mbomb007

1
@ mbomb007 Я б не переживав про це занадто. Я не впевнений, чи є насправді спосіб зазначати свою відповідь за замовчуванням. Більшість запитань я бачу, якщо вони заявляють, як це зробити, як правило, так само. Оскільки я не пояснив, як слід викладати відповідь, користувачі можуть назвати їх так, як хочуть. Будучи педантом, я навіть не просив мови, тому можу сперечатися проти них, навіть пишучи їх. Але я розумію вашу думку. Я просто не думаю, що це викликає занепокоєння
— Джордж

2
Річ, яка зробила б цей виклик цікавішим, - це збереження справ у цілому, наприкладLOOK OUT A SNAKE!!! -> LOOK OUT A THNAKE!!!
— пухнастий

Відповіді:


36

Липп звичайний, 62

(map()(lambda(u)(princ(case u(#\s"th")(#\S"Th")(t u))))(read))

По-перше, (read)введення (це повинно бути рядок). Рядки в CL - це послідовності, тому ми використовуємо mapдля перебору кожного символу. Перший аргумент mapпредставляє тип результату (наприклад, я міг би створити список з вектора). Коли це nil, також (), результати відкидаються. Функція, яка відображається на вхід просто princ(друкується не читається) кожен символ, за винятком тих, які слід замінити.


14
Ця назва мови, хоча.
— Джо Z.

1
@JoeZ. Я просто замінив sна th, як всі інші робили: погляд на ці відповіді Pyson.
— coredump

@coredump Вони всі помиляються: це в один бік: s-> th, S-> Th, th-> th, Th-> Th.
— Ерік Аутгольфер

1
@DrGreenEggsandIronMan Sure, (defmacro cathe (&rest args) `(case ,@args))
— coredump

1
Добре,


13

JavaThcript ETh6, 38 байт

Спочатку я пішов з очевидним рішенням

a=>a.replace(/s/g,'th').replace(/S/g,'Th')

Але я пограв у нього в 4 байти

a=>a.replace(/s/gi,b=>b>'r'?'th':'Th')

Для цього використовується iпрапор регулярного вираження , який шукає нечутливі до регістру шаблони. Хороша річ у Javascript - це те, що ви можете вказати анонімну функцію для обробки (регекс) заміни.

Спробуйте тут

f=
a=>a.replace(/s/gi,b=>b>'r'?'th':'Th')

s.innerHTML = [
    'abScdsefSghsij',
    'Sam and Sally like Sheep',
    'Sally likes sausages',
    'Sally sells seashells'
].map(c=>c + ' => ' + f(c)).join`<br>`
<pre id=s>


11
"E Eth debel"?
— Джо Z.

Я думав 'Tt'[b>'r']+'h', але це однакова тривалість
— Вашингтон Гедес

1
Ви маєте на увазі 38 байт
— Downgoat

+1 для TIL, що порівняння рядків проводиться за допомогою Value Point Value
— MayorMonty

@Upgoat Це було моєї вини.
— Ніл

11

GNU Sed - 17

s/S/Th/g;s/s/th/g

Очевидна відповідь.

$ sed -e "s/S/Th/g;s/s/th/g"

Sam and Sally like Sheep
Tham and Thally like Thheep

Sally likes sausages
Thally liketh thauthageth

Sally sells seashells
Thally thellth theathhellth

17
Ви мали на увазі GNU Thed? ;)
— m654


8

Пітон 3 - 40 байт

Перший гольф!

lambda s:s.translate({115:'th',83:'Th'})

Він використовує метод перекладуstr модуля, який приймає таблицю перекладу. Таблиця перекладу проста, з клавішним кодом як клавішами, а замість неї як значенням.dictstr


1
Ласкаво просимо до спільноти PP&CG!
— Ерік Аутгольфер

4
Чи можу я запитати вас, чому у вас є два окремих рахунки?
— Балінт

@ Bálint Мабуть, він забув увійти до свого поточного рахунку лише з 3 повтореннями, але досвід на Stack Overflow . І розміщено з новим обліковим записом.
— user48538

6

JavaThcript ETh6, 43 байт

s=>s.replace(/s/gi,m=>({s:'th',S:'Th'})[m])

Tetht Thuite:

th=s=>s.replace(/s/gi,m=>({s:'th',S:'Th'})[m])
  
console.log(th('Sam and Sally like Sheep'));
console.log(th('Sally likes sausages'));
console.log(th('Sally sells seashells'));


6
Визнаєш: ти лише написав, що тюїтує за титул цього титулу!
— перестала повертати проти годинника,


5

C, 50 байт

s(c){c=getchar();c+=c-83&95?0:'h\1';s(printf(&c));}

Замініть \1фактичним \x01байтом.

jimmy23013 врятував байт, а потім я врятував ще два, використовуючи його підхід! Спасибі.


Я збирався прокоментувати, що &cпараметр порушений. Але це не так, тому що в архітектурі з невеликим ендіаном другий байт intбуде 0x00і фактично припиняє "рядок" ... Це жахливо розумно, я люблю це!
— Квентін

s(c){c=getchar();c+=c-83&~32?0:26625;s(printf(&c));}
— jimmy23013

Ви не можете натиснути 2 байти в char. 'h\1'
— Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Багатозначні константи визначені в реалізації, але цілком дійсна C.
— Dennis


4

Java, 71 65 байт

String t(String s){return s.replace("S","Th").replace("s","th");}

Перша спроба гольфу, так чому б і не з Java.


2
Ви можете використовувати replaceзамістьreplaceAll
— aditsu

О, так, ти маєш рацію. Спасибі! @aditsu
— Insane

3
Ви можете зберегти деякі байти, використовуючи лямбда-вираз замість функції. s->s.replace("S","Th").replace("s","th")
— Денкер

4

GNU AWK, 31 байт

Просто використовуючи gsubфункцію для перекладу нижнього або верхнього S через регулярний вираз і надрукування після цього. Може працювати з файлами або з stdinтаким, як у цьому випадку

$ awk '{gsub(/s/,"th");gsub(/S/,"Th")}1' <<< "This is Sparta"                   
Thith ith Thparta


3

Python3 - 46 байт

lambda s:s.replace("s","th").replace("S","Th")

Випав 4 байти за допомогою @DenkerAffe !


1
Python 3 була мовою, на якій він був спочатку написаний. Моя версія його коду склала 59 байт, тому ми зробимо!
— Джордж

1
lambda s:s.replace("s","th").replace("S","Th")трохи коротше.
— Денкер

@DenkerAffe Так, це коротше, але для використання лямбда в цьому випадку вам все одно знадобиться введення та вихід, щоб відповісти на початкове запитання.
— Джордж

1
@george Консенсус спільноти полягає в тому, що функції можуть використовувати аргументи та повертати значення замість stdin / stdout. Подивіться наші параметри за замовчуванням для вводу / виводу . Хоча ви, звичайно, можете їх перекрити, якщо хочете, це не має особливого сенсу в цьому конкретному виклику.
— Денкер

@DenkerAffe гаразд це добре. Коли я задав питання, я маю на увазі, що результатом буде відлуння чи друк. Але я залишу це за замовчуванням. Так що так, використання лямбда було б коротшим
— Джордж

3

C # 6,0 - 58 байт

string f(string s)=>s.Replace("s","th").Replace("S","Th");

Приймає рядок введення як аргумент функції.


3

Haskell, 36 байт

f 's'="th";f 'S'="Th";f x=[x]
(>>=f)

Вам не потрібно місця:f's'=...
— ThreeFx

1
На жаль, я. Імена Haskell можуть містити апострофи. :(
— Лінн

О чорт, я це зовсім забув. Мені майже ніколи не потрібні Char...
— ThreeFx

8
Я подумав, що це "Hathkell"
— Патрік Робертс

3

Іржа, 46 байт

|s:&str|s.replace("s","th").replace("S","Th");

Спробуйте в Інтернеті!


1
@ mbomb007. Я не впевнений, що ви повинні це відредагувати.
— Washington Guedes

Я змушую його виконувати відповіді вказівки. Я повинен мати можливість переглядати публікацію і знати, що це мова. Деякі мови вже містять "th", тому це неоднозначно. І хто скаже, що в майбутньому хтось не створить іншу мову, яку насправді називають "Рутт"?
— mbomb007

2
@ mbomb007, хто скаже, що в майбутньому хтось не створить іншу мову під назвою "Іржа"?
— msh210

@ msh210 Точка суперечки, тому що, якщо використовується, плакат потрібно буде уточнити.
— mbomb007

3

PHP, 42 байти

якщо запустити з файлу:

<?=strtr($argv[1],["s"=>"th","S"=>"Th"]);

Виконувати як:

~$ php [file] "This is Silly"

-1 байт: видаліть
— нову

-8 байт: видалити лапки. -> використовувати php -d error_reporting=0для придушення повідомлень.
— Тит

3

TI-Basic, 126 байт

Input Str1
inString(Str1,"s
While Ans
sub(Str1,1,Ans-1)+"th"+sub(Str1,Ans+1,length(Str1)-Ans->Str1
inString(Str1,"s
End
inString(Str1,"S
While Ans
sub(Str1,1,Ans-1)+"Th"+sub(Str1,Ans+1,length(Str1)-Ans->Str1
inString(Str1,"S
End
Str1

Це неправильно. Str1ніколи не змінюється, і Ansв кінці буде номер.
— lirtosiast

Дякуємо за замітку, виправлену зараз. Я не знаю, як я забув знову зберегти Str1назад ...
— Timtech

Це все-таки неправильно; Він помиляється, коли перший чи останній символ є S. Як я вже говорив, будь ласка, протестуйте свій код, перш ніж опублікувати його.
— lirtosiast

3

Ява, 101 байт

interface a{static void main(String[]A){System.out.print(A[0].replace("S","Th").replace("s","th"));}}

Зауважте, що це повна програма на відміну від попередньої відповіді на Java .

Бонус (спочатку повинен бути переданий препроцесору C препроцесору THEE):

#define interfaith interface
#define thtatic static
#define Thtring String
#define Thythtem System
#define replaith(x,y) replace(x,y)

interfaith a{thtatic void main(Thtring[]A){Thythtem.out.print(A[0].replaith("S","Th").replaith("s","th"));}}



2

Python 3, 53 байти

def l(s):return s.replace("s","th").replace("S","Th")

Використання:

>> l('Sam and Sally like Sheep')

Tham and Thally like Thheep

-7 байт: lambda s:s.replace("s","th").replace("S","Th")Використання:(lambda s:s.replace("s","th").replace("S","Th"))(s)
— Ерік Атголфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Ну, це ідентично відповіді TuukkaX (яка була розміщена перед моєю), так що ...
— m654

Тоді немає жодної причини опублікувати іншу відповідь.
— Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Я не помітив його, коли розмістив свою.
— m654

Ви можете видалити свою відповідь, як тільки помітите, що перед вашою з’являється коротша відповідь.
— Ерік Аутгольфер

2

GameMaker Мова, 74 байти

return string_replace_all(string_replace_all(argument0,'s','th'),'S','Th')

2

Матлаб, 39 байт

Невідкладний підхід:

@(t)strrep(strrep(t,'s','th'),'S','Th')

2

Емакт Літп, 61 байт

(lambda(s)(replace-regexp-in-string"[Ss]\\(\\w*\\)""th\\1"s))

Emacs Lisp намагається бути розумним під час заміни тексту, але ця розумність порушується, коли замінений рядок займає лише один пробіл, тобто велика літера S. Щоб запобігти цьому не перетворити "Сем і Саллі" на "THam and THally", ціле слово замість цього. Однак це також обробляє "SAM і Sally" так, як хотілося б, тобто виробляючи "THAM and Thally".


2

машинний код x86, 19 байт

У шістнадцятковій формі:

86ac3c5374043c73750440aab068aa84c075eec3

Вхід:: ESIрядок вводу,: EDIвихідний буфер.

Розбирання:

_loop:
0:  ac          lodsb       
1:  3c 53       cmp al,'S'  
3:  74 04       je _th      
5:  3c 73       cmp al,'s'  
7:  75 04       jne _nth    
_th:
9:  40          inc eax     ;[Ss]->[Tt]
a:  aa          stosb       
b:  b0 68       mov al,'h'  
_nth:
d:  aa          stosb       
e:  84 c0       test al,al  
10: 75 ee       jnz _loop   
12: c3          ret         

Ви можете test al, 'S'перевірити одразу обидва
— anatolyg

2

Befunge 98, 37 49 байт

Оригінальна версія:

~:"s"- #v_$"ht",>,
_;#-"S":<;$"hT",^ 

Закінчення видання відповідно до консенсусу:

~:a-!#@_:"s"-#v_$"ht",>,
_;#-"S":      <;$"hT",^ 

Це залишає велику лунку в кодовій сітці, що я не дуже радий. Я розберуся в цьому, коли матиму час.
49-й байт - це пробіл в кінці другого рядка, включений у прямокутну сітку, необхідну для запобігання виводу помилок ccbi (та, ймовірно, інших інтерпретаторів) та друку нескінченного рядка "Th" s.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.