Lithp Tranthlator


28

Mój przyjaciel zrobił tłumacz seplenny pewnego dnia, to znaczy, że wziął ciąg i przekształcił s => th i S => th. To było dość długie i myślałem, że można grać w golfa.

Zadanie polega więc na utworzeniu programu / funkcji, która pobiera ciąg wejściowy, tłumaczy go na lisp i wyprowadza ciąg

Przypadek testowy

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

Pamiętaj, że nie ma znaczenia, że ​​h cały czas się powtarza

To jest golf golfowy, więc wygrywa najkrótsza odpowiedź


13
Żałowałem, że wszyscy nie zmienili bajtów w swoich nagłówkach na bajty .
Leaky Nun

6
Powinny być punkty bonusowe, jeśli program nie używa sani Snigdzie w nim.
Nate Diamond,

1
Myślę, że nazwy języków powinny być jasne. Bez wymiany. Niektóre języki zawierają już „th”, więc jest to niejednoznaczne. A kto powiedziałby, że ktoś nie stworzy w przyszłości innego języka o nazwie „Common Lithp”?
mbomb007

1
@ mbomb007 Nie martwiłbym się tym zbytnio. Nie jestem pewien, czy rzeczywiście istnieje domyślny sposób na tytuł odpowiedzi. Widzę większość pytań, czy stwierdzają, jak to zrobić, zwykle jest to ten sam sposób. Ponieważ nie wyjaśniłem, jak należy udzielić odpowiedzi, użytkownicy mogą dowolnie nadawać im tytuły. Będąc pedantem, nawet nie prosiłem o język, więc mogłem się kłócić nawet o ich pisanie. Ale rozumiem twój punkt widzenia. Po prostu nie sądzę, że to niepokoi
George

2
Rzeczą, która uczyniłaby to wyzwanie bardziej interesującym, byłoby ogólne zachowanie skrzynek, np.LOOK OUT A SNAKE!!! -> LOOK OUT A THNAKE!!!
puszysty

Odpowiedzi:


36

Common Lithp, 62

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

Najpierw (read)dane wejściowe (powinien to być ciąg znaków). Ciągi w CL są sekwencjami, więc używamy mapdo iteracji każdego znaku. Pierwszy argument mapreprezentujący typ wyniku (np. Mógłbym zbudować listę z wektora). Gdy jest to nil, aka (), wyniki są odrzucane. Funkcja, która jest odwzorowana na dane wejściowe princ( po prostu drukuje nieczytelnie) każdy znak, z wyjątkiem tych, które powinny zostać zastąpione.


14
Ale ta nazwa języka.
Joe Z.

1
@JoeZ. Właśnie otrzymuje sprzez th, jak każdy inny tego nie zrobił: Spójrz na te odpowiedzi Pyson.
coredump

@coredump Wszystkie są w błędzie: w jedną stronę: s-> th, S-> Th, th-> th, Th-> Th.
Erik the Outgolfer,

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

1
Ok lol, to ma sens


13

JavaThcript ETh6, 38 bajtów

Na początku wybrałem oczywiste rozwiązanie

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

Ale grałem w golfa o 4 bajty

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

Wykorzystuje to iflagę regex , która wyszukuje wzorce bez rozróżniania wielkości liter. Zaletą Javascript jest to, że możesz określić anonimową funkcję do obsługi (regex) zastępowania.

Wypróbuj tutaj

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 et grubość”?
Joe Z.

Myślałem o tym 'Tt'[b>'r']+'h', ale ma tę samą długość
Washington Guedes,

1
Masz na myśli 38 bajtów
Downgoat

+1 dla TIL, że porównywanie ciągów odbywa się za pomocą Code Point Value
MayorMonty,

@Upgoat To była moja wina, przepraszam.
Neil,

11

GNU Sed - 17

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

Oczywista odpowiedź.

$ 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
Miałeś na myśli GNU Thed? ;)
m654


8

Python 3 - 40 bajtów

Pierwszy golf!

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

Wykorzystuje metodę translacjistr modułu, która akceptuje tabelę tłumaczeń. Tabela tłumaczeń jest prosta z kodem klucza jako kluczem i zamiast niego jako wartością.dictstr


