Lithp Tranthlator


28

Il mio amico ha creato un traduttore lisp l'altro giorno, vale a dire che ha preso una stringa e convertito s => th e S => Th. Era piuttosto lungo e pensavo che potesse essere giocato a golf.

Quindi il compito è di creare un programma / funzione che accetta una stringa di input, la traduce in lisp e produce la stringa

Caso di prova

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

Notare che non importa che h venga ripetuto continuamente

Questo è il golf del codice, quindi vince la risposta più breve


13
Avrei voluto che tutti cambiassero i byte nelle loro intestazioni in byteth .
Leaky Nun,

6
Dovrebbero esserci punti bonus se il programma non lo utilizza sné in Snessun luogo.
Nate Diamond,

1
Penso che i nomi delle lingue dovrebbero essere chiariti. Senza la sostituzione. Alcune lingue contengono già "th", quindi è ambigua. E chi può dire che qualcuno non creerà una lingua diversa in realtà chiamata "Lithp comune" in futuro?
mbomb007,

1
@ mbomb007 Non me ne preoccuperei troppo. Non sono sicuro che esista effettivamente un modo predefinito per assegnare un titolo alla risposta. La maggior parte delle domande che vedo se affermano come farlo è normalmente allo stesso modo. Poiché non ho spiegato come definire la risposta, gli utenti sono liberi di nominarli come vogliono. Essendo un pedante, non ho nemmeno chiesto una lingua, quindi ho potuto discutere contro di loro anche scrivendoli. Ma capisco il tuo punto. Solo che non penso sia preoccupante
George,

2
Una cosa che avrebbe reso più interessante questa sfida sarebbe la conservazione del caso generale, ad esempioLOOK OUT A SNAKE!!! -> LOOK OUT A THNAKE!!!
soffice

Risposte:


36

Lithp comune, 62

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

Innanzitutto, (read)l'input (dovrebbe essere una stringa). Le stringhe in CL sono sequenze, quindi usiamo mapper iterare su ogni carattere. Il primo argomento per maprappresentare il tipo di risultato (ad esempio, potrei costruire un elenco da un vettore). Quando è nil, aka (), i risultati vengono scartati. La funzione che è mappata sull'input semplicemente princ(stampa in modo non leggibile) ogni carattere, tranne quelli che dovrebbero essere sostituiti.


14
Quel nome di lingua però.
Joe Z.

1
@JoeZ. Ho appena sostituito la sda th, come tutti gli altri ha fatto: un'occhiata a quelle risposte Pyson.
coredump,

@coredump Si sbagliano tutti: è a senso unico: s-> th, S-> Th, th-> th, Th-> Th.
Erik the Outgolfer,

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

1
Ok lol ha più senso


13

JavaThcript ETh6, 38 byte

All'inizio sono andato con la soluzione ovvia

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

Ma l'ho golfato di 4 byte

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

Questo utilizza il iflag regex , che cerca modelli senza distinzione tra maiuscole e minuscole. La cosa buona di Javascript è che puoi specificare una funzione anonima da gestire (regex) in sostituzione.

Provalo qui

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.

Ci stavo pensando 'Tt'[b>'r']+'h', ma è della stessa lunghezza
Washington Guedes il

1
Intendi 38 byteth
Downgoat il

+1 per TIL che il confronto delle stringhe viene eseguito tramite Code Point Value
MayorMonty il

@Upgoat È stata colpa mia.
Neil,

11

GNU Sed - 17

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

La risposta ovvia.

$ 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
Intendevi GNU Thed? ;)
m654,


8

Python 3 - 40 byteth

Primo golf!

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

Utilizza il metodo di traduzionestr del modulo che accetta una tabella di traduzione. La tabella di traduzione è un semplice con keycode come chiavi e al posto di esso come valore.dictstr


1
Benvenuto nella community di PP&CG!
Erik the Outgolfer,

4
Posso chiederti perché hai 2 account separati?
Bálint,

@ Bálint Apparentemente, ha dimenticato di accedere al suo account corrente con solo 3 rappresentanti, ma un'esperienza su Stack Overflow . E pubblicato con un nuovo account.
user48538

6

JavaThcript ETh6, 43 byteth

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
Confethth: hai solo scritto quella frase per il titolo di questo titolo!
cessò di girare in senso antiorario il


5

C, 50 byte

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

Sostituisci \1con un \x01byte effettivo .

jimmy23013 ha salvato un byte, quindi ne ho salvati altri due usando il suo approccio! Grazie.


Stavo per commentare che il &cparametro è rotto. Ma non lo è, perché su un'architettura little-endian il secondo byte intsarà 0x00e terminerà effettivamente la "stringa" ... Questo è orribilmente intelligente, lo adoro!
Quentin,

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

Non è possibile inserire 2 byte in a char. 'h\1'
Erik the Outgolfer,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Le costanti multi-carattere sono definite dall'implementazione, ma perfettamente valide C.
Dennis


4

Java, 71 65 byte

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

Primo tentativo di giocare a golf, quindi perché non con Java.


2
Puoi usare replaceinvece direplaceAll
aditsu il

Oh, sì, hai ragione. Grazie! @aditsu
Insane,

3
È possibile salvare alcuni byte utilizzando un'espressione lambda anziché una funzione. s->s.replace("S","Th").replace("s","th")
Denker,

4

GNU AWK, 31 byte

Basta usare la gsubfunzione per tradurre S inferiore o superiore tramite regex e stamparla in seguito. Può funzionare con i file o con stdincome in questo caso

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

