Литп Трантлатор


28

Мой друг на днях сделал переводчик шрифтов, то есть он взял строку и преобразовал 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

Обратите внимание, что не имеет значения, что ч повторяется все время

Это код гольф, поэтому самый короткий ответ выигрывает


13
Я хотел, чтобы все меняли байты в своих заголовках на байты .
Дрянная Монахиня

6
Там должно быть бонусных очков , если программа не использует sни Sгде - нибудь в нем.
Нейт Даймонд

1
Я думаю, что названия языков должны быть понятны. Без замены. Некоторые языки уже содержат «th», поэтому это неоднозначно. И кто скажет, что кто-то не будет создавать другой язык, который на самом деле будет называться «Common Lithp» в будущем?
mbomb007

1
@ mbomb007 Я бы об этом не беспокоился. Я не уверен, есть ли на самом деле способ заголовка вашего ответа по умолчанию. Большинство вопросов, которые я вижу, если они действительно заявляют, как это сделать, обычно это то же самое. Поскольку я не объяснил, как должен быть изложен ответ, пользователи могут свободно называть их так, как они хотят. Будучи педантом, я даже не просил языка, поэтому я мог поспорить против них, даже написав их. Но я понимаю вашу точку зрения. Я просто не думаю, что это вызывает беспокойство
Джордж

2
Вещь, которая сделала бы этот вызов более интересным, была бы общей сохранностью случая, напримерLOOK OUT A SNAKE!!! -> LOOK OUT A THNAKE!!!
пушистый

Ответы:


36

Common Lithp, 62

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

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


14
Это название языка, хотя.
Джо З.

1
@JoeZ. Я просто заменил sна th, как все остальные делали: взгляд на эти ответы Pyson.
coredump

@coredump Они все не правы: это односторонний: s-> th, S-> Th, th-> th, Th-> Th.
Эрик Outgolfer

1
@DrGreenEggsandIronMan Конечно, (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 толщина"?
Джо З.

Я думал 'Tt'[b>'r']+'h', но это такая же длина
Вашингтон Гуэдес

1
Вы имеете в виду 38 байт
Downgoat

+1 за TIL, что сравнение строк выполняется с помощью значения Code Point
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

Python 3 - 40 байт

Первый гольф!

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

Он использует метод translatestr модуля, который принимает таблицу перевода. Таблица перевода проста с ключевым кодом в качестве ключей и вместо него в качестве значения.dictstr


1
Добро пожаловать в сообщество PP & CG!
Эрик Outgolfer

4
Могу я спросить, почему у вас 2 отдельных аккаунта?
Белинт

@ Bálint По-видимому, он забыл войти в свою текущую учетную запись только с 3 повторениями, но имел опыт переполнения стека . И размещен с новым аккаунтом.
user48538

6

JavaThcript ETh6, 43 байта

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

Тетт Туит:

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'
Эрик Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Многосимвольные константы определены реализацией, но вполне допустимы C.
Деннис


4

Ява, 71 65 байт

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

Первая попытка игры в гольф, так почему бы не с Java.


2
Вы можете использовать replaceвместоreplaceAll
aditsu

Ах да, ты прав. Благодарность! @aditsu
Безумный

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. Я не уверен, что вы должны отредактировать это.
Вашингтон Гуэдс

Я заставляю его следовать правилам ответа. Я должен иметь возможность просматривать пост и знать, на каком языке он находится. Некоторые языки уже содержат «th», поэтому это неоднозначно. И кто скажет, что кто-то не будет создавать другой язык, который на самом деле будет называться «Рутт», в будущем?
mbomb007

2
@ mbomb007, кто скажет, что кто-то не будет создавать другой язык под названием "Rust" в будущем?
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

Java, 101 байт

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

Обратите внимание, что это полная программа в отличие от предыдущего ответа Java .

Бонус (должен быть передан препроцессору C THE препротеор сначала):

#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)
Эрик Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Ну, это идентично ответу TuukkaX (который был опубликован раньше моего), так что ...
m654

Там нет причин, чтобы опубликовать другой ответ тогда.
Эрик Outgolfer

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

Вы можете удалить свой ответ, как только заметите, что перед вами опубликован более короткий ответ.
Эрик Outgolfer

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

Emacth Lithp, 61 байт

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

Emacs Lisp пытается быть умным при замене текста, но эта сообразительность ломается, когда заменяемая строка занимает только один пробел, то есть заглавную букву S. Чтобы не допустить преобразования «Сэма и Салли» в «ТАМ и ТАЛЛИ», все слово сопоставляется вместо. Тем не менее, это также обрабатывает «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».



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.