Desplazar caracteres en una cadena


12

En este desafío, debe cambiar los caracteres en una cadena ingresada n número de veces y generar la cadena desplazada

Entrada

La entrada primero contendrá una cadena. En la siguiente línea, un número entero, que denota nestará presente.

Salida

  • Si nes positivo, cambie los caracteres de la cadena a los ntiempos correctos .
  • Si nes negativo, cambie los caracteres de la cadena a la izquierda n.
  • Si nes cero, no desplace los caracteres en la cadena.

Después de cambiar (excepto cuando nes cero), imprima la cadena desplazada.

Notas

  • La cadena no estará vacía o null.
  • La cadena no tendrá más de 100 caracteres y solo contendrá caracteres ASCII en el rango (espacio) a ~(tilde) (códigos de caracteres 0x20 a 0x7E, inclusive). Consulte la tabla ASCII para referencia.
  • El cambio es cíclico.
  • El número npuede ser positivo, negativo o cero.
  • n siempre será mayor o igual a -1000 y menor o igual a 1000
  • Puede tomar datos a través de stdino desde argumentos de línea de comando
  • La cadena desplazada debe salir en el stdout(o el equivalente más cercano)
  • Puede escribir un programa completo o una función que tome la entrada y la salida de la cadena en el stdoutequivalente más cercano

Casos de prueba

1)

Hello world!
5             -->orld!Hello w

2)

Testing...
-3            -->ting...Tes

3)

~~~
1000          -->~~~

4)

12345
0             -->12345

5)

ABA
17            -->BAA

Puntuación

Este es el , por lo que gana el envío más corto (en bytes).

Respuestas:


5

Pyth, 4 bytes

.>zQ

Esto es casi similar a mi versión de 5 bytes de CJam , excepto que Pyth como operador de entrada de evaluación automática Q.

.>              # Cyclic right shift of 
  z             # Input first line as string
   Q            # Rest of the input as evaluated integer

Pruébalo en línea aquí


Exactamente la misma solución que esta :-)
— Spikatrix

@CoolGuy Es bastante sencillo. Sin embargo, no vi esto en sandbox ..
— Optimizer

Parece que ya no funciona por alguna razón. Aquí hay una alternativa de trabajo, también de 4 bytes.
— hakr14

3

Javascript ( ES5 ), 55 52 bytes

p=prompt;with(p())p(slice(b=-p()%length)+slice(0,b))

Comentado:

p = prompt; // store a copy of prompt function for reuse
with(p()) // extend scope chain with first input
    p( // print result
        slice(b = -p() % length) // take second input negated and modulo length
        +                        // and slice string by result
        slice(0, b) // concatenate with opposite slice
    )

2

CJam, 5 bytes

llim>

Esto es bastante sencillo.

l               e# Read the first line
 li             e# Read the second line and convert to integer
   m>           e# Shift rotate the first string by second integer places

Pruébalo en línea aquí


1
¿Caería esto bajo funciones incorporadas?
— LegionMammal978

@ LegionMammal978 Es es una función integrada. Pero OP no restringe el uso de complementos integrados
— Optimizer

1
Las funciones incorporadas son lagunas estándar .
— LegionMammal978

44
@ LegionMammal978, señala una respuesta que tiene casi 50-50 votos hacia arriba / hacia abajo. Esa no es una decisión de la comunidad.
— Optimizador

2

C, 93 bytes

main(a,v,n)char**v;{a=v[2]-v[1]-1;n=atoi(v[2]);a=a*(n>0)-n%a;printf("%s%.*s",v[1]+a,a,v[1]);}

Más clara es la versión de argumento de función que se modificó para hacer la versión de argumento de línea de comando

f(s,n,c)char*s;{c=strlen(s);c=c*(n>0)-n%c;printf("%s%.*s",s+c,c,s);}

Este tiene solo 68 bytes, lo que demuestra cuán desventajoso es C cuando se trata de argumentos de línea de comando.

