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.

vsz
la source
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)

Volatilité
la source
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.

Geoff Reedy
la source
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.

lortabac
la source
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
10

Rubis, 37

eval <<1.reverse#
esrever.steg stup
1

Renversé:

1
puts gets.reverse
#esrever.1<< lave
histocrate
la source
Herestrings, sournois! +1
Poignée de porte
6

Tcl, 78

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

Pas un palindrome.

Johannes Kuhn
la source
Idone original - inversé
Johannes Kuhn
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.

Lynn
la source
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.

John Dvorak
la source
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

resueman
la source
2

Tcl, 75,25

Cette fois, un palindrome.

puts [string rev [gets stdin]]]]nidts steg[ ver gnirts[ stup
Johannes Kuhn
la source
(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
Martin Thoma
la source
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.)

Dr. Rebmu
la source
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

Poignée de porte
la source
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.

Bleu
la source
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.

Johannes Kuhn
la source
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.

Muqo
la source
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

UNE
la source
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  
steenbergh
la source
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.

FlipTack
la source
0

05AB1E , 1 + 25% = 2 octets

R

Essayez-le en ligne!

Bismarck71
la source
Vous devez arrondir, c'est donc (1 + 0,25) = 1,25 arrondi = 2 octets.
A
Merci! J'ai fixé le titre.
Bismarck71
0

R , 65 octets

EDIT: abandonné la pénalité de 25% grâce à un changement trivial, mais invisible pour moi, de Grimy.

stringi::stri_reverse(scan(,""))#))'',(nacs(esrever_irts::ignirts

Essayez-le en ligne!

Dites bonjour à la capacité abyssale de R à gérer les chaînes, même lorsque vous utilisez des packages conçus pour des chaînes comme stringi... barf

Sumner18
la source