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


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.


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>


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

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


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


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


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.


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


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?


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

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

3

Python3 - 46 bytes

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

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


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.


3

Haskell, 36 bytes

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

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!


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"

-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

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


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

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ᴏʟғᴇʀ 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')

2

Matlab, 39 bytes

Un enfoque directo:

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

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


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         

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.



1

SpecBAS ThpecBATh - 53 bytes

1 INPUT a$: ?REPLACE$(REPLACE$(a$,"S","Th"),"s","th")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.