Si el desplazamiento,, nes positivo, entonces strlen(s)-n%strlen(s)es el desplazamiento y si nes negativo, el desplazamiento es -n%strlen(s). Las printfimpresiones desde el desplazamiento, chasta el final de la cadena, y luego los ccaracteres finales desde el principio.

Ejemplos:

$ ./rotstr "¡Hola, mundo!" 5 5
orld! Hola w
$ ./rotstr "Pruebas ..." -3
ting ... Tes
$ ./rotstr "~~~" 1000
~~~
$ ./rotstr "12345" 0
12345
$ ./rotstr "ABA" 17
BALIDO
$ ./rotstr "¡Hola, mundo!" -dieciséis
¡Oh mundo! Infierno

No funciona como se esperaba para mí. Cuando v[2]es así "1", el código simplemente genera la cadena sin modificaciones. Y solo "~~~"y "12345"funciona. El resto da resultados incorrectos. Si todos giraran una vez más, habría sido correcto.
— Spikatrix

Lo probé con gcc y (con una ligera modificación main(a,v,n)-> n;main(a,v)) clang en linux y funciona como se esperaba. Para gcc estoy usando la versión 5.1.0 y compilando con gcc -o rotstr rotstr.c. Qué compilador estas usando?
— CL-

Intenté hacer nglobal también. Mismo problema. Recopilé usando gcc file.c -o file. Estoy usando GCC 4.8.1 en Windows. ¿Hay algún comportamiento indefinido en su código?
— Spikatrix

Sustitución v[2]-v[1]-1con strlen(v[1])podría hacer una diferencia, que es el único lugar que se me ocurre algo sutil pasando. Lamentablemente no tengo acceso a una máquina de Windows para probar.
— CL-

Si. El código funcionó cuando cambié eso.
— Spikatrix

2

Python 3, 45 bytes

s=input();n=int(input());print(s[-n:]+s[:-n])

El núcleo del programa es

s[-n:]+s[:-n]

Todo lo demás es solo un trabajo torpe con E / S.


2
Esto falla para el último ABA 17caso de prueba, y en general lo haría si|n| > length of string
— Sp3000

si lo usa n=int(input())%len(s);, funcionaría para enteros mayores que la longitud de la cadena, pero requeriría 7 caracteres más
— JPMC

2

K, 8 7 bytes

{|x!|y}

Ya existe un primitivo "rotar" ( !) que realiza una generalización de esta operación para las listas. Las cadenas K son listas de caracteres, por lo que se aplica. Sin embargo, la especificación favorece un poco a CJam y Pyth, porque la rotación de K pasa a la dirección opuesta a la deseada. Ajustar !una función y negar el argumento implícito xhará lo que queramos:

  f:{(-x)!y}
{(-x)!y}
  f[5;"Hello world!"]
"orld!Hello w"
  f[-3;"Testing..."]
"ting...Tes"
  f[17;"ABA"]
"BAA"

Un enfoque un poco más corto, sugerido por kirbyfan64sos, es eliminar los paréntesis y la negación a favor de invertir la cadena ( |) antes y después de la rotación.

Si no fuera por este desajuste de impedancia, la solución sería simplemente

!

Llamado idénticamente:

  f:!
!
  f[5;"Hello, World!"]
", World!Hello"
  f[-5;"Hello, World!"]
"orld!Hello, W"
  f[0;"Hello, World!"]
"Hello, World!"

1
¿Invertir la cuerda con |, rotar eso e invertirlo nuevamente arrojaría el mismo resultado? Si es así, puedes cortar un personaje.
— kirbyfan64sos

¡Buen punto! Eso funcionaria.
— JohnE

1

Pip, 10 bytes

Esto posiblemente podría mejorarse aún más. Aún así, para un idioma sin operador de turno, 10 bytes no está mal.

a@_M-b+,#a

Explicación:

            a, b are command-line args (implicit)
       ,#a  range(len(a))
    -b+     range(-b, len(a)-b)
a@_M        map(lambda x: a[x], range(-b, len(a)-b))
            Concatenate the list and print (implicit)

Funciona porque la cadena y la lista de indexación de la pipa es cíclico: "Hello"@9 == "Hello"@4 == "o".


1

