Tranthlator Lithp

28

Mi amigo hizo un traductor lisp el otro día, es decir, tomó una cadena y convirtió s => th y S => Th. Fue bastante largo y pensé que se podía jugar golf.

Entonces, la tarea es hacer un programa / función que tome una cadena de entrada, la traduzca a lisp y genere la cadena

Caso de prueba

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

Tenga en cuenta que no importa que h se repita todo el tiempo

Este es el código de golf, así que la respuesta más corta gana

Jorge
fuente
13
Desearía que todos cambiaran los bytes en sus encabezados a bytes .
Leaky Nun
66
Debería haber puntos de bonificación si el programa no lo utiliza sni Sen ninguna parte.
Nate Diamond
1
Creo que los nombres de los idiomas deben quedar claros. Sin el reemplazo. Algunos idiomas ya contienen "th", por lo que es ambiguo. ¿Y quién puede decir que en el futuro alguien no creará un lenguaje diferente llamado "Common Lithp"?
mbomb007
1
@ mbomb007 No me preocuparía demasiado. No estoy seguro de si hay una forma predeterminada de titular su respuesta. La mayoría de las preguntas que veo si afirman cómo hacerlo es normalmente de la misma manera. Como no he explicado cómo debe establecerse la respuesta, los usuarios pueden asignarles el título que quieran. Como pedante, ni siquiera pedí un idioma, por lo que podría argumentar en contra de ellos incluso escribiéndolos. Pero entiendo tu punto. Simplemente no creo que sea motivo de preocupación
george
2
Una cosa que habría hecho que este desafío fuera más interesante sería la preservación general de los casos, por ejemploLOOK OUT A SNAKE!!! -> LOOK OUT A THNAKE!!!
esponjoso

Respuestas:

36

Lithp común, 62

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

Primero, (read)la entrada (debe ser una cadena). Las cadenas en CL son secuencias que usamos mappara iterar en cada carácter. El primer argumento para maprepresenta el tipo de resultado (por ejemplo, podría construir una lista a partir de un vector). Cuando es nil, alias (), los resultados se descartan. La función que se asigna a la entrada simplemente princ(imprime de forma no legible) cada carácter, excepto los que deben reemplazarse.

