Lithp Tranthlator


28

Mein Freund hat neulich einen Lisp-Übersetzer gemacht, das heißt, er hat einen String genommen und s => th und S => Th konvertiert. Es war ziemlich lang und ich dachte, es könnte Golf gespielt werden.

Die Aufgabe besteht also darin, ein Programm / eine Funktion zu erstellen, die eine Eingabezeichenfolge akzeptiert, in lisp übersetzt und die Zeichenfolge ausgibt

Testfall

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

Beachten Sie, dass es keine Rolle spielt, dass h die ganze Zeit wiederholt wird

Dies ist Code Golf, also gewinnt die kürzeste Antwort


13
Ich wünschte, alle würden die Bytes in ihren Headern in byteth ändern .
Undichte Nonne

6
Es sollte Bonuspunkte geben, wenn das Programm diese nicht verwendet soder nicht verwendet S.
Nate Diamond

1
Ich denke, die Namen der Sprachen sollten klargestellt werden. Ohne den Ersatz. Einige Sprachen enthalten bereits "th", daher ist dies nicht eindeutig. Und wer soll sagen, dass in Zukunft niemand mehr eine andere Sprache namens "Common Lithp" erstellen wird?
mbomb007

1
@ mbomb007 Ich würde mir darüber keine Sorgen machen. Ich bin mir nicht sicher, ob es tatsächlich eine Standardmethode gibt, um Ihre Antwort zu benennen. Die meisten Fragen, die ich sehe, wenn sie angeben, wie es geht, sind normalerweise die gleichen. Da ich nicht erkläre, wie die Antwort zu formulieren ist, können die Benutzer sie benennen, wie sie möchten. Da ich ein Pedant bin, habe ich nicht einmal nach einer Sprache gefragt, damit ich mich gegen sie aussprechen kann, auch wenn ich sie schreibe. Aber ich verstehe deinen Standpunkt. Ich glaube einfach nicht, dass es Anlass zur Sorge gibt
George

2
Eine Sache, die diese Herausforderung interessanter gemacht hätte, wäre die allgemeine Aufbewahrung des Gehäuses, z. B.LOOK OUT A SNAKE!!! -> LOOK OUT A THNAKE!!!
flauschig

Antworten:


36

Gemeinsame Lithp, 62

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

Zuerst (read)die Eingabe (es sollte eine Zeichenkette sein). Zeichenfolgen in CL sind Sequenzen, mit denen wir mapjedes Zeichen durchlaufen. Das erste Argument, mapdas den Typ des Ergebnisses darstellt (z. B. könnte ich eine Liste aus einem Vektor erstellen). Wann ist esnil Fall ist (), werden die Ergebnisse verworfen. Die Funktion, die der Eingabe zugeordnet ist, princdruckt einfach jedes Zeichen (nicht lesbar), mit Ausnahme derjenigen, die ersetzt werden sollen.


14
Der Name dieser Sprache.
Joe Z.

1
@JoeZ. Ich habe gerade , wie alle anderen auch, das sdurch ersetzt th: Schau dir die Antworten von Pyson an.
Coredump

@coredump Sie sind alle falsch: es ist in eine Richtung: s-> th, S-> Th, th-> th, Th-> Th.
Erik der Outgolfer