rs , 180 caracteres

^(-\d+) (.*)/\1 \2\t
+^(-\d+) (.)(.*?)\t(.*)$/\1 \3\t\2\4
^(-\d+) \t/\1 
^(-?)(\d+)/\1 (_)^^(\2)
+_(_*) (.*)(.)$/\1 \3\2
^- /- \t
+^- (.*?)\t(.*?)(.)$/- \1\3\t\2
^-? +/
\t/

Demostración en vivo .

La mayor parte de esto está invirtiendo la cadena si el número de entrada es negativo. Aproveché el hecho de que solo algunos caracteres ASCII son entradas válidas y utilicé la pestaña para mi ventaja.

Tenga en cuenta que tuve que hacer un poco de trampa: dado que rs es un modificador de texto de una sola línea, tuve que usarlo <number> <text>como formato de entrada.


1

Java, 167

enum S{;public static void main(String[]r){int n=-Integer.parseInt(r[1]),l=r[0].length();while(n<0)n+=l;n%=l;System.out.print(r[0].substring(n)+r[0].substring(0,n));}}

Toma la entrada a través de la línea de comando.

Curiosamente, originalmente había invertido accidentalmente cómo se suponía que se debía mover la cuerda. Pero corregir ese error fue más corto para multiplicar n por -1 y luego escribir la lógica correctamente.

expandido:

enum Shift{
    ;
    public static void main(String[]args){
        int n=-Integer.parseInt(args[1]),length=args[0].length();
        while(n<0)n+=length;
        n%=length;
        System.out.print(args[0].substring(n)+args[0].substring(0,n));
    }
}

¿Por qué tienes enum S{; ... }?
— Spikatrix

1
Opté por escribir el programa completo porque 9 bytes realmente no iban a hacer una gran diferencia. También es un recordatorio cuando miro hacia atrás para preferir la enumeración S {; ...} sobre la clase S {...} porque (aunque ocupan la misma cantidad de bytes en este ejemplo) si alguna vez necesito tener una instancia de la clase, se necesita un byte más con la versión enum: enum S {X; ...}. Esto ayuda si quiero declarar un método o variable en la clase sin tener que usar la palabra clave estática o instanciar explícitamente un nuevo objeto de la clase.
— Jack Ammo

¡Guauu! Agradable. ¡Nunca supe que enums se puede usar así!
— Spikatrix

Sé que han pasado casi dos años desde que publicaste esto, pero puedes jugar al golf algunas cosas. Integer.parseIntpuede ser new Integer(-5 bytes); y n%=l;se puede eliminar si cambia r[0].substring(n)+a r[0].substring(n%=l)+(-2 bytes). Además, es posible que desee especificar que esto es Java 6, porque en Java 7 o superior mainya no es posible una enumeración con -method.
— Kevin Cruijssen

demasiado perezoso para molestarse en editar, pero debido a los ahorros.
— Jack Ammo



1

Casio Basic, 27 bytes

StrRotate s,s,-n:Print s

¡Resulta que hay una función integrada para esto en la Casio ClassPad! Pero funciona a la inversa, por lo tanto -n.

24 bytes para el código, 3 bytes para especificar s,ncomo argumentos.


1

05AB1E , 6 bytes

DgI+FÁ

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

D         # Duplicate the text input
 g        # Take it's length
          #  i.e. "Testing..." → 10
  I       # Take the integer input
   +      # Add them together
          #  i.e. 10 and -3 → 7
    F     # Loop that many times
     Á    #  And rotate once towards the right during every iteration

Dado que 05AB1E solo tiene incorporados para Girar una vez hacia la derecha / izquierda , y no Girar la Ncantidad hacia la derecha / izquierda , hago un bucle de length + inputcantidad de veces y giro tantas veces hacia la derecha.

Por ejemplo:

  • "Prueba ..." y -3 rotarán 10 + -3 = 7veces hacia la derecha, lo que dará como resultado ting...Tes.
  • "Hola mundo" y 5 rotarán 11 + 5 = 16veces hacia la derecha, lo que dará como resultado worldHello.



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.