1
Witamy w społeczności PP&CG!
Erik the Outgolfer,

4
Czy mogę zapytać, dlaczego masz 2 oddzielne konta?
Bálint,

@ Bálint Najwyraźniej zapomniał zalogować się na swoje konto bieżące tylko 3 powtórzeniami, ale doświadczenie w stosie przepełnienia stosu . I opublikowane z nowym kontem.
user48538,



5

C, 50 bajtów

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

Zamień \1na rzeczywisty \x01bajt.

jimmy23013 zapisał bajt, a następnie zapisałem dwa kolejne, używając jego podejścia! Dzięki.


Już miałem skomentować, że &cparametr jest zepsuty. Ale tak nie jest, ponieważ w architekturze little-endian drugim bajtem intbędzie 0x00i faktycznie zakończy „ciąg” ... To jest okropnie sprytne, uwielbiam to!
Quentin,

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

Nie możesz wcisnąć 2 bajtów do char. 'h\1'
Erik the Outgolfer,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Stałe wieloznakowe są zdefiniowane w implementacji, ale doskonale poprawna C.
Dennis


4

Java, 71 65 bajtów

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

Pierwsza próba gry w golfa, więc dlaczego nie z Javą.


2
Możesz użyć replacezamiastreplaceAll
aditsu

O tak, masz rację. Dzięki! @aditsu
Insane

3
Możesz zapisać niektóre bajty, używając wyrażenia lambda zamiast funkcji. s->s.replace("S","Th").replace("s","th")
Denker

4

GNU AWK, 31 bajtów

Wystarczy użyć gsubfunkcji do przetłumaczenia dolnej lub górnej litery S za pomocą wyrażenia regularnego i wydrukowania go później. Może pracować z plikami lub z stdinjak w tym przypadku

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

3

CJam, 15 bajtów

q"sS""thTh"2/er

Sprawdź to tutaj.

Wyjaśnienie

q      e# Read input.
"sS"   e# Push string.
"thTh" e# Push string.
2/     e# Split into pairs, i.e. ["th" "Th"].
er     e# Transliteration, replaces 's' with 'th' and 'S' with 'Th'.

3

Python3 - 46 bajtów

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

Usunięto 4 bajty za pomocą @DenkerAffe !


1
Python 3 był językiem, w którym został napisany. Moja wersja jego kodu miała 59 bajtów, więc skończymy!
George

1
lambda s:s.replace("s","th").replace("S","Th")jest nieco krótszy.
Denker

@DenkerAffe Tak, jest krótszy, ale aby użyć w tym przypadku lambda, nadal potrzebujesz danych wejściowych i wyjściowych, aby odpowiedzieć na pierwotne pytanie.
George

1
@george Społeczność jest zgodna co do tego, że funkcje mogą używać argumentów i zwracać wartości zamiast używać stdin / stdout. Zobacz nasze domyślne ustawienia we / wy . Chociaż możesz je oczywiście pominąć, jeśli chcesz, nie ma to większego sensu w tym konkretnym wyzwaniu.
Denker

@DenkerAffe w porządku, w porządku. Kiedy zadałem pytanie, mam na myśli, że wynikiem będzie echo lub wydruk. Ale pozostawię to domyślnym. Tak więc użycie lambdy byłoby krótsze
George

3

C # 6.0 - 58 bajtów

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

Pobiera ciąg wejściowy jako argument funkcji.


3

Haskell, 36 bajtów

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

Nie potrzebujesz miejsca:f's'=...
ThreeFx

