Lithp Tranthlator

28

Meu amigo fez um tradutor de lisp no outro dia, ou seja, pegou uma string e converteu s => th e S => Th. Era bastante longo e eu pensei que poderia ser jogado golfe.

Portanto, a tarefa é criar um programa / função que pegue uma string de entrada, traduza-a para lisp e produza a string

Caso de teste

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

Observe que não importa que h seja repetido o tempo todo

Este é o código de golfe, então a resposta mais curta ganha

George
fonte
13
Eu gostaria que todos mudassem os bytes em seus cabeçalhos para bytes .
Leaky Nun
6
Deve haver pontos de bônus se o programa não usar snem Sem lugar algum.
Nate Diamond
1
Eu acho que os nomes dos idiomas devem ficar claros. Sem a substituição. Alguns idiomas já contêm "th", portanto é ambíguo. E quem pode dizer que alguém não criará uma linguagem diferente chamada "Common Lithp" no futuro?
mbomb007
1
@ mbomb007 Eu não me preocuparia muito com isso. Não tenho certeza se existe realmente uma maneira padrão de nomear sua resposta. A maioria das perguntas que eu vejo se afirmam como fazê-lo é normalmente da mesma maneira. Como ainda não expliquei como a resposta deve ser definida, os usuários podem nomear como querem. Sendo pedante, nem sequer pedi um idioma, para poder argumentar contra eles, mesmo escrevendo-os. Mas eu entendo o seu ponto. Eu só não acho que isso é motivo de preocupação
george
2
Uma coisa que teria feito este desafio mais interessante seria a preservação caso geral, por exemploLOOK OUT A SNAKE!!! -> LOOK OUT A THNAKE!!!
fofo

Respostas:

36

Lithp comum, 62

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

Primeiro, (read)a entrada (deve ser uma string). Seqüências de caracteres em CL são sequências, por isso usamos mappara iterar em cada caractere. O primeiro argumento para maprepresenta o tipo do resultado (por exemplo, eu poderia criar uma lista a partir de um vetor). Quando é nil, também conhecido (), os resultados são descartados. A função que é mapeada para a entrada simplesmente princ(imprime de forma não legível) cada caractere, exceto os que devem ser substituídos.

