Invierta una cadena mientras mantiene las mayúsculas en los mismos lugares


28

El objetivo aquí es simplemente invertir una cadena, con un solo giro:
mantener la capitalización en los mismos lugares.

Ejemplo de entrada 1: Hello, Midnightas
Ejemplo de salida 1:SathginDim ,olleh

Ejemplo de entrada 2: .Q
Salida de ejemplo 2:q.

reglas :

  • Salida a STDOUT, entrada de STDIN
  • El ganador será elegido el 13 de julio en GMT + 3 12:00 (una semana)
  • La entrada solo puede consistir en símbolos ASCII, lo que facilita los programas que no utilizan ninguna codificación que contenga caracteres no ASCII.
  • Cualquier puntuación que termine en una posición donde haya una letra mayúscula debe ser ignorada.

¿Es eso con o sin la impresión? ¿Es eso con o sin la cuerda?

"Cualquier puntuación que termine en una posición donde haya una letra mayúscula debe ser ignorada". , ¿no es el segundo ejemplo inconsistente con esta regla?
Stefano Sanfilippo

Es coherente con la regla porque los signos de puntuación no tienen una variación en mayúsculas.

Respuestas:


7

TCC - 4 bytes

<>ci

Pruébalo en línea!

Explicación:

     - output is implicit in TCC
<>   - reverse string
  c  - preserve capitalization
   i - get input

99
¿Funcionó esto con una versión tcc.luaanterior a la publicación del desafío? Dado que recientemente ha agregado comandos para resolver otros tres desafíos, supongo que no lo hizo. Si su respuesta requiere una versión del idioma posterior al desafío, debe etiquetarla como no competitiva en el encabezado. Eliminaré mi voto negativo cuando agregue la etiqueta o proporcione pruebas de que su código funcionó en una versión anterior.
Dennis

16

Python, 71 bytes

lambda s:''.join((z*2).title()[c.isupper()-1]for c,z in zip(s,s[::-1]))

Pruébalo en línea

-3 bytes de Ruud, más la inspiración para 2 más.

-4 bytes más de FryAmTheEggman


lambda s:''.join([z.lower(),z.upper()][c.isupper()]for c,z in zip(s,s[::-1]))es tres bytes más corto
Arfie

1
@Ruud ¡Gracias! ¡Mover la llamada a la función fuera de la selección de la lista ahorra 2 más!
Mego

2
(z*2).title()[c.isupper()-1]Deberia trabajar.
FryAmTheEggman

66
Podrías ganar otro byte con en ~c.isupper()lugar dec.isupper()-1
Lulhum

Esto no recibe entrada de stdin o salida a stdout ...
ArtOfWarfare

13

Python 2, 73 bytes

Como las reglas especifican que la entrada es ascii:

lambda s:''.join([z.lower,z.upper]['@'<c<'[']()for c,z in zip(s,s[::-1]))

Sin embargo, todo el crédito va a @Mego, pero no tenía la reputación de solo comentar su respuesta.


¿Puedes usar el valor ascii de '@' y '[' para ganar 2 bytes?
aloisdg dice Reinstate Monica

Desafortunadamente no, tendría que usar ord (c), la comparación de enteros y cadenas no funciona muy bien en Python
Lulhum

Más o menos lo que obtuve, pero tú fuiste primero +1
orlp

13

Perl, 31 + 2 ( -lp) = 33 bytes

Esta solución es de @Ton Hospel (13 bytes más corta que la mía).

s%.%(lc$&gt$&?u:l)."c chop"%eeg

Pero necesitará ly se penciende. Para ejecutarlo:

perl -lpe 's%.%(lc$&gt$&?u:l)."c chop"%eeg'

55
Hola y bienvenidos a PPCG! ¡Esto es genial!
NoOneIsHere

¡Muy bueno de verdad! Nunca he usado -aautosplit, ¡creo que podría haberlo usado muchas veces en el pasado! ¡Necesito recordar eso! ¡Creo que puedes guardar otro byte usando en map...,...lugar de map{...}...como lo hiciste $Fal principio! :)
Dom Hastings