1
Niestety tak. Nazwy Haskell mogą zawierać apostrofy. :(
Lynn

Cholera, zupełnie o tym zapomniałem. Prawie nigdy nie potrzebuję Chars ...
ThreeFx,

8
Myślałem, że to „Hathkell”
Patrick Roberts,

3

Rdza, 46 bajtów

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

Wypróbuj online!


1
@ mbomb007. Nie jestem pewien, czy powinieneś to edytować.
Washington Guedes,

Sprawiam, że postępuje zgodnie z wytycznymi. Powinienem móc zobaczyć post i wiedzieć, jaki to język. Niektóre języki zawierają już „th”, więc jest to niejednoznaczne. A kto powiedziałby, że ktoś nie stworzy w przyszłości innego języka o nazwie „Rutht”?
mbomb007

2
@ mbomb007, kto może powiedzieć, że ktoś nie stworzy w przyszłości innego języka o nazwie „Rust”?
msh210,

@ msh210 Moot point, ponieważ jeśli zostanie użyty, plakat będzie musiał wyjaśnić.
mbomb007

3

PHP, 42 bajty

jeśli jest uruchamiany z pliku:

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

Uruchom jako:

~$ php [file] "This is Silly"

-1 bajt: usuń nowy wiersz na końcu
Erik the Outgolfer

-8 bajtów: usuń cudzysłowy. -> użyj, php -d error_reporting=0aby ukryć powiadomienia.
Tytus

3

TI-Basic, 126 bajtów

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

To jest źle. Str1nigdy się nie zmienia i Ansna końcu będzie zawierać liczbę.
lirtosiast

Dzięki za notatkę, teraz naprawione. Nie wiem, jak zapomniałem Str1ponownie uratować ...
Timtech

To nadal jest złe; błąd, gdy pierwszym lub ostatnim znakiem jest S. Jak już powiedziałem, przetestuj kod przed opublikowaniem go.
lirtosiast

3

Java, 101 bajtów

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

Zauważ, że jest to kompletny program w przeciwieństwie do poprzedniej odpowiedzi Java .

Premia ( najpierw należy przekazać preprocesorowi C THE preprocessoror 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

MATL , 17 bajtów

115'th'YX83'Th'YX

Wypróbuj online!

Wyjaśnienie

115    % 's' (ASCII)
'th'   % String 'th'
YX     % Regex replacement
83     % 'S' (ASCII)
'Th'   % String 'Th'
YX     % Regex replacement

2

Python 3, 53 bajty

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

Stosowanie:

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

Tham and Thally like Thheep

-7 bajtów: lambda s:s.replace("s","th").replace("S","Th")Zastosowanie:(lambda s:s.replace("s","th").replace("S","Th"))(s)
Erik the Outgolfer,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Cóż, to jest identyczne z odpowiedzią TuukkaX (która została opublikowana przed moją), więc ...
m654

Nie ma więc powodu, aby publikować kolejną odpowiedź.
Erik the Outgolfer,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Nie zauważyłem jego, kiedy opublikowałem mój.
m654

Możesz usunąć swoją odpowiedź, gdy zauważysz, że jest krótsza.
Erik the Outgolfer,

2

GameMaker Language, 74 bajty

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

2

Matlab, 39 bajtów

Proste podejście:

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

2

Emacth Lithp, 61 bajtów

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

Emacs Lisp stara się być mądry podczas zamiany tekstu, ale ta inteligencja psuje się, gdy zastąpiony ciąg zajmuje tylko jedną spację, tj. Wielką literę S. Aby zapobiec konwersji tego słowa „Sam i Sally” na „THam i THally”, całe słowo jest dopasowany zamiast. Jednak to również obsługuje „SAM i Sally” tak, jak byśmy tego chcieli, tj. Produkują „THAM i Thally”.


2

kod maszynowy x86, 19 bajtów

W hex:

86ac3c5374043c73750440aab068aa84c075eec3

Dane wejściowe:: ESIciąg wejściowy,: EDIbufor wyjściowy.

Demontaż:

_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         

Możesz użyć test al, 'S'do sprawdzenia obu naraz
anatolyg

2

Befunge 98, 37 49 bajtów

Orginalna wersja :

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

Zakończenie wydania, zgodnie z konsensusem:

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

Pozostawia to dużą lukę w siatce kodu, z której nie jestem bardzo zadowolony. Zajmę się tym, kiedy będę miał czas.
49. bajt to spacja na końcu drugiej linii, zawierająca prostokątną siatkę, niezbędna, aby uniemożliwić ccbi (i prawdopodobnie innym tłumaczom) wypaczenie i wydrukowanie nieskończonej linii „Th”.



1

SpecBAS ThpecBATh - 53 bajty

1 INPUT a$: ?REPLACE$(REPLACE$(a$,"S","Th"),"s","th")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.