L'inverseur réversible


19

Votre tâche est simple. Le programme lit une ligne de texte à partir de l'entrée standard et imprime le même texte sous une forme inversée. Il n'est pas autorisé d'imprimer autre chose.

Par exemple:

entrée: "Bonjour!", sortie: "! olleH"

Le hic , c'est que votre programme doit être capable de faire exactement la même chose si le code source lui-même est inversé!

Notation: la notation par code-golf standard s'applique, avec la modification suivante pour limiter l'ennui

//margorp
program//

réponses de style: toute solution qui est un palindrome entraînera une pénalité de + 25% au score, arrondie. Cette pénalité s'applique toujours, si vous, par exemple, insérez des caractères dans le programme qui n'ont aucun effet utile, juste pour casser le palindrome.


2
Les "effets utiles" ne peuvent probablement pas être spécifiés objectivement. Par exemple, dans GolfScript, qu'en est-il de -1%#%1-/1ou -1%#%(0?
Peter Taylor

Réponses:


14

APL, 5

⌽⍞⍝⍞⊖

Cela inverse ( , le long du dernier axe) l'entrée ( ), et est suivi d'un commentaire ( marque un commentaire de ligne). Inversé, le programme inverse (le long du premier axe) l'entrée et est suivi d'un commentaire. Parce que l'entrée va toujours être unidimensionnelle, dans ce cas et sont fonctionnellement équivalentes. C'est peut-être encore plus sournois que la solution GolfScript, alors voici une solution plus propre (sans commentaires), qui obtient un score de 9 .

⍬,⌽,⍞,⊖,⍬

Ce premier saisit un vecteur vide ( ), l'aplatit (monadique ,) et l'inverse ( , le long du premier axe). Cela laisse toujours un vecteur vide. Ensuite, il concatène (dyadique ,) à l'entrée ( ), laissant l'entrée intacte. Il aplatit ensuite (monadique ,) l'entrée déjà plate et l'inverse ( , le long du dernier axe). Ensuite, il concatène (dyadique ,) un autre vecteur vide ( ) à l'entrée inversée. Cela ne fait rien et laisse l'entrée inversée derrière. Inversé, ce programme fait la même chose, basé à nouveau sur le fait que et sont fonctionnellement équivalents avec des arguments unidimensionnels.

Vous ne pouvez vraiment pas dire que j'ajoute des caractères inutiles pour briser le palindrome (les deux fonctions inverses différentes sont différentes avec une entrée bidimensionnelle ou plus; je profite simplement du fait qu'elles agissent de la même façon avec une- entrée dimensionnelle)


14

Coque Unix - 8 + 25% = 10

rev||ver

La réponse précédente de cat|tacne fonctionnait pas réellement, tacinverse l'ordre des lignes, pas l'ordre des caractères d'une ligne.


10

Haskell, 53

main=niam
niam=interact reverse
esrever tcaretni=main

Techniquement, ce n'est pas un palindrome, mais, comme l'ordre de déclaration des fonctions n'a pas d'importance, une fois inversé, vous avez exactement le même programme.


Sympa (+1). Je ne pensais pas que cela avait réellement fait quoi que ce soit, avant de l'avoir essayé ( Link ).
Martin Thoma

déplacez la main=niamdéclaration vers le milieu et vous obtenez un palindrome.
Johannes Kuhn

@JohannesKuhn Oui, j'avoue que c'est toujours la solution palindrome "ennuyeuse", avec une apparence différente.
lortabac


6

Tcl, 78

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

Pas un palindrome.



Quel effet utile "Renommer la sortie" a-t-il dans ce programme? (Je ne sais pas Tcl)
vsz

renomme la commande exità #(le # est un paramètre, pas le début d'un commentaire). \#dans la ligne suivante s'exécutera #(pas le début du commentaire car échappé) qui est le nouveau exit.
Johannes Kuhn

6

gs2, 2

(Oui, ce langage a été fait avant le défi. Non, ce n'est pas une blague ou une faille. L' espace ASCII ( 0x20) est inversé .)

EDIT: aw, mec, cette question est super vieille? Si seulement je m'étais engagé plus tôt. : <Je vais laisser cette réponse juste parce que c'est trop beau pour la laisser passer.


3

Golfscript, 9 (7 * 1,25 = 8,75)

-1%#%1-

sale, sale, sale, mais extrêmement court. -1%signifie "sélectionner chaque élément (caractère), en arrière" et #signifie "commentaire de ligne". Le reste n'est qu'un peu de la magie d'E / S de GolfScript.

C'est la solution "propre" la plus courte (aucun commentaire) que j'ai trouvée ( 14 * 1,25 = 17,5 ):

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

ce qui signifie: pousser une chaîne vide, la supprimer, inverser l'entrée, la cloner deux fois, la diviser par elle-même (consommer deux copies et produire un tableau vide), supprimer toutes celles du tableau vide, supprimer le tableau emtpy, pousser une chaîne vide et (implicitement) imprimer la pile.


J'aurais dû m'attendre à ça. Même une pénalité de 500% aurait de grandes chances d'en faire un gagnant.
vsz