Código más corto (31 + 2 bytes):perl -lpe 's%.%(lc$&gt$&?u:l)."c chop"%eeg
Ton Hospel

Aviso que -aestá implícito por-F
Ton Hospel

@TonHospel wow, muchas gracias y bien hecho, ¡es un código bastante bueno! Sobre -a(y -n) estar implícito -F, lo leí hace un tiempo en perlrun, lo probé, pero no funcionó; pero lo intenté de nuevo ahora y funciona bien, así que supongo que hice algo mal en ese entonces. Gracias.
Dada

9

Pyth, 13 11 10 9 bytes

Gracias a @FryAmTheEggman por recordarme Vy a @LeakyNun por otro byte.

srV_Qm!/G

Pruébalo en línea! ahora en el móvil, actualizando el enlace en un momento


srV_Qm!rId0es 11, pero creo que podría ser posible acortar ese mapa ...
FryAmTheEggman

@FryAmTheEggman Elimine el dy guardó un byte.
Leaky Nun

srV_Qm!/Gdebería guardar un byte
Leaky Nun

8

Python, 66 bytes

f=lambda s,i=0:s[i:]and(s[~i]*2).title()[~('@'<s[i]<'[')]+f(s,i+1)

Recurre a través de los índices i, tomando el personaje s[~i]desde atrás y el caso s[i]desde el frente. Ser capital se verifica como si estuviera en el rango contiguo @ABC...XYZ[. Gracias a FryAmTheEggman por el (_*2).title()truco.


5

Retina , 75 67 65 bytes

El recuento de bytes asume la codificación ISO 8859-1.

$
±·$`
O$^`\G[^·]

s{T`L`l`±.
T01`l`L`±.*·[A-Z]
±·

±(.)
$1±
·.
·

Pruébalo en línea! (La primera línea habilita un conjunto de pruebas con múltiples casos de prueba separados por salto de línea).


5

JavaScript (ES6), 95 83 bytes

s=>[...t=s.toLowerCase()].reverse().map((c,i)=>s[i]==t[i]?c:c.toUpperCase()).join``

Editar: ahorró 12 bytes masivos gracias a @ edc65.


s => r = [... l = s.toLowerCase ()]. ​​reverse (). map ((c, i) => s [i]! = l [i]? c.toUpperCase (): c) .join '' -10
edc65

@ edc65 ¡Gracias! (Nota: no r=es necesario.)
Neil

5

Pyke, 11 10 9 bytes

_FQo@UhAl

Pruébalo aquí!

_         -   reversed(input)
 F        -  for i in ^
   o      -      o+=1
  Q @     -     input[^]
     Uh   -    ^.is_upper()+1
       Al -   [len, str.lower, str.upper, ...][^](i)
          - "".join(^)

Primero me dio un error, luego al mismo tiempo la respuesta correcta. i.imgur.com/uTcH27F.png

Eso siempre sucede, puede hacer clic en desactivar advertencias para desactivarlo.
Azul

Si, está bien. Lo siento, no soy bueno con Pyke

Puede ser porque soy el único que lo usa
Azul

4

05AB1E , 19 16 15 13 bytes

¡Gracias a Emigna por guardar 3 bytes!

Probablemente sea golpeado por Jelly ... Código:

Âuvy¹Nè.lil}?

Utiliza la codificación CP-1252 . Pruébalo en línea! .


S.l_v¹lRNèyiu}?es 1 byte más corto
Emigna

@Emigna Wow gracias! Eso es muy inteligente.
Adnan

Âuvy¹Nè.lilë}?es 14. Simplemente feliz de poder ayudarte por una vez :)
Emigna

@Emigna ¡Eso es increíble! Muy buen uso de bifurcar :).
Adnan

Ruvy¹Nè.lil}?actualmente. No utilicé la bifurcación y olvidé eliminar la otra. Entonces 13.
Emigna

4

MATL , 13 bytes

