Sposta i caratteri in una stringa


12

In questa sfida, è necessario spostare i caratteri in una stringa immessa n numero di volte e generare la stringa spostata

Ingresso

L'input conterrà prima una stringa. Nella riga successiva, nsarà presente un numero intero, che indica .

Produzione

  • Se nè positivo, sposta i caratteri nella stringa nei nmomenti giusti .
  • Se nè negativo, sposta i caratteri nella stringa verso sinistra n.
  • Se nè zero, non spostare i caratteri nella stringa.

Dopo lo spostamento (tranne quando nè zero), stampare la stringa spostata.

Appunti

  • La stringa non sarà vuota o null.
  • La stringa non sarà più lunga di 100 caratteri e conterrà solo caratteri ASCII nell'intervallo (spazio) da ~(tilde) (codici carattere da 0x20 a 0x7E, inclusi). Vedere la tabella ASCII per riferimento.
  • Lo spostamento è ciclico.
  • Il numero npuò essere positivo, negativo o zero.
  • n sarà sempre maggiore o uguale a -1000 e minore o uguale a 1000
  • È possibile accettare input tramite stdino da argomenti della riga di comando
  • La stringa spostata deve essere emessa nel stdout(o equivalente più vicino)
  • È possibile scrivere un programma completo o una funzione che accetta input e genera la stringa stdoutnell'equivalente più vicino

Casi test

1)

Hello world!
5             -->orld!Hello w

2)

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

3)

~~~
1000          -->~~~

4)

12345
0             -->12345

5)

ABA
17            -->BAA

punteggio

Questo è , quindi vince l'invio più breve (in byte).

Risposte:


5

Pyth, 4 byte

.>zQ

Questo è quasi simile alla mia versione CJam 5 byte , tranne che Pyth come operatore di input di valutazione automatica Q.

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

Provalo online qui


Esattamente la stessa soluzione di questo :-)
Spikatrix

@CoolGuy È piuttosto semplice. Tuttavia, non ho visto questo nella sandbox ..
Ottimizzatore

Sembra non funzionare più per qualche motivo. Ecco un'alternativa funzionante, anche 4 byte.
hakr14,

3

Javascript ( ES5 ), 55 52 byte

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

ha commentato:

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 byte

llim>

Questo è piuttosto semplice.

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

Provalo online qui


1
Questo rientrerebbe nelle funzioni integrate?
LegionMammal978,

@ LegionMammal978 Si tratta di un costruito in funzione. Ma OP non limita l'uso di ins incorporati
Optimizer

1
Le funzioni integrate sono scappatoie standard .
LegionMammal978,

4
@ LegionMammal978 indichi una risposta che ha quasi 50-50 voti su / giù. Questa non è una decisione della comunità.
Ottimizzatore

2

C, 93 byte

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]);}

Più chiara è la versione dell'argomento della funzione che è stata modificata per rendere la versione dell'argomento della riga di comando

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

Questo ha solo 68 byte, il che dimostra quanto C sia svantaggiato quando si tratta di argomenti da riga di comando.

Se lo spostamento,, nè positivo, allora strlen(s)-n%strlen(s)è l'offset e se nè negativo lo è -n%strlen(s). Le printfstampe dall'offset, cfino alla fine della stringa, e quindi i ccaratteri finali dall'inizio.

Esempi:

$ ./rotstr "Ciao mondo!" 5
orld! Ciao w
$ ./rotstr "Test ..." -3
ting ... Tes
$ ./rotstr "~~~" 1000
~~~
$ ./rotstr "12345" 0
12345
$ ./rotstr "ABA" 17
BAA
$ ./rotstr "Ciao mondo!" -16
o mondo! Inferno

Non funziona come previsto per me. Quando lo v[2]è "1", il codice genera semplicemente la stringa senza alcuna modifica. E solo "~~~"e "12345"funziona. Il resto fornisce output errati. Se tutti ruotassero ancora una volta, sarebbe stato corretto.
Spikatrix,

L'ho provato con gcc e (con una leggera modifica main(a,v,n)-> n;main(a,v)) clang su Linux e funziona come previsto. Per gcc sto usando la versione 5.1.0 e la compilazione con gcc -o rotstr rotstr.c. Che compilatore stai usando?
CL-

Ho provato anche a rendere nglobale. Stesso problema. Ho compilato usando gcc file.c -o file. Sto usando GCC 4.8.1 su Windows. C'è qualche comportamento indefinito nel tuo codice?
Spikatrix,

Sostituire v[2]-v[1]-1con strlen(v[1])potrebbe fare la differenza, è l'unico posto in cui riesco a pensare a qualcosa di sottile. Sfortunatamente non ho accesso a un computer Windows da testare.
CL-

Sì. Il codice ha funzionato quando l'ho modificato.
Spikatrix,