coredump
fonte
14
Esse nome de idioma embora.
Joe Z.
1
@JoeZ. Acabei de substituir o sby th, como todo mundo fez: olhe para as respostas de Pyson.
coredump
@coredump Eles estão todos errados: é de sentido único: s-> th, S-> Th, th-> th, Th-> Th.
Erik the Outgolfer
1
@DrGreenEggsandIronMan Sure, (defmacro cathe (&rest args) `(case ,@args))
coredump
1
Ok lol que faz mais sentido, #
17

Retina, 9 bytes

S
Th
s
th

Experimente online!

A resposta óbvia.

user48538
fonte
13

JavaThcript ETh6, 38 bytes

No começo eu fui com a solução óbvia

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

Mas joguei 4 bytes

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

Isso faz uso do isinalizador regex , que procura padrões que não diferenciam maiúsculas de minúsculas. O bom do Javascript é que você pode especificar uma função anônima para manipular (regex) a substituição.

Experimente aqui

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>

Bassdrop Cumberwubwubwub
fonte
11
"E espessura"?
Joe Z.
Eu estava pensando em 'Tt'[b>'r']+'h', mas é o mesmo comprimento
Washington Guedes
1
Você quer dizer 38 bytes
Downgoat 17/06/16
+1 para TIL que comparação de string é feita através de Código Valor de ponto
MayorMonty
@ Upgoat Essa foi minha culpa, desculpe.
19416 Neil
11

GNU Sed - 17

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

A resposta óbvia.

$ 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
C. Quilley
fonte
17
Você quis dizer GNU Thed? ;)
m654 17/06/2016
8

Python 3-40 byteth

Primeiro golfe!

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

Ele usa o método de conversãostr do módulo que aceita uma tabela de conversão. A tabela de conversão é simples, com código-chave como chave e o lugar dela como valor.dictstr

Gabor Fekete
fonte
1
Bem-vindo à comunidade PP&CG!
Erik the Outgolfer
4
Posso perguntar por que você tem duas contas separadas?
Bálint
@ Bálint Aparentemente, ele esqueceu de fazer login em sua conta atual com apenas 3 repetições, mas com uma experiência no Stack Overflow . E postado com uma nova conta.
user48538
6

JavaThcript ETh6, 43 bytes

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'));

Patrick Roberts
fonte
6
Confiança: tu só escritas tu te ditas por causa do seu título!
deixou de girar contra-
6

V , 11 byteth

Ís/th
ÍS/Th

Experimente online!

Com a linguagem que eu criei. Não está terminado, mas é realmente bom em termos de regimento.

DJMcMayhem
fonte
5

C, 50 bytes

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

Substitua \1por um \x01byte real .

jimmy23013 salvou um byte e depois salvei mais dois usando sua abordagem! Obrigado.

Lynn
fonte
Eu estava prestes a comentar que o &cparâmetro está quebrado. Mas não é, porque em uma arquitetura little-endian o segundo byte intserá 0x00e realmente encerrará a "string" ... Isso é terrivelmente inteligente, eu adoro!
Quentin
s(c){c=getchar();c+=c-83&~32?0:26625;s(printf(&c));}
jimmy23013
Você não pode enviar 2 bytes para a char. 'h\1'
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ constantes Multi-caracteres são de implementação definido, bu perfeitamente válido C.
Dennis
5

05AB1E, 14 12 bytes

's„th:'S„Th:

A resposta direta.

Experimente online

Guardado 2 bytes graças a @Adnan

Emigna
fonte
Essa não é a resposta direta à frente, e não a resposta direta?
dorukayhan quer Monica de volta
4

Java, 71 65 bytes

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

Primeira tentativa de jogar golfe, então porque não com Java.

Insano
fonte
2
Você pode usar em replacevez dereplaceAll
aditsu
Oh, sim, você está certo. Obrigado! @aditsu
Insane
3
Você pode salvar alguns bytes usando uma expressão lambda em vez de uma função. s->s.replace("S","Th").replace("s","th")
Denker
4

GNU AWK, 31 bytes

Basta usar a gsubfunção para traduzir S inferior ou superior via regex e imprimi-lo depois. Pode trabalhar com arquivos ou stdincomo neste caso

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

CJam, 15 bytes

q"sS""thTh"2/er

Teste aqui.

Explicação

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'.
Martin Ender
fonte
3

Python3 - 46 bytes

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

Queda de 4 bytes com a ajuda de @DenkerAffe !

Yytsi
fonte
1
Python 3 foi a linguagem em que foi originalmente escrito. Minha versão do código dele era de 59 bytes, então vamos terminar!
george
1
lambda s:s.replace("s","th").replace("S","Th")é um pouco mais curto.
Denker
@DenkerAffe Sim, é mais curto, mas para usar o lambda nesse caso, você ainda precisará de uma entrada e uma saída para responder à pergunta original.
george
1
O consenso da comunidade @george é que as funções podem usar argumentos e retornar valores em vez de usar stdin / stdout. Ter um olhar para os nossos padrões para I / O . Embora você possa substituí-los, se quiser, não faria muito sentido nesse desafio em particular.
Denker
@DenkerAffe ok, tudo bem. Quando fiz a pergunta, quero dizer que a saída seria um eco ou impressão. Mas vou deixar isso para os padrões. Então, sim, usando lambda seria mais curto
george
3

C # 6.0 - 58 bytes

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

Leva a string de entrada como um argumento para a função.

Yytsi
fonte
3

Haskell, 36 bytes

f 's'="th";f 'S'="Th";f x=[x]
(>>=f)
Lynn
fonte
Você não precisa do espaço:f's'=...
ThreeFx
1
Infelizmente sim. Os nomes de Haskell podem conter apóstrofos. :( #
Lynn
Oh droga, eu esqueci completamente isso. Eu quase nunca preciso Char...
ThreeFx 17/06
8
Eu pensei que "Hathkell"
Patrick Roberts
3

Ferrugem, 46 bytes

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

Experimente online!

Kek
fonte
1
@ mbomb007. Não tenho certeza se você deve editar isso.
Washington Guedes
Estou fazendo com que siga as diretrizes de resposta. Deveria poder visualizar uma postagem e saber qual idioma é. Alguns idiomas já contêm "th", portanto é ambíguo. E quem pode dizer que alguém não criará uma linguagem diferente chamada "Rutht" no futuro?
mbomb007
2
@ mbomb007, quem dirá que alguém não criará um idioma diferente chamado "Ferrugem" no futuro?
msh210
@ msh210 Ponto discutível, porque se usado, o cartaz precisará esclarecer.
mbomb007
3

PHP, 42 bytes

se executado a partir de um arquivo:

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

Correr como:

~$ php [file] "This is Silly"
InaScuffle
fonte
-1 byte: remova a nova linha no final
Erik the Outgolfer
-8 bytes: remova aspas. -> use php -d error_reporting=0para suprimir avisos.
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
Timtech
fonte
Isto está errado. Str1nunca muda e Ansmanterá um número no final.
lirtosiast
Obrigado pela nota, corrigida agora. Eu não sei como eu esqueci de salvar Str1novamente ...
Timtech
Isso ainda está errado; ele erro quando o primeiro ou o último caractere é S. Como eu disse antes, teste seu código antes de publicá-lo.
lirtosiast
3

Java, 101 bytes

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

Observe que este é um programa completo, diferente da resposta Java anterior .

Bônus (deve ser alimentado primeiro ao pré-processador C THEE pré-processador ):

#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"));}}
dorukayhan quer Monica de volta
fonte
2

Pitão, 14 bytes

::z\s"th"\S"Th

Suíte de teste

Obrigado a @LeakyNun por detectar um erro de digitação!

Denker
fonte
5
Então a linguagem é "Pys"? : P
mbomb007
2

MATL , 17 bytes

115'th'YX83'Th'YX

Experimente online!

Explicação

115    % 's' (ASCII)
'th'   % String 'th'
YX     % Regex replacement
83     % 'S' (ASCII)
'Th'   % String 'Th'
YX     % Regex replacement
Luis Mendo
fonte
2

Python 3, 53 bytes

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

Uso:

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

Tham and Thally like Thheep
m654
fonte
-7 bytes: lambda s:s.replace("s","th").replace("S","Th")Uso:(lambda s:s.replace("s","th").replace("S","Th"))(s)
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Bem, isso é idêntica à resposta de TuukkaX (que foi publicado antes de o meu), então ...
m654
Não há razão para postar outra resposta então.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Eu não notei o dele quando publiquei o meu.
M654
Você pode excluir sua resposta assim que notar que há uma mais curta publicada antes da sua.
Erik the Outgolfer
2

Idioma do GameMaker, 74 bytes

return string_replace_all(string_replace_all(argument0,'s','th'),'S','Th')
Timtech
fonte
2

Matlab, 39 byteth

Uma abordagem direta:

@(t)strrep(strrep(t,'s','th'),'S','Th')
pajonk
fonte
2

Emacth Lithp, 61 bytes

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

O Emacs Lisp tenta ser inteligente ao substituir o texto, mas essa inteligência é interrompida quando a sequência substituída ocupa apenas um espaço, ou seja, a letra maiúscula S. Para impedir que isso converta "Sam e Sally" em "THam e THally", a palavra inteira é correspondido. No entanto, isso também lida com "SAM e Sally" da maneira que se deseja, ou seja, produzindo "THAM e Thally".

Lord Yuuma
fonte
2

código de máquina x86, 19 bytes

Em hexadecimal:

86ac3c5374043c73750440aab068aa84c075eec3

Entrada:: ESIsequência de entrada,: EDIbuffer de saída.

Desmontagem:

_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         
meden
fonte
Você pode usar test al, 'S'para verificar ambos ao mesmo tempo
anatolyg
2

Befunge 98, 37 49 bytes

Versão original :

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

Edição final, conforme consenso:

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

Isso deixa um grande buraco na grade de código que eu não estou muito feliz. Vou investigar isso quando tiver tempo.
O 49º byte é um espaço no final da segunda linha, incluído para ter uma grade retangular, necessária para impedir que o ccbi (e provavelmente outros intérpretes) espreite e imprima uma linha infinita de "Th" s.

karhell
fonte
2

35 Byteth of Julia:

s->replace(s,r"s"i,s->"$(s[1]+1)h")

Experimente online! (inclui todos os casos de teste)

mais um minuto
fonte
Ei, eu não te conheço de algum lugar? ;)
Alex A.
1

SpecBAS ThpecBATh - 53 bytes

1 INPUT a$: ?REPLACE$(REPLACE$(a$,"S","Th"),"s","th")
Brian
fonte