PktGtk<)Xk5M(

Pruébalo en línea!

Pk      % Implicit inpput. Flip, lowercase
t       % Duplicate
Gtk<    % Logical index of uppercase letters in the input string
)       % Get letters at those positions in the flipped string
Xk      % Make them uppercase
5M(     % Assign them to the indicated positions. Implicit display

3

J , 30 bytes

(={"_1 toupper@]|.@,.])tolower

No es compatible con no ASCII


"toupper" "tolower" ¿no puedes usar puntos de código para acortarlo?
Leaky Nun

@LeakyNun Quizás, pero no puedo decirlo con certeza
millas

3

Brachylog , 28 bytes

@lr:?z:1ac.
h@u.,@A@um~t?|h.

Explicación

  • Predicado principal:

    @lr                 Reverse the lowercase version of the Input
       :?z              Zip that reversed string with the Input
          :1a           Apply predicate 1 to each couple [char i of reverse, char i of Input]
             c.         Output is the concatenation of the result
    
  • Predicado 1:

    h@u.,               Output is the uppercase version of the first char of Input
         @A@um~t?       The second char of Input is an uppercase letter
                 |      Or
                  h.    Output is the first char of Input
    

3

TSQL, 175 bytes

Golfizado:

DECLARE @ varchar(99)='Hello, Midnightas'

,@o varchar(99)='',@i INT=0WHILE @i<LEN(@)SELECT
@i+=1,@o+=IIF(ascii(x)=ascii(lower(x)),lower(y),upper(y))FROM(SELECT
SUBSTRING(@,@i+1,1)x,SUBSTRING(@,len(@)-@i,1)y)z
PRINT @o

Sin golf

DECLARE @ varchar(99)='Hello, Midnightas'

,@o varchar(99)=''
,@i INT=0

WHILE @i<LEN(@)
  SELECT @i+=1,@o+=IIF(ascii(x)=ascii(lower(x)),lower(y),upper(y))
  FROM
    (SELECT SUBSTRING(@,@i+1,1)x,SUBSTRING(@,len(@)-@i,1)y)z

PRINT @o

Violín


codificar la entrada?
gato

@cat esa es la única manera. En sql, no hay STDIN o comando de entrada. Si observa stackoverflow, así es como se resuelven todas las preguntas, también puede consultar mis otras respuestas en codegolf
t-clausen.dk

Oh, sí, definitivamente recuerdo haber tenido esta conversación con un usuario de SQL antes (usted, tal vez). Eso es raro, pero debería estar bien.
gato

1
@cat no hemos tenido esta conversación antes, pero me
ayudaste

3

En realidad, 25 bytes

;`úíuY"ùû"E£`M@ùRZ`i@ƒ`MΣ

Pruébalo en línea!

Explicación:

;`úíuY"ùû"E£`M@ùRZ`i@ƒ`MΣ
;                          create a copy of the input
 `úíuY"ùû"E£`M             for each character in input:
  úíuY                       0-based index in lowercase English letters, or -1 if not found, increment, boolean negate (1 if uppercase else 0)
      "ùû"E£                 `û` if the character is lowercase else `ù` (str.lower vs str.upper)
              @ùRZ         make the other copy of the input lowercase, reverse it, and zip it with the map result
                  `i@ƒ`M   for each (string, function) pair:
                   i@ƒ       flatten, swap, apply (apply the function to the string)
                        Σ  concatenate the strings

3

Haskell, 83 80 75 71 bytes

La forma más directa que se me ocurrió.

import Data.Char
f a|isUpper a=toUpper|1>0=toLower
zipWith f<*>reverse

Si intercambia los parámetros de (#), kpuede reescribirse en un estilo sin puntos: k=reverse>>=zipWith(#)eso ahorra un par de bytes :)
Flonk

La segunda línea puede estar libre de puntos bcomo f a|isUpper a=toUpper|1>0=toLower, aunque esto entra en conflicto con la mejora de Flonk.
xnor

Puede utilizar la versión de XNOR de fy volver a escribir Flonk de ka zipWith f<*>reverse.
nimi

¿No necesitas eliminar el parámetro s?
Lynn

Sí, y también puedes cortar el k=.
xnor

3

PowerShell, 154 , 152 , 99 , 86 bytes

Gracias @TimmyD por ahorrarme la friolera de 47 bytes (también guardé 6 adicionales)

Gracias @TessellatingHeckler por guardar 13 bytes adicionales.

Último:

param($a)-join($a[$a.length..0]|%{("$_".ToLower(),"$_".ToUpper())[$a[$i++]-in65..90]})

Original:

param($a);$x=0;(($a[-1..-$a.length])|%{$_=$_.tostring().tolower();if([regex]::matches($a,"[A-Z]").index-contains$x){$_.toupper()}else{$_};$x++})-join''

Formato normal:

Lo último (se ve mejor como dos líneas en mi opinión):

param($a)
-join($a[$a.length..0] | %{("$_".ToLower(), "$_".ToUpper())[$a[$i++] -in 65..90]})

Explicación:

param($a)-join($a[$a.length..0]|%{("$_".ToLower(),"$_".ToUpper())[$a[$i++]-in65..90]})
param($a)
# Sets the first passed parameter to variable $a
         -join(                                                                      )
# Converts a char array to a string
               $a[$a.length..0]
# Reverses $a as a char array
                               |%{                                                  }
# Shorthand pipe to foreach loop
                                  ("$_".ToLower(),"$_".ToUpper())
# Creates an array of the looped char in lower and upper cases
                                                                 [$a[$i++]-in65..90]
# Resolves to 1 if the current index of $a is upper, which would output "$_".ToUpper() which is index 1 of the previous array

Original:

param($a)
$x = 0
(($a[-1..-$a.length]) | %{
    $_ = $_.tostring().tolower()
    if([regex]::matches($a,"[A-Z]").index -contains $x){
            $_.toupper()
        }else{
            $_
        }
        $x++
    }
) -join ''

El póster por primera vez aquí, estaba motivado porque rara vez veo PowerShell, pero con 154 152 bytes en este ... ¡Puedo ver por qué! Cualquier sugerencia apreciada.

¡He aprendido que debo cambiar completamente mi forma de pensar al golf en código y es divertido!


Hola y bienvenidos a PPCG! ¡Esto es genial!
NoOneIsHere

Bienvenido a PPCG! Es bueno ver a otro usuario de PowerShell por aquí. Puede recortar bastante reemplazando las .tostring()comillas y utilizando la manipulación de enteros ASCII en lugar de expresiones regulares. Pruebe lo siguiente, para 105 bytes - param($a)-join($a[$a.length..0]|%{if(($x=$a[$i++])-le90-and$x-ge65){"$_".ToUpper()}else{"$_".ToLower()}}).
AdmBorkBork

¡Brillante! Podemos hacerlo aún más corto usando un rango en lugar de -le y -ge:param($a)-join($a[$a.length..0]|%{if(65..90-contains$a[$i++]){"$_".ToUpper()}else{"$_".ToLower()}})
ThePoShWolf

X-inYes más corto que Y-containsX, y puede cambiar su ifpara que el operador ternario falso obtenga 86 bytes -param($a)-join($a[$a.length..0]|%{("$_".ToLower(),"$_".ToUpper())[$a[$i++]-in65..90]})
TessellatingHeckler

Hombre, siento que me he perdido muchos trucos que nunca antes había codificado. ¡Es casi como aprender a codificar de nuevo!
ThePoShWolf

2

Dyalog APL , 12 bytes

⌽f¨⍨⊢≠f←819⌶

819⌶ es la función de plegado del estuche

f←porque su nombre es largo, lo asignamos a f

⊢≠f Booleano donde el texto difiere del texto en minúsculas

f¨⍨ use eso (1 significa mayúscula, 0 significa minúscula) para doblar cada letra ...

... del texto invertido

Maneja no ASCII de acuerdo con las reglas del Consorcio Unicode.



2

Raqueta, 146 bytes

(λ(s)(build-string(string-length s)(λ(n)((if(char-upper-case?(string-ref s n))char-upcase char-downcase)(list-ref(reverse(string->list s))n)))))

La raqueta es mala en todo este asunto del "golf".

Encogimiento de hombros Como siempre, cualquier ayuda con este acortamiento sería muy apreciada.



2

Jolf, 21 bytes

Pruébalo aquí!

Μid?&γ._pXiS=pxHHpxγγ

Explicación

Μid?&γ._pXiS=pxHHpxγγ
Μid                   (Μ)ap (i)nput with (d)is fucntion:
   ?        =pxHH     (H is current element) if H = lowercase(H)
    &γ._pXiS          and set γ to the uppercase entity in the reversed string
                 pxγ  lowercase γ
                    γ else, return γ

(d)is function... sacrificar la ortografía por el bien del golf!
Steven H.


2

C #, 86 85 bytes

s=>string.Concat(s.Reverse().Select((c,i)=>s[i]>96?char.ToLower(c):char.ToUpper(c)));

AC # lambda donde la entrada y la salida son una cadena. Puedes probarlo en .NetFiddle .


Estoy luchando para entender por qué no puedo logro convertir char.ToLower(c)a c+32. ¡Espero arreglarlo!

12 bytes guardados gracias a @PeterTaylor ( c|32para agregar 32 al valor ascii de cy c&~32restar 32). El resultado sería 72 bytes (pero puede fallar en caracteres no alfa).

s=>string.Join("",s.Reverse().Select((c,i)=>(char)(s[i]>96?c|32:c&~32)));

1
Sería en c|32lugar de c+32, pero no funcionará con caracteres no alfa.
Peter Taylor

@PeterTaylor ¡Funciona muy bien! ¡Gracias!
aloisdg dice Reinstate Monica

1

PHP, 128 bytes

$s=$argv[1];$l=strrev($s);for($i=0;$i<strlen($s);++$i){echo(strtolower($s[$i])!==$s[$i]?strtoupper($l[$i]):strtolower($l[$i]));}

Puedo intentar optimizar esto aún más, pero lo dejaré como está por ahora.


1

Octava, 51 50 bytes

@(s)merge(isupper(s),b=flip(toupper(s)),tolower(b))

@(s)merge(s>64&s<91,b=flip(toupper(s)),tolower(b))

1

VIM, 46 bytes

Serían tres bytes g~Gsi no necesitáramos leer desde stdin o escribir en stdout, pero bueno ...

vim -es '+normal! g~G' '+%print|q!' /dev/stdin

Para probar esto, ejecuta

echo "testString" | vim -es '+normal! g~G' '+%print|q!' /dev/stdin

Esta es mi primera presentación aquí, no estoy seguro si este tipo de presentación es aceptable.


Bonito, me encanta jugar al golf en vim! Sin embargo, este programa en realidad no invierte la cadena, solo alterna la capitalización. Puede invertir la cadena con, :se ri<cr>C<C-r>"pero luego tendrá que descubrir cómo poner en mayúscula las letras correctas.
DJMcMayhem

@DrGreenEggsandIronMan ¡Oh, hombre, me lo perdí por completo! De vuelta a la mesa de dibujo!
DoYouEvenCodeBro

1

Javascript (usando una biblioteca externa) (224 bytes)

(s)=>{t=_.From(s);var cnt=t.Count();var caps=t.Select(x=>{return x.toUpperCase()===x&&x.toLowerCase()!==x}).ToArray(),i=-1;return t.AggregateRight((a,b)=>{i++;var c=caps[i];return c?a+b.toUpperCase():a+b.toLowerCase()},"");}

Descargo de responsabilidad: utilizando una biblioteca que escribí para traer LINQ de C # a Javascript

Imagen 1


Llamando a la persona que rechazó esto sin una explicación. ¿Alguna razón para eso?
applejacks01

Es probable que también quisieran que contara la biblioteca, aunque el uso de una biblioteca externa está completamente dentro de los límites de la política estándar.
Addison Crump

1
No estoy votando, pero si está utilizando una biblioteca externa, al menos mencione el nombre en su respuesta, y para una biblioteca oscura, proporcione un enlace al repositorio.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1

Sed, 113 + 1 = 114 bytes

¿Por qué? Porque es divertido usar la herramienta incorrecta para hacer cosas: P

Uso: Ejecutar sed -rf file, ingresar texto y presionar Ctrl+ D(enviar EOF).

Golfizado:

s/[A-Z]/\a\l&/g;s/^.*$/\f&\v/;:x;s/\f\a/\a\f/;s/\a\v/\v\a/;s/\f(.)(.*)(.)\v/\3\f\2\v\1/;tx;s/\f|\v//g;s/\a./\U&/g

Sin golf:

s/[A-Z]/\a\l&/g #Prepend all upper-case letters with a 
                #BEL ASCII character and make them lowercase
s/^.*$/\f&\v/   #Wrap text between a from feed (\f) and a vertical tab (\v)
                #These are used as markers

:x #Define a label named x

s/\f\a/\a\f/;s/\a\v/\v\a/ #Move BEL characters outside of the boundary, so they're not moved later
s/\f(.)(.*)(.)\v/\3\2\1/  #This part does the switching itself
                          #It grabs a character preceded by a form feed and another 
                          #one followed by a vertical tab and swaps them, while keeping the text in-between
                          #and replaces the marker \f and \v

tx             #Conditional jump (t) to label x
               #Jumps to the label x if the last substitution (s command) was successful 
s/\f|\v//g     #Delete markers
s/\a(.)/\u\1/g #Make letters preceded by a BEL upper-case

1

Java 7, 221 217 180 bytes

void c(char[]s){int x=0,y=s.length-1;for(char t;x<y;s[x]=s(t,s[y]),s[y]=s(s[y],t),x++,y--)t=s[x];}char s(char a,char b){return(char)(64<a&a<91?96<b&b<123?b-32:b:64<b&b<91?b+32:b);}

Un montón de bytes guardados gracias al enfoque de @LeakuNun .

Sin golf y casos de prueba:

Pruébalo aquí

class Main{
  void c(char[] s){
    int x = 0,
        y = s.length-1;
    for(char t; x < y; s[x] = s(t, s[y]),
                       s[y] = s(s[y], t),
                       x++,
                       y--){
       t = s[x];
    }
  }

  char s(char a, char b){
    return (char)(64 < a & a < 91
                    ? 96 < b & b < 123
                        ? b-32
                        : b
                    : 64 < b & b < 91
                        ? b+32
                        : b);
  }

  public static void main(String[] a){
    print("Hello, Midnightas");
    print("TEST");
    print("test");
    print("Test");
    print(".,..,,!@");
    print("ABCDefgHijklMNOPqrsTuVWxyz");
    print("AbCdEfGHIJKlmnop123");
  }

  static void print(String s){
    char[] t = s.toCharArray();
    c(t);
    System.out.println(t);
  }
}

Salida:

SathginDim ,olleh
q.
TSET
tset
Tset
@!,,..,.
ZYXWvutSrqpoNMLKjihGfEDcba
321pOnMLKJIhgfedcba

Puede ingresar y salir char[].
Leaky Nun

@LeakyNun En realidad (creo que no puedo) en menos cantidad de bytes. Permitiría eliminar String a="";y cambiar o+=a 0[i]=para guardar bytes, pero Java no tiene un carácter .toUpperCase()/ .toLowerCase()método, y la conversión de char a String, usar el método superior / inferior y luego volver a char requeriría (mucho) más bytes Pero siéntase libre de bifurcar la ideona vinculada y encontrar algo para hacer que char[]funcione en menos bytes.
Kevin Cruijssen

1
180 bytes que se pueden jugar más (al no modificarlo en su lugar).
Leaky Nun

0

do

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
  char *a,*b,*c;

  a=c=strdup(argv[1]);
  b=&argv[1][strlen(a)-1];
  for(;*a;a++,b--){
    *a=(*a>='A'&&*a<='Z')?((*b>='a'&&*b<='z')?*b-32:*b):((*b>='A'&&*b<='Z')?*b+32:*b);
  }
  puts(c);
  free(c);
  return 0;
}

La entrada debe tomarse de stdin.
Anmol Singh Jaggi

Como se trata de código de golf, ingrese la cantidad de bytes que costaría este programa.

Podría reducirlo significativamente dependiendo de las reglas, pero no puedo encontrar ninguna regla.
user56095
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.