volcado de memoria
fuente
14
Sin embargo, ese nombre de idioma.
Joe Z.
1
@JoeZ. Acabo de reemplazar el sby th, como todos los demás: mira esas respuestas de Pyson.
coredump
@coredump Todos están equivocados: es unidireccional: s-> th, S-> Th, th-> th, Th-> Th.
Erik the Outgolfer
1
@DrGreenEggsandIronMan Sure, (defmacro cathe (&rest args) `(case ,@args))
coredump
1
Ok, jaja, eso tiene más sentido
13

JavaThcript ETh6, 38 bytes

Al principio fui con la solución obvia

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

Pero lo jugué 4 bytes

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

Esto utiliza el iindicador regex , que busca patrones que no distinguen entre mayúsculas y minúsculas. Lo bueno de Javascript es que puede especificar una función anónima para manejar el reemplazo (regex).

Pruébalo aquí

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
fuente
11
"E eth thickth"?
Joe Z.
Estaba pensando 'Tt'[b>'r']+'h', pero tiene la misma duración
Washington Guedes
1
Te refieres a 38 byteth
Downgoat
1 de TIL que la comparación de cadenas se realiza a través de Punto de código de Valor
MayorMonty
@ Upgoat Fue mi culpa lo siento.
Neil
11

GNU Sed - 17

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

La respuesta obvia.

$ 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
fuente
17
¿Quiso decir GNU Thed? ;)
m654
8

Python 3 - 40 bytes

Primero golf!

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

Utiliza el método de traducciónstr del módulo que acepta una tabla de traducción. La tabla de traducción es simple con código clave como claves y en su lugar como valor.dictstr

Gabor Fekete
fuente
1
¡Bienvenido a la comunidad PP&CG!
Erik the Outgolfer
44
¿Puedo preguntarle por qué tiene 2 cuentas separadas?
Bálint
@ Bálint Aparentemente, olvidó iniciar sesión en su cuenta corriente con solo 3 repeticiones, pero con una experiencia en Stack Overflow . Y publicado con una nueva cuenta.
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'));

Patrick Roberts
fuente
66
Confethth: ¡solo escribiste eso para el título!
dejó de girar en sentido antihorario el
6

V , 11 bytes

Ís/th
ÍS/Th

Pruébalo en línea!

Con un idioma que hice. No está terminado, pero es realmente bueno en la regekth.

DJMcMayhem
fuente
5

C, 50 bytes

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

Reemplazar \1con un \x01byte real .

jimmy23013 guardó un byte, ¡y luego salvé dos más usando su enfoque! Gracias.

Lynn
fuente
Estaba a punto de comentar que el &cparámetro está roto. Pero no lo es, porque en una arquitectura little-endian el segundo byte de eso intserá 0x00y realmente terminará la "cadena" ... Esto es terriblemente inteligente, ¡me encanta!
Quentin
s(c){c=getchar();c+=c-83&~32?0:26625;s(printf(&c));}
jimmy23013
No puede insertar 2 bytes en a char. 'h\1'
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ constantes de múltiples caracteres se definen aplicación, bu perfectamente válido C
Dennis
5

05AB1E, 14 12 bytes

's„th:'S„Th:

La respuesta directa.

Pruébalo en línea

Guardado 2 bytes gracias a @Adnan

Emigna
fuente
¿No es esta la respuesta directa más directa que la respuesta directa?
Dorukayhan quiere que Monica regrese el
4

Java, 71 65 bytes

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

Primer intento de jugar al golf, entonces, ¿por qué no con Java?

Insano
fuente
2
Puede usar en replacelugar dereplaceAll
aditsu
Oh, si tienes razón. ¡Gracias! @aditsu
Insane
3
Puede guardar algunos bytes utilizando una expresión lambda en lugar de una función. s->s.replace("S","Th").replace("s","th")
Denker
4

GNU AWK, 31 bytes

Simplemente usando la gsubfunción para traducir S inferior o superior a través de expresiones regulares e imprimirlo después. Puede trabajar con archivos, o stdincomo en este caso

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

CJam, 15 bytes

q"sS""thTh"2/er

Pruébalo aquí.

Explicación

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
fuente
3

Python3 - 46 bytes

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

¡Se eliminaron 4 bytes con la ayuda de @DenkerAffe !

Yytsi
fuente
1
Python 3 fue el idioma en el que se escribió originalmente. Mi versión de su código era de 59 bytes, ¡así que lo haremos!
George
1
lambda s:s.replace("s","th").replace("S","Th")Es un poco más corto.
Denker
@DenkerAffe Sí, es más corto, pero para usar lambda en este caso, aún necesitaría una entrada y una salida para responder la pregunta original.
George
1
@george El consenso de la comunidad es que las funciones pueden usar argumentos y devolver valores en lugar de usar stdin / stdout. Echar un vistazo a nuestros valores por defecto de E / S . Si bien, por supuesto, puede anularlos si lo desea, no tendría mucho sentido en este desafío en particular.
Denker
@DenkerAffe, está bien. Cuando hice la pregunta, me refiero a que la salida sería un eco o una impresión. Pero lo dejaré a los valores predeterminados. Entonces, sí, usar lambda sería más corto
george
3

C # 6.0 - 58 bytes

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

Toma la cadena de entrada como argumento para la función.

Yytsi
fuente
3

Haskell, 36 bytes

f 's'="th";f 'S'="Th";f x=[x]
(>>=f)
Lynn
fuente
No necesita espacio:f's'=...
ThreeFx
1
Tristemente lo hago. Los nombres de Haskell pueden contener apóstrofes. :(
Lynn
Oh maldición, lo olvidé por completo. Casi nunca necesito Chars ...
ThreeFx
8
Pensé que sería "Hathkell"
Patrick Roberts
3

Óxido, 46 ​​bytes

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

Pruébalo en línea!

Kek
fuente
1
@ mbomb007. No estoy seguro de que debas editar eso.
Washington Guedes
Lo estoy haciendo seguir las pautas de respuesta. Debería poder ver una publicación y saber qué idioma es. Algunos idiomas ya contienen "th", por lo que es ambiguo. ¿Y quién puede decir que alguien no creará un lenguaje diferente realmente llamado "Rutht" en el futuro?
mbomb007
2
@ mbomb007, ¿quién puede decir que alguien no creará un lenguaje diferente llamado "Rust" en el futuro?
msh210
@ msh210 Punto discutible, porque si se usa el póster deberá aclararse.
mbomb007
3

PHP, 42 bytes

si se ejecuta desde un archivo:

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

Correr como:

~$ php [file] "This is Silly"
InaScuffle
fuente
-1 byte: eliminar la nueva línea al final
Erik the Outgolfer
-8 bytes: eliminar comillas. -> utilizar 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
fuente
Esto está mal. Str1nunca cambia y Anstendrá un número al final.
lirtosiast
Gracias por la nota, arreglada ahora. No sé cómo olvidé Str1volver a ahorrar ...
Timtech
Esto todavía está mal; se produce un error cuando el primer o el último carácter es S. Como he dicho antes, pruebe su código antes de publicarlo.
lirtosiast
3

Java, 101 bytes

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

Tenga en cuenta que este es un programa completo a diferencia de la respuesta anterior de Java .

Bonificación (se debe alimentar al preprocesador C, ELE, el preprotetro primero):

#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 quiere a Monica de vuelta
fuente
2

Pyth, 14 bytes

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

Banco de pruebas

¡Gracias a @LeakyNun por detectar un error tipográfico!

Denker
fuente
55
Entonces, ¿el idioma es "Pys"? : P
mbomb007
2

MATL , 17 bytes

115'th'YX83'Th'YX

Pruébalo en línea!

Explicación

115    % 's' (ASCII)
'th'   % String 'th'
YX     % Regex replacement
83     % 'S' (ASCII)
'Th'   % String 'Th'
YX     % Regex replacement
Luis Mendo
fuente
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
fuente
-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ᴏʟғᴇʀ Bueno, eso es idéntica a la respuesta de TuukkaX (que fue publicada antes que la mía), así que ...
M654
No hay razón para publicar otra respuesta entonces.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ No noté el suyo cuando publiqué el mío.
m654
Puedes eliminar tu respuesta una vez que notes que hay una respuesta más corta publicada antes que la tuya.
Erik the Outgolfer
2

Lenguaje GameMaker, 74 bytes

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

Matlab, 39 bytes

Un enfoque directo:

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

Emacth Lithp, 61 bytes

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

Emacs Lisp intenta ser inteligente al reemplazar texto, pero esa inteligencia se rompe cuando la cadena reemplazada solo ocupa un espacio, es decir, la letra mayúscula S. Para evitar que esto convierta "Sam y Sally" en "THam y THally", la palabra completa se compara en su lugar. Sin embargo, esto también maneja "SAM y Sally" de la manera que uno desearía, es decir, producir "THAM y Thally".

Lord Yuuma
fuente
2

código de máquina x86, 19 bytes

En hexadecimal:

86ac3c5374043c73750440aab068aa84c075eec3

Entrada:: ESIcadena de entrada,: EDIbúfer de salida.

Desmontaje

_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
fuente
Puede usar test al, 'S'para verificar ambos a la vez
anatolyg
2

Befunge 98, 37 49 bytes

Versión original :

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

Edición final, según consenso:

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

Esto deja un gran agujero en la cuadrícula del código que no estoy muy contento. Lo investigaré cuando tenga tiempo.
El byte 49 es un espacio al final de la segunda línea, incluido para tener una cuadrícula rectangular, necesario para evitar que ccbi (y probablemente otros intérpretes) salgan e impriman una línea infinita de "Th" s.

karhell
fuente
2

35 Bytes de Julia:

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

Pruébalo en línea! (incluye todos los casos de prueba)

un minuto más
fuente
Oye, ¿no te conozco de alguna parte? ;)
Alex A.
1

SpecBAS ThpecBATh - 53 bytes

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