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


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.