1
@ DrGreenEggsandIronMan Sicher, (defmacro cathe (&rest args) `(case ,@args))
Coredump

1
Ok lol das macht mehr Sinn


13

JavaThcript ETh6, 38 Bytes

Zuerst habe ich mich für die offensichtliche Lösung entschieden

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

Aber ich habe es 4 Bytes runter gespielt

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

Hierbei wird das Regex- iFlag verwendet, das nach Mustern sucht, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird. Das Gute an Javascript ist, dass Sie eine anonyme Funktion für das Ersetzen (Regex) angeben können.

Probieren Sie es hier aus

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 thickth"?
Joe Z.

Ich habe nachgedacht 'Tt'[b>'r']+'h', aber es ist die gleiche Länge
Washington Guedes

1
Du meinst, 38 Byteth
Downgoat

+1 für TIL, dass der String-Vergleich über Code Point Value
MayorMonty

@Upgoat Das war meine Schuld sorry.
Neil

11

GNU Sed - 17

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

Die offensichtliche Antwort.

$ 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
Meinten Sie GNU Thed? ;)
m654


8

Python 3 - 40 byteth

Erstes Golfen!

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

Es verwendet die Übersetzungsmethode des strModuls, die eine Übersetzungstabelle akzeptiert. Die Übersetzungstabelle ist eine einfache Tabelle mit einem Schlüsselcode als Schlüssel und dem Ersatzschlüssel als Wert.dictstr


1
Willkommen in der PP & CG Community!
Erik der Outgolfer

4
Darf ich Sie fragen, warum Sie zwei separate Konten haben?
Bálint

@ Bálint Anscheinend hat er vergessen, sich mit nur 3 Wiederholungen in sein Girokonto einzuloggen, aber eine Erfahrung mit Stack Overflow . Und mit einem neuen Account gebucht.
User48538

6

JavaThcript ETh6, 43 Byteth

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

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
Bekenntnis: du schreibst nur das, was du tust, um des Titels willen!
hörte auf, gegen den Uhrzeigersinn am


5

C 50 Bytes

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

Ersetzen Sie \1mit einem tatsächlichen \x01Byte.

jimmy23013 hat ein Byte gespeichert, und dann habe ich mit seinem Ansatz zwei weitere gespeichert! Vielen Dank.


Ich wollte gerade kommentieren, dass der &cParameter defekt ist. Aber es ist nicht so, denn auf einer Little-Endian-Architektur wird das zweite Byte davon die "Zeichenfolge" intsein 0x00und sie tatsächlich beenden ... Das ist schrecklich clever, ich liebe es!
Quentin

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

Sie können keine 2 Bytes in ein char. 'h\1'
Erik der Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Konstanten mit mehreren Zeichen sind implementierungsdefiniert, aber absolut gültig. C.
Dennis


4

Java, 71 65 Bytes

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

Erster Golfversuch, warum also nicht mit Java?


2
Sie können replaceanstelle von verwendenreplaceAll
Aditsu

Oh ja, du hast recht. Vielen Dank! @aditsu
Insane

3
Sie können einige Bytes speichern, indem Sie einen Lambda-Ausdruck anstelle einer Funktion verwenden. s->s.replace("S","Th").replace("s","th")
Denker

4

GNU AWK, 31 Bytes

Verwenden Sie einfach die gsubFunktion, um das untere oder obere S über Regex zu übersetzen und es anschließend zu drucken. Kann mit Dateien arbeiten, oder mit stdinwie in diesem Fall

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

3

CJam, 15 Bytes

q"sS""thTh"2/er

Teste es hier.

Erläuterung

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 Bytes

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

Fiel 4 Bytes mit Hilfe von @DenkerAffe !


1
Python 3 war die Sprache, in der es ursprünglich geschrieben wurde. Meine Version seines Codes war 59 Bytes, also sind wir fertig!
George

1
lambda s:s.replace("s","th").replace("S","Th")ist etwas kürzer.
Denker

@DenkerAffe Ja, es ist kürzer, aber wenn Sie in diesem Fall Lambda verwenden, benötigen Sie immer noch eine Eingabe und eine Ausgabe, um die ursprüngliche Frage zu beantworten.
George

1
@george Community-Konsens ist, dass Funktionen Argumente verwenden und Werte zurückgeben können, anstatt stdin / stdout zu verwenden. Sehen Sie sich unsere Standardeinstellungen für E / A an . Sie können sie natürlich überschreiben, wenn Sie möchten, aber bei dieser besonderen Herausforderung ergibt das keinen Sinn.
Denker

@DenkerAffe okay, das ist in Ordnung. Wenn ich die Frage stelle, ist die Ausgabe ein Echo oder ein Ausdruck. Aber ich werde es den Vorgaben überlassen. Also ja mit Lambda wäre kürzer
George

3

C # 6.0 - 58 Bytes

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

Nimmt die Eingabezeichenfolge als Argument für die Funktion.


3

Haskell, 36 Bytes

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

Sie brauchen keinen Platz:f's'=...
ThreeFx

1
Traurigerweise tue ich das. Haskell-Namen können Apostrophe enthalten. :(
Lynn

Oh verdammt, das habe ich komplett vergessen. Ich brauche fast nie Chars ...
ThreeFx

8
Ich dachte, es wäre "Hathkell"
Patrick Roberts

3

Rust, 46 Bytes

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

Probieren Sie es online!


1
@ mbomb007. Ich bin mir nicht sicher, ob du das ändern solltest.
Washington Guedes

Ich lasse es den Beantwortungsrichtlinien folgen. Ich sollte in der Lage sein, einen Beitrag anzusehen und zu wissen, welche Sprache es ist. Einige Sprachen enthalten bereits "th", daher ist dies nicht eindeutig. Und wer soll sagen, dass in Zukunft niemand mehr eine andere Sprache namens "Rutht" erschaffen wird?
mbomb007

2
@ mbomb007, wer sagt, dass in Zukunft keine andere Sprache namens "Rust" mehr erstellt wird?
msh210

@ msh210 Streitpunkt, da bei Verwendung das Poster geklärt werden muss.
mbomb007

3

PHP, 42 Bytes

Wenn von einer Datei ausgeführt:

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

Rennen wie:

~$ php [file] "This is Silly"

-1 Byte: Entfernen Sie den Zeilenvorschub am Ende
Erik the Outgolfer

-8 Bytes: Anführungszeichen entfernen. -> verwenden php -d error_reporting=0, um Mitteilungen zu unterdrücken.
Titus

3

TI-Basic, 126 Bytes

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

Das ist falsch. Str1ändert sich nie und Anshält am Ende eine Zahl.
Lirtosiast

Danke für den Hinweis, der jetzt behoben wurde. Ich weiß nicht, wie ich vergessen habe, Str1wieder zu retten ...
Timtech

Das ist immer noch falsch; Es ist ein Fehler, wenn das erste oder letzte Zeichen S ist. Wie ich bereits sagte, testen Sie bitte Ihren Code, bevor Sie ihn veröffentlichen.
Lirtosiast

3

Java, 101 byteth

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

Beachten Sie, dass dies im Gegensatz zur vorherigen Java-Antwort ein vollständiges Programm ist .

Bonus (muss dem C-Präprozessor zugeführt werden Preprozessor THEE Preprothethor weitergeleitet werden):

#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 Bytes

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

Verwendung:

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

Tham and Thally like Thheep

-7 Bytes: lambda s:s.replace("s","th").replace("S","Th")Verwendung:(lambda s:s.replace("s","th").replace("S","Th"))(s)
Erik der Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Nun, das ist identisch mit TuukkaXs Antwort (die vor meiner gepostet wurde), also ...
m654

Es gibt dann keinen Grund, eine andere Antwort zu posten.
Erik der Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Ich habe seine nicht bemerkt, als ich meine gepostet habe.
m654

Sie können Ihre Antwort löschen, wenn Sie bemerken, dass eine kürzere vor Ihrer steht.
Erik der Outgolfer

2

GameMaker-Sprache, 74 Byte

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

2

Matlab, 39 byteth

Ein direkter Ansatz:

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

2

Emacth Lithp, 61 byteth

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

Emacs Lisp versucht, beim Ersetzen von Text schlau zu sein, aber diese Schlauheit bricht ab, wenn die ersetzte Zeichenfolge nur ein Leerzeichen, dh den Großbuchstaben S, einnimmt wird stattdessen abgeglichen. Dies behandelt jedoch auch "SAM und Sally" so, wie man es möchte, dh "THAM und Thally".


2

x86-Maschinencode, 19 Byte

In hex:

86ac3c5374043c73750440aab068aa84c075eec3

Eingabe:: ESIEingabezeichenfolge,: EDIAusgabepuffer.

Demontage:

_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         

Sie können test al, 'S'beide gleichzeitig überprüfen
anatolyg

2

Befunge 98, 37 49 Bytes

Originalfassung :

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

Abschlussausgabe nach Konsens:

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

Dies hinterlässt ein großes Hupenloch im Code-Raster, über das ich nicht sehr glücklich bin. Ich werde das untersuchen, wenn ich Zeit habe.
Das 49. Byte ist ein Leerzeichen am Ende der zweiten Zeile, einschließlich eines rechteckigen Gitters, um zu verhindern, dass ccbi (und wahrscheinlich andere Interpreter) eine unendliche Zeile mit "Th" ausliest und druckt.



1

SpecBAS ThpecBATh - 53 Bytes

1 INPUT a$: ?REPLACE$(REPLACE$(a$,"S","Th"),"s","th")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.