2

Python 3, 45 byte

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

Il nocciolo del programma è

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

Tutto il resto è solo un lavoro goffo con l'I / O.


2
Questo fallirebbe per l'ultimo ABA 17caso di test, e in generale se|n| > length of string
Sp3000

se lo usi n=int(input())%len(s);, funzionerebbe con numeri interi maggiori della lunghezza della stringa, ma richiederebbe altri 7 caratteri
JPMC

2

K, 8 7 byte

{|x!|y}

Esiste già una "rotazione" primitiva ( !) che esegue una generalizzazione di questa operazione per gli elenchi. Le stringhe K sono elenchi di caratteri, quindi si applica. Le specifiche favoriscono un po 'CJam e Pyth, però, perché la rotazione di K sembra andare nella direzione opposta a ciò che si desidera. Avvolgere !una funzione e annullare l'argomento implicito xfarà ciò che vogliamo:

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

Un approccio leggermente più breve, suggerito da kirbyfan64sos, è quello di eliminare le parentesi e la negazione a favore dell'inversione della stringa ( |) prima e dopo la rotazione.

Se non fosse per questa discrepanza di impedenza, la soluzione sarebbe semplicemente

!

Chiamato in modo identico:

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

1
Invertire la stringa con |, ruotarla e invertirla di nuovo produrrebbe lo stesso risultato? In tal caso, puoi tagliare un personaggio.
kirbyfan64sos,

Buon punto! Funzionerebbe.
JohnE,

1

Pip, 10 byte

Questo potrebbe probabilmente essere ulteriormente migliorato. Tuttavia, per una lingua senza operatore a turni, 10 byte non sono male.

a@_M-b+,#a

Spiegazione:

            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)

Funziona perché stringa e lista indicizzazione nei Pip è ciclica: "Hello"@9 == "Hello"@4 == "o".


1

rs , 180 caratteri

^(-\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/

Demo dal vivo .

La maggior parte di questo sta invertendo la stringa se il numero di input è negativo. Ho approfittato del fatto che solo alcuni caratteri ASCII sono input validi e ho usato la scheda a mio vantaggio.

Nota che ho dovuto imbrogliare un po ': poiché rs è un modificatore di testo a riga singola, ho dovuto usare <number> <text>come formato di input.


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));}}

Accetta l'input tramite la riga di comando.

abbastanza divertente, originariamente avevo invertito accidentalmente il modo in cui la stringa doveva essere spostata. Ma correggere quell'errore è stato più breve semplicemente moltiplicando n per -1, quindi per scrivere correttamente la logica.

allargato:

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));
    }
}

Perché hai enum S{; ... }?
Spikatrix,

1
Ho scelto di scrivere il programma completo perché 9 byte non avrebbero davvero fatto una grande differenza. Inoltre è un promemoria quando guardo indietro per preferire enum S {; ...} rispetto alla classe S {...} perché (anche se in questo esempio occupano lo stesso numero di byte) se dovessi mai avere un'istanza della classe, richiede un byte in più con la versione enum: enum S {X; ...}. Questo aiuta se voglio dichiarare un metodo o una variabile nella classe senza dover usare la parola chiave statica o istanziare esplicitamente un nuovo oggetto della classe.
Jack Ammo,

Wow! Bello. Non ho mai saputo che enums potesse essere usato così!
Spikatrix,

So che sono passati quasi due anni da quando l'hai pubblicato, ma puoi giocare a golf alcune cose. Integer.parseIntpuò essere new Integer(-5 byte); e n%=l;può essere rimosso se si r[0].substring(n)+passa a r[0].substring(n%=l)+(-2 byte). Inoltre, potresti voler specificare che questo è Java 6, perché in Java 7 o versioni successive un enum con main-method non è più possibile.
Kevin Cruijssen,

troppo pigro per disturbare la modifica, ma duely notato per il risparmio.
Jack Ammo,



1

Casio Basic, 27 byte

StrRotate s,s,-n:Print s

A quanto pare, c'è un built-in per questo sul Casio ClassPad! Ma funziona al contrario, quindi -n.

24 byte per il codice, 3 byte da specificare s,ncome argomenti.


1

05AB1E , 6 byte

DgI+FÁ

Provalo online o verifica tutti i casi di test .

Spiegazione:

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

Poiché 05AB1E ha solo i builtin per Ruota una volta verso destra / sinistra , e non Ruota Nquantità verso destra / sinistra , eseguo il ciclo length + inputdi volte e lo giro molte volte verso destra.

Per esempio:

  • "Test ..." e -3 ruoteranno i 10 + -3 = 7tempi verso destra, risultando in ting...Tes.
  • "Hello world" e 5 ruoteranno i 11 + 5 = 16tempi verso destra, risultando in worldHello.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.