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


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.


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


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>


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

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


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


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


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.


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


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.


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

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'.

3

Python3 - 46 bytes

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

Queda de 4 bytes com a ajuda de @DenkerAffe !


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.


3

Haskell, 36 bytes

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

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!


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"

-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

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"));}}


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

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

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

2

Matlab, 39 byteth

Uma abordagem direta:

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

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".


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         

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.



1

SpecBAS ThpecBATh - 53 bytes

1 INPUT a$: ?REPLACE$(REPLACE$(a$,"S","Th"),"s","th")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.