3

CJam, 15 byte

q"sS""thTh"2/er

Provalo qui.

Spiegazione

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 byte

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

Dropped 4 byte con l'aiuto di @DenkerAffe !


1
Python 3 era la lingua in cui era stato originariamente scritto. La mia versione del suo codice era di 59 byte, quindi avremo finito!
George,

1
lambda s:s.replace("s","th").replace("S","Th")è un po 'più corto.
Denker,

@DenkerAffe Sì, è più breve, ma per usare lambda in questo caso, avrai comunque bisogno di un input e di un output per rispondere alla domanda originale.
George,

1
Il consenso della community di @george è che le funzioni possono usare argomenti e restituire valori invece di usare stdin / stdout. Dai un'occhiata ai nostri valori di default per I / O . Ovviamente puoi ovviamente sostituirli se vuoi, ma non avrebbe molto senso in questa particolare sfida.
Denker,

@DenkerAffe okay va bene. Quando ho posto la domanda intendo che l'output sarebbe un'eco o una stampa. Ma lo lascerò alle impostazioni predefinite. Quindi sì, usando lambda sarebbe più breve
george

3

C # 6.0 - 58 byte

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

Prende la stringa di input come argomento per la funzione.


3

Haskell, 36 byte

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

Non è necessario lo spazio:f's'=...
ThreeFx

1
Purtroppo lo faccio. I nomi di Haskell possono contenere apostrofi. :(
Lynn,

Oh dannazione l'ho completamente dimenticato. Non ho quasi mai bisogno di Chars ...
ThreeFx il

8
Ho pensato che fosse "Hathkell"
Patrick Roberts il

3

Ruggine, 46 byte

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

Provalo online!


1
@ mbomb007. Non sono sicuro che dovresti modificarlo.
Washington Guedes,

Lo sto facendo seguire le linee guida per la risposta. Dovrei essere in grado di visualizzare un post e sapere che lingua è. Alcune lingue contengono già "th", quindi è ambigua. E chi può dire che qualcuno non creerà una lingua diversa in realtà chiamata "Rutht" in futuro?
mbomb007,

2
@ mbomb007, chi può dire che qualcuno non creerà una lingua diversa chiamata "Rust" in futuro?
msh210,

@ msh210 Punto controverso, perché se usato il poster dovrà chiarire.
mbomb007,

3

PHP, 42 byte

se eseguito da un file:

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

Correre come:

~$ php [file] "This is Silly"

-1 byte: rimuovi la nuova riga alla fine
Erik the Outgolfer,

-8 byte: rimuove le virgolette. -> utilizzare php -d error_reporting=0per sopprimere le notifiche.
Tito,

3

TI-Basic, 126 byte

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

Questo è sbagliato. Str1non cambia mai e Ansmanterrà un numero alla fine.
lirtosiast,

Grazie per la nota, risolto ora. Non so come ho dimenticato di salvare di Str1nuovo ...
Timtech,

Questo è ancora sbagliato; si verifica un errore quando il primo o l'ultimo carattere è S. Come ho detto prima, prova il tuo codice prima di pubblicarlo.
lirtosiast,

3

Java, 101 byteth

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

Si noti che questo è un programma completo a differenza della precedente risposta Java .

Bonus (deve essere prima inviato al preprocessore C THEE preprothethor):

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

115'th'YX83'Th'YX

Provalo online!

Spiegazione

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

2

Python 3, 53 byte

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

Uso:

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

Tham and Thally like Thheep

-7 byte: lambda s:s.replace("s","th").replace("S","Th")Utilizzo:(lambda s:s.replace("s","th").replace("S","Th"))(s)
Erik the Outgolfer,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Bene, è identico alla risposta di TuukkaX (che è stata pubblicata prima della mia), quindi ...
m654

Non c'è motivo di pubblicare un'altra risposta allora.
Erik the Outgolfer,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Non ho notato il suo quando ho pubblicato il mio.
m654,

Puoi eliminare la tua risposta quando noti che ce n'è una più breve pubblicata prima della tua.
Erik the Outgolfer,

2

Lingua GameMaker, 74 byte

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

2

Matlab, 39 byteth

Un approccio stretto:

@(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 cerca di essere intelligente quando sostituisce il testo, ma quella intelligenza si rompe quando la stringa sostituita occupa solo uno spazio, cioè la lettera maiuscola S. Per evitare che questo converta "Sam e Sally" in "THam and THally", l'intera parola è invece abbinato. Tuttavia, questo gestisce anche "SAM e Sally" nel modo desiderato, ovvero producendo "THAM e Thally".


2

codice macchina x86, 19 byte

In esadecimale:

86ac3c5374043c73750440aab068aa84c075eec3

Input:: ESIstringa di input,: EDIbuffer di output.

Smontaggio:

_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         

Puoi usarli test al, 'S'per controllare entrambi contemporaneamente
anatolyg

2

Befunge 98, 37 49 byte

Versione originale :

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

Edizione conclusiva, per consenso:

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

Questo lascia un grosso buco nella suoneria nella griglia del codice di cui non sono molto contento. Lo esaminerò quando avrò il tempo.
Il 49 ° byte è uno spazio alla fine della seconda riga, incluso per avere una griglia rettangolare, necessario per impedire a ccbi (e probabilmente ad altri interpreti) di intercettare e stampare una linea infinita di "Th".



1

SpecBAS ThpecBATh - 53 byte

1 INPUT a$: ?REPLACE$(REPLACE$(a$,"S","Th"),"s","th")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.