@vsz Je recherche cependant une solution sans commentaire (c'est-à-dire propre) dans golfscript.
John Dvorak

Si l'entrée ne contient pas de 1 ..
Johannes Kuhn

@JohannesKuhn vous avez raison. J'ai abandonné cette "solution".
John Dvorak

@vsz un défi plus intéressant est d'interdire les caractères de commentaire (et de pénaliser toujours les palindromes?) Mon concurrent pour cela a 14 caractères, beaucoup je suppose.
John Dvorak du

3

Rubis, 44

puts gets.reverse#esrever.steg stup

Juste un commentaire à la fin d'un programme normal: P

35 caractères, + 25% = 44


2

Tcl, 75,25

Cette fois, un palindrome.

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

(entre ]]et ]]est le caractère \ x1A.)
Johannes Kuhn

2

Python 3, 42

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

Crédits

  • Version initiale avec un score de 49 + 25% = 61,25 créé par moi
  • Merci à arshajii d' avoir amélioré le score de 61,25 à 51,25
  • Nouvelle version avec score de 42 ( :-)) créée par moi

Vous pouvez utiliser print(input()[::-1])#)]1-::[)(tupni(tnirpen Python 3 à la place pour réduire le score à 51,25.
arshajii

1
Ce n'est pas la coupe ...
Oliver Ni

"toute solution qui est un palindrome entraînera une pénalité de + 25% sur le score, arrondie. Cette pénalité s'applique toujours, si vous, par exemple, insérez dans le programme des caractères qui n'ont aucun effet utile, juste pour casser le palindrome . " Je dirais que ;c'est une telle insertion qui n'a aucun effet utile.
Oliver Ni

2

Rebmu : 9 (avec pénalité) ou 13 (sans)

La solution ennuyeuse de Rebmu est 9 et porte la pénalité palindromique. Je vais le montrer quand même "juste parce que":

rnRVaVRnr

En utilisant l' astuce impassible de remarquer les majuscules des lettres, ce sont des mots séparés, et le manque de majuscule signifie que nous ne faisons pas un mot d'ensemble, nous produisons cinq mots ordinaires:

rn rv a vr nr

Ce qui est un raccourci pour le code équivalent (également Rebmu légal):

return reverse a vr nr

Le fait que vr et nr soient dénués de sens n'a pas d'importance, car bien qu'ils ne soient affectés à rien, ce sont des mots valides. L'évaluateur ne fait donc que return reverse a... ça marche dans les deux sens. Mais cela est analogue dans un sens à la triche ennuyeuse: le code n'est pas commenté, mais il est mort et n'est pas exécuté sur un chemin.

Pour quelque chose de plus excitant qui n'encourt pas la pénalité, que diriez-vous de cette solution à 13 caractères:

a VR :rv AvrA

Voyons comment cela est traité sur ses chemins avant et arrière, une fois développé. Vers l'avant:

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!

En arrière comme 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!

À la baisse, la variante à l'envers écrase l'abréviation de reverse. Mais bon, ce n'est pas un palindrome, et c'est seulement 13 caractères. :-)

(Remarque: cela suppose que vous exécutez Rebmu en mode / args, où a est l'argument par défaut du programme transmis à l'interpréteur sur la ligne de commande et que vous acceptez le résultat. Si la lecture à partir de l'entrée standard est en fait une exigence, les choses passer par exemple de 9 à 11 caractères pour la solution simple:. rnRVrArVRnrEt si vous devez imprimer sur une sortie standard à partir du programme au lieu d'accepter la sortie d'expression de l'interpréteur qui ajouterait également quelques caractères.)


2

JavaScript, 62 * 1,25 = 78

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

Pas trop créatif, mais le meilleur que j'ai pu trouver. (suppose que l'entrée est stockée dans une variablei )

J'ai compris ceci:

63 caractères, pas de palindrome

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

mais ça ressemblait trop à de la triche. : PI pourrait faire beaucoup plus de changements triviaux (comme utiliser à la i['split']place de i.split), mais tous ceux-là ont toujours envie de tricher: P


suppose que l'entrée est stockée dans la variable i puis (p=a=>a&&p()==`(p=${p})(i)`?i:i.split``.reverse().join``)(i)(60 octets) fait cette chose.
Esc Điệp

2

Pyke, 2 (+ 25%), non compétitif

_

Pyke prend l'entrée implicitement et sort implicitement.

_ est la fonction inverse.


1

Tcl, 99

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

Si une commande qui n'existe pas est appelée, une unknowncommande spéciale est appelée qui pourrait charger la commande. Ou faites d'autres trucs drôles.


1

T-SQL, 86 * 1,25 = 108

Voici une entrée palindromique ennuyeuse pour SQL Server 2008 (et plus récent) juste pour montrer que c'est possible.

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

@ contient le texte saisi, l'exemple de chaîne étant "Hi". Le nombre de caractères de cette entrée correspond à une chaîne d'entrée de deux caractères.


1

Keg , ceil (1 + 0,25) = 2 octets

?

Cela prend l'entrée et l'inverse, et la sortie implicite la produit littéralement. TIO



0

QBIC , 14 + 25% = 18 octets

;?_fA|#|Af_?;

Utilise un code source palindromique. L'utilisation de deux méthodes distinctes pour ce faire prend un peu plus de temps (34 octets):

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

Explication:

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 octets (5 + 25%)

@"i"@

Essayez-le en ligne!

Cela entraîne une pénalité de 25% car c'est un palindrome, mais c'est le mieux que je puisse faire. Peu importe la façon dont le programme est exécuté, il exécute ces 3 commandes:

@     \ Reverse the input
 "    \ Print
  i   \ Exit

La substitution ide c(effacer la pile) ou de \(commentaire) a le même effet.



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.