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).

Spikatrix
fuente

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í

Optimizador
fuente
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
    )
nderscore
fuente
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í

Optimizador
fuente
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
CL-
fuente
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.

Pomo de la puerta
fuente
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!"
JohnE
fuente
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".

DLosc
fuente
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.

kirbyfan64sos
fuente
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));
    }
}
Jack munición
fuente
¿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

PHP> = 7.1, 88 bytes (no competitivos)

for([,$s,$t]=$argv;$t;)$s=$t<0?substr($s,1).$s[!$t++]:$s[-1].substr($s,!$t--,-1);echo$s;

Casos de prueba

Jörg Hülsermann
fuente
¿Por qué 'no competir'?
Spikatrix 01 de
@CoolGuy La versión de PHP que se utiliza se construye después del inicio de la pregunta
Jörg Hülsermann
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.

numbermaniac
fuente
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.
Kevin Cruijssen
fuente