El inversor reversible


19

Tu tarea es simple. El programa lee en una línea de texto desde la entrada estándar, e imprime el mismo texto en forma de caracteres invertidos. No está permitido imprimir nada más.

Por ejemplo:

entrada: "¡Hola!", salida: "! olleH"

¡El problema es que su programa debe ser capaz de hacer exactamente lo mismo si el código fuente en sí está invertido!

Puntaje: se aplica el puntaje estándar de código de golf, con la siguiente modificación para limitar el aburrimiento

//margorp
program//

respuestas de estilo: cualquier solución que sea un palíndromo incurrirá en una penalización de + 25% a la puntuación, redondeada. Esta penalización aún se aplica si, por ejemplo, inserta caracteres en el programa que no tienen ningún efecto útil, solo para romper el palíndromo.


2
Los "efectos útiles" probablemente no pueden especificarse objetivamente. Por ejemplo, en GolfScript, ¿qué pasa con -1%#%1-/1o -1%#%(0?
Peter Taylor

Respuestas:


14

APL, 5

⌽⍞⍝⍞⊖

Esto invierte (a lo largo del último eje) la entrada ( ), y es seguido por un comentario ( marca un comentario de línea). Invertido, el programa invierte (a lo largo del primer eje) la entrada y le sigue un comentario. Debido a que la entrada siempre será unidimensional, en este caso y funcionalmente equivalentes. Quizás sea aún más astuto que la solución GolfScript, así que aquí hay una solución más limpia (sin comentarios), que obtiene un puntaje de 9 .

⍬,⌽,⍞,⊖,⍬

Esto primero toma un vector vacío ( ), lo aplana (monádico ,) y lo invierte (a lo largo del primer eje). Esto todavía deja un vector vacío. Luego se concatena (diádico ,) a la entrada ( ), dejando la entrada intacta. Luego aplana (monádico ,) la entrada ya plana y la invierte (a lo largo del último eje). Luego concatena (diádico ,) otro vector vacío ( ) a la entrada invertida. Esto no hace nada y deja atrás la entrada invertida. Invertido, este programa hace lo mismo, basado nuevamente en el hecho de que y son funcionalmente equivalentes con argumentos unidimensionales.

Realmente no podría decir que estoy agregando caracteres inútiles para romper el palíndromo (las dos funciones inversas diferentes son diferentes con una entrada de dos o más dimensiones; solo estoy aprovechando el hecho de que actúan igual con uno- entrada dimensional)


14

Unix shell - 8 + 25% = 10

rev||ver

La respuesta anterior de cat|tacno funcionó realmente, tacinvierte el orden de las líneas, no el orden de los caracteres en una línea.


10

Haskell, 53

main=niam
niam=interact reverse
esrever tcaretni=main

Técnicamente no es un palíndromo, pero, dado que el orden de declaración de funciones no importa, una vez invertido, tiene exactamente el mismo programa.


Niza (+1). No creía que esto realmente hiciera nada, antes de probarlo ( Link ).
Martin Thoma

mueve la main=niamdeclaración a la mitad y obtienes un palíndromo.
Johannes Kuhn

@JohannesKuhn Sí, admito que sigue siendo la solución de palíndromo "aburrida", con una apariencia diferente.
lortabac


6

Tcl, 78

puts [string rev [gets stdin]];#\
]]nidts steg[ ver gnirts[ stup;# tixe emaner

No es un palíndromo.



¿Qué efecto útil tiene "renombrar salida" en este programa? (No sé Tcl)
vsz

cambia el nombre del comando exita #(el # es un parámetro, no el comienzo de un comentario). \#en la siguiente línea se ejecutará #(no se inicia el comentario porque escapó) que es lo nuevo exit.
Johannes Kuhn

6

gs2, 2

(Sí, este lenguaje se creó antes del desafío. No, no es una broma ni una escapatoria. El espacio ASCII ( 0x20) es inverso ).

EDITAR: aw, hombre, esta pregunta es súper vieja? Si tan solo me hubiera comprometido antes. : <Sin embargo, dejaré esta respuesta solo porque es demasiado buena para dejarla pasar.


3

Golfscript, 9 (7 * 1.25 = 8.75)

-1%#%1-

sucio, sucio, sucio, pero extremadamente corto. -1%significa "seleccionar cada elemento (carácter), hacia atrás" y #significa "comentario de línea". El resto es solo un poco de la magia de E / S de GolfScript.

Esta es la solución "limpia" (sin comentarios) más corta que he encontrado ( 14 * 1.25 = 17.5 ):

'';-1%..%1-;''

lo que significa: empujar una cadena vacía, soltarla, invertir la entrada, clonarla dos veces, dividirla sola (consumir dos copias y producir una matriz vacía), eliminar todas las de la matriz vacía, soltar la matriz vacía, empujar una cadena vacía e (implícitamente) imprime la pila.


Debería haber esperado esto. Incluso una penalización del 500% tendría una alta probabilidad de convertirlo en un ganador.
vsz

@vsz Estoy buscando una solución sin comentarios (es decir, limpia) en golfscript, sin embargo.
John Dvorak

Si la entrada no contiene 1's ..
Johannes Kuhn

@JohannesKuhn tienes razón. He dejado caer esa "solución".
John Dvorak

@vsz un desafío más interesante es prohibir personajes de comentarios (¿y aún penalizar palíndromos?) Mi concursante para esto tiene 14 personajes, supongo que muchos.
John Dvorak

3

Rubí, 44

puts gets.reverse#esrever.steg stup

Solo un comentario al final de un programa normal: P

35 caracteres, + 25% = 44


2

Tcl, 75.25

Esta vez un palíndromo.

puts [string rev [gets stdin]]]]nidts steg[ ver gnirts[ stup

(entre ]]y ]]es el personaje \ x1A.)
Johannes Kuhn

2

Pitón 3, 42

print(input()[::-1]);#)]1-::[)(tupni(tnirp

Créditos

  • Versión inicial con puntaje de 49 + 25% = 61.25 creado por mí
  • Gracias a arshajii por mejorar el puntaje de 61.25 a 51.25
  • Nueva versión con puntaje de 42 ( :-)) creada por mí

En su lugar, puede usar print(input()[::-1])#)]1-::[)(tupni(tnirpPython 3 para reducir el puntaje a 51.25.
arshajii

1
Eso no es cortar ...
Oliver Ni

"cualquier solución que sea un palíndromo incurrirá en una penalización de + 25% a la puntuación, redondeada. Esta penalización aún se aplica si, por ejemplo, inserta caracteres en el programa que no tienen ningún efecto útil, solo para romper el palíndromo ". Yo diría que ;es una inserción que no tiene ningún efecto útil.
Oliver Ni

2

Rebmu : 9 (con penalización) o 13 (sin)

La solución aburrida de Rebmu es 9 y lleva la pena palindrómica. Lo mostraré de todos modos "solo porque":

rnRVaVRnr

Usando el truco inmóvil de notar que las letras mayúsculas de las letras son palabras separadas, y la falta de una letra mayúscula principal significa que no estamos haciendo una palabra establecida, producimos cinco palabras comunes:

rn rv a vr nr

Que es una abreviatura para el código equivalente (también Rebmu legal):

return reverse a vr nr

El hecho de que vr y nr no tengan sentido no importa, porque a pesar de no estar asignados a nada son palabras válidas. Entonces el evaluador solo ejecuta el return reverse a... funciona en ambos sentidos. Pero esto es análogo en cierto sentido al truco aburrido: el código no está comentado, pero está muerto y no se ejecuta en una ruta.

Para algo más emocionante que no incurre en la penalización, ¿qué tal esta solución de 13 caracteres:

a VR :rv AvrA

Veamos cómo se procesa esto en sus rutas hacia adelante y hacia atrás, cuando se expande. Adelante:

a               ; evaluate a, as it is a string it has no side effects
vr: :reverse    ; "set" vr to mean what a "get" of reverse means now
a: vr a         ; assign a to calling "vr" on a, effectively reversing
                ;   ^-- result of assign is last expression, the answer!

Al revés como ArvA vr: RV a:

a: reverse a    ; assign A to its reversal
vr: rv: a       ; make the abbreviation vr equal to assignment of a to rv
                ;   ^-- result of assign is last expression, the answer!

En el lado negativo, la variante hacia atrás está sobrescribiendo la abreviatura de reversa. Pero bueno, no es un palíndromo, y son solo 13 caracteres. :-)

(Nota: Esto supone que está ejecutando Rebmu en el modo / args, donde a es el argumento predeterminado para el programa pasado al intérprete en la línea de comando y usted acepta el resultado. Si leer desde la entrada estándar es realmente un requisito, las cosas crezca, por ejemplo, de 9 a 11 caracteres para la solución simple:. rnRVrArVRnrY si tiene que imprimir a la salida estándar desde el programa en lugar de aceptar la salida de expresión del intérprete, eso también agregaría un par de caracteres).


2

JavaScript, 62 * 1.25 = 78

i.split('').reverse().join('')//)''(nioj.)(esrever.)''(tilps.i

No demasiado creativo, pero lo mejor que se me ocurrió. (supone que la entrada se almacena en variable i)

Obtuve esto:

63 caracteres, sin palíndromo

i.split('').reverse().join('')//)a(nioj.)(esrever.)''=a(tilps.i

pero se sentía demasiado como hacer trampa. : PI podría hacer muchos más cambios triviales (como usar en i['split']lugar de i.split), pero todos esos todavía tienen ganas de hacer trampa: P


se supone que la entrada se almacena en la variable i luego (p=a=>a&&p()==`(p=${p})(i)`?i:i.split``.reverse().join``)(i)(60 bytes) hace esa cosa.
Esc Điệp

2

Pyke, 2 (+ 25%), no competidor

_

Pyke toma la entrada implícitamente y las salidas implícitamente.

_ Es la función inversa.


1

Tcl, 99

proc unknown args {puts "Hello World!"}
}"!dlroW olleH" stup{ sgra nwonknu corp

Si se llama a un comando que no existe, se llama a un unknowncomando especial que podría cargar el comando. O hacer otras cosas divertidas.


1

T-SQL, 86 * 1.25 = 108

Aquí hay una aburrida entrada palindrómica para SQL Server 2008 (y más reciente) solo para mostrar que es posible.

DECLARE @ VARCHAR(MAX)='Hi'PRINT REVERSE(@)--)@(ESREVER TNIRP''=)XAM(RAHCRAV @ ERALCED

@ contiene el texto de entrada, la cadena de ejemplo es "Hola". El recuento de caracteres de esta entrada es para una cadena de entrada de dos caracteres.


1

Barril , ceil (1 + 0.25) = 2 bytes

?

Esto toma entrada y se invierte, y la salida implícita lo genera literalmente. TIO



0

QBIC , 14 + 25% = 18 bytes

;?_fA|#|Af_?;

Emplea un código fuente palindrómico. Usar dos formas distintas de hacer esto lleva algo más de tiempo (34 bytes):

;[_lA|,1,-1|Z=Z+mid$(A,a,1)#|Af_?;

Explicación:

Read the input string from the command line as A$
;

FOR len(A$); a >= 1; a--
[        Starts a FOR loop
_l...|   returns the length the argument(here, A$); sets the starting point of the loop
,1       set the end point of the loop
,-1      FOR loop incrementer (or decrementer in this case)
|        Ends the argument list for the FOR loop

On each FOR iteration, add the right-most character of the input to Z$
Z=Z+mid$(A,a,1)

The cheat:
# starts a string literal, hiding the flipped source.
    The literal is closed implicitly at the end-of-file.
    The FOR loop is closed implicitly at the end-of-file.
    Z$ gets printed implicitly at the end of the program if it's non-empty

The flipped source is the same as my palindrome-code:
;       reads in A$ from the cmd line   
 ?      PRINT
  _fA|  The reversed version of A$
      # And hide the rest of our source in a literal  

0

Pushy , 7 bytes (5 + 25%)

@"i"@

Pruébalo en línea!

Esto incurre en una penalización del 25% ya que es un palíndromo, pero es lo mejor que puedo hacer. No importa en qué dirección se ejecute el programa, ejecuta estos 3 comandos:

@     \ Reverse the input
 "    \ Print
  i   \ Exit

La sustitución ide c(clear stack) o \(comment) tiene el mismo efecto.



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.