Rileva stringhe ruotate


20

Leggi due stringhe da stdin.
Output Yesse una stringa è una versione ruotata dell'altra.
Altrimenti uscitaNo

Casi test

Ingresso

CodeGolf GolfCode

Produzione

Yes

Ingresso

stackexchange changestackex

Produzione

Yes

Ingresso

stackexchange changestack

Produzione

No

Ingresso

Hello World

Produzione

No

Quindi ( abcdefAB , ABabcdef ) è un "SÌ"?
Eelvex

Dovrebbe davvero essere una rotazione o anche una combinazione va bene? per esempio. cosa Stackexchange Stackchangeextornerà?
jpjacobs,

1
@Eelvex, sì. @jpjacobs, sarebbe tornato No. La rotazione è uno spostamento, come quei segni di scorrimento a LED
gnibbler

Le stringhe sono sempre prive di spazi bianchi e separate da spazi bianchi?
Joey,

Più specificamente, quali caratteri sono ammessi in quelle stringhe?
Joey,

Risposte:


7

APL (28)

Accetta input su due righe.

'No' 'Yes'[1+(⊂⍞)∊⌽∘A¨⍳⍴A←⍞]

Spiegazione:

  • A←⍞: legge una riga di input e la memorizza in A
  • ⌽∘A¨⍳⍴A: Ruota A di x, per ogni x in [1..lunghezza A]. Fornisce un elenco, ad esestT stTe tTes Test
  • (⊂⍞)∊: leggi un'altra riga di input e vedi se è in questo elenco.
  • 1+: aggiungine uno a questo, dando 1 se le stringhe non erano ruotate e 2 se lo fossero
  • 'No' 'Yes'[... ]: selezionare il primo o il secondo elemento dall'elenco a 'No' 'Yes'seconda che le stringhe siano state ruotate o meno.
  • Questo valore viene emesso automaticamente.

19

Ruby 49 41

a,b=$*;puts (a*2).sub(b,'')==a ?:yes: :no

Modifica: sostituito gets.split da $ *


È un'idea geniale.
Joey,

Molto intelligente. :)
st0le

$*è argv quando la domanda specificata stdinperò.
Mathieu CAROFF,


6

Personaggi di Python 70

a,b=raw_input().split()
print'YNeos'[len(a)<>len(b)or a not in 2*b::2]

Grazie a gnibbler per il trucco della fetta.


1
Stesso problema della soluzione GolfScript: se si immette nn nfn, si ottiene Yes, che è sbagliato.
Tamara Wijsman,

@TomWij Grazie per aver trovato il bug. Corretto. Dovrebbe funzionare ora.
fR0DDY

Puoi sostituirlo <>con un -risultato del genere 0se hanno la stessa lunghezza.
Tamara Wijsman,

E se non avessero la stessa lunghezza? Quindi non funziona così bene :-)
hallvabo

@hallvabo quindi le stringhe non sono una versione ruotata l'una dell'altra.
fR0DDY,

5

J, 47

y=:>2{ARGV
(>1{ARGV e.1|.^:(i.#y)y){'No',:'Yes'

Perché le due J rispondono?
JB

@JB: perché questo usa il buildin rotate. Entrambe le risposte su ^ H ^ H non sono poi così buone. C'è molto spazio per il golf.
Eelvex

perché l'altro, quindi, sono tentato di chiedere? :-)
JB

@JB: perché pensavo che questo fosse a malapena legale (: p) [mentre l'altro si estende piacevolmente a lisp. ]
Eelvex

errr ... l'altro sembra leggere anche l'input dalla riga di comando
JB

5

Secondo le specifiche (stesse lunghezze di stringa):

Perl, 42 43 caratteri

$.=pop;$_=(pop)x2;print+(qw'yes no')[!/$./]

Se sono consentite stringhe di dimensioni diverse, la soluzione sarebbe:

Perl, 47 caratteri

$.=(pop)x8;$_=(pop)x9;print+(qw'yes no')[!/$./]

RBO


Stesso problema della soluzione GolfScript: se si immette nn nfn, si ottiene Yes, che è sbagliato.
Tamara Wijsman,

1
sembra essere ok (ho perso il '!' nella prima versione) "nn nfn" => no "CodeGolf GolfCode" =>
stivali di gomma

5

Golfscript, 31

' '/:)~,\,=)~.+\/,(&'Yes''No'if

Questo controlla prima la lunghezza, quindi dovrebbe funzionare come previsto.


:)e =)+1 per il codice molto felice
TuxCrafting

4

J, 57

{&('No';'Yes')@-:/@:((/:~@(|."0 _~i.&$))&.>)&.(;:&stdin)_

Esempio di utilizzo:

$ echo -n CodeGolf GolfCode | jconsole rotate.ijs
Yes
$ echo -n stackexchange changestackex | jconsole rotate.ijs
Yes
$ echo -n stackexchange changestack | jconsole rotate.ijs
No
$ echo -n Hello World | jconsole rotate.ijs
No

3

Windows PowerShell, 76

$a,$b=-split$input
('No','Yes')[+!($a.length-$b.length)*"$b$b".contains($a)]

3

JavaScript, 51

function f(a,b)a&&(a+a).replace(b,"")==a?"Yes":"No"

JavaScript non ha un host canonico, quindi questa risposta è scritta in funzione di due argomenti. Il punteggio sale a 60 se non consentiamo le funzionalità JS 1.7 (chiusure di espressioni).

Nella shell SpiderMonkey questo sarebbe (per un punteggio di 71):

[a,b]=readline().split(" ");print(a&&(a+a).replace(b,"")==a?"Yes":"No")

5 anni dopo e ora puoi usare la =>notazione della funzione;)
J Atkin,

3

Python, 66 63

a, b = raw_input (). split ()
print'YNeos' [a! = (2 * a) .Rimontare (B, "") :: 2]

Un'altra soluzione in 69 caratteri

a, b = raw_input (). split ()
print ['No', 'Sì'] [a in b * 2e len (a) == len (b)]

2
print'YNeos'[a!=(2*a).replace(b,"")::2]
Gnibbler,

@gnibbler bel trucco, grazie per il suggerimento. Ho aggiornato il codice
Coding man

2

J, 84

y=:(>1{ARGV),:(>2{ARGV)
((0{y)e.(y&((]$0{[),(]-~[:}.[:$[)$1{[)/.i.}.$y)){'No',:'Yes'

2

JavaScript (120 caratteri)

function f(a,b) {for (i=0,A=a.split("");A.join("")!=b&&i++<a.length;A.push(A.shift()));return A.join("")==b?'Yes':'No';}

Produzione:

f('CodeGolf','GolfCode'); //Yes
f('stackexchange','changestackex'); //Yes
f('stackexchange','changestack'); //No
f('Hello','World'); //No
f('nn','nBn'); //No

2

Ruby, 58 (62) personaggi

a,b=gets.split;$><<(a.size==b.size&&/#{a}/=~b*2?:Yes: :No)

Questa soluzione presuppone che l'input contenga solo caratteri alfanumerici (in realtà tutto ciò che non ha un significato speciale all'interno di un'espressione regolare è ok).

Una soluzione che non ha questo vincolo è più lunga di 4 caratteri

a,b=gets.split;$><<(a.size==b.size&&(b*2).index(a)?:Yes: :No)

2

Python, 71

a,b=raw_input().split()
print'Yes'if a in b*2and len(a)==len(b)else'No'

Stesso problema della soluzione GolfScript: se si immette nn nfn, si ottiene Yes, che è sbagliato.
Timwi

Il problema è stato risolto, rimane basso ... :-)
Tamara Wijsman

Non legge dallo stdin come specificato.
Wooble

Ora lo fa ... :-)
Tamara Wijsman

2

PHP, 61

<?echo preg_match('/^(.+)(.*) \\2\\1$/',fgets(STDIN))?Yes:No;

2

Ruby, 41

puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No

Non stampa nulla, risulta in ": No" per l'input "aaa aaa" (sulla mia macchina). L'approccio regexp potrebbe essere una buona idea.
steenslag,

Risolto il puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :Noproblema per la stampa e l'input da stdin invece di args: - aumenta a 41 caratteri.
Nemo157,

2

Haskell ( 98 96 caratteri)

g x y@(t:r)(z:w)|x==y="Yes"|1>0=g x(r++[t])w
g _ _[]="No"
f(x:y:_)=g x y y
main=interact$f.words

2

Q ( 50 43 caratteri)

{`No`Yes x in((!)(#)y)rotate\:y}." "vs(0:)0

2

Scala 78

val b=readLine split " "
print(b(0).size==b(1).size&&(b(0)+b(0)contains b(1)))

È un peccato per il controllo delle dimensioni, senza di esso il conteggio scende a 54

val a=readLine split " "
print(a(0)+a(0)contains a(1))

"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthproduce 56
utente sconosciuto


2

GolfScript, 25 byte

' '/~.2*@/''+='Yes''No'if

Come funziona

             # STACK: "CodeGolf GolfCode"
' '/         # Split input string by spaces.
             # STACK: [ "CodeGolf" "GolfCode" ]
~            # Dump the array.
             # STACK: "CodeGolf" "GolfCode"
.            # Duplicate the topmost string.
             # STACK: "CodeGolf" "GolfCode" "GolfCode"
2*           # Repeat the topmost string.
             # STACK: "CodeGolf" "GolfCode" "GolfCodeGolfCode"
@            # Rotate the three topmost strings.
             # STACK: "GolfCode" "GolfCodeGolfCode" "CodeGolf"
/            # Split the second topmost string around the topmost one.
             # STACK: "GolfCode" [ "Golf" "Code" ]
''+          # Flatten the array of strings.
             # STACK: "GolfCode" "GolfCode"
=            # Check for equality.
             # STACK: 1
'Yes''No'if  # Push 'Yes' for 1, 'No' for 0.
             # STACK: "Yes"


1

Lua 115 caratteri

a,b=io.read():match"(%w+) (%w+)"c=b repeat c=c:sub(2,-1)..c:sub(1,1) s=s or a==c until b==c print(s and"Yes"or"No")

1

Programma C - 146

char b[99],c[99],*p,*q;main(n){q=(p=b+(n=strlen(gets(c))))+n;sprintf(b,"%s%s"
,c,c);for(gets(c);p>b&&strcmp(p,c);--p,*--q=0);puts(p>b?"Yes":"No");}

1

PHP, 82 caratteri

<?$s=split(" ",fgets(STDIN));echo str_replace($s[1],"",$s[0].$s[0])==$s[0]?Yes:No;

1

perl, 123 caratteri

@s1=split(//,shift);
$s2=shift;
$i=0;
while($i<=@s1){
    if(join("",@s1) eq $s2){die "yes";}
    unshift @s1,pop @s1;
    $i++;
}
die "no";

1

Ruby, 30 37

gets
puts~/^(.+)(.*) \2\1$/?:Yes: :No

Una versione che stampa "vero" e "falso" invece di "sì" e "no":

gets
p !! ~/^(.+)(.*) \2\1$/

Entrambi funzionano con stringhe di diversa lunghezza (a differenza di quella precedente)


Funziona se le due stringhe hanno la stessa lunghezza, ma fallisce in input come 'golfcode golf'.
steenslag,

1

Python 2, 86 personaggi

a,b=raw_input().split()
print"Yes"if any(a==b[n:]+b[:n]for n in range(len(a)))else"No"

1

Perl (solo una soluzione rapida)

Una soluzione alla soluzione di stivali di gomma, essendo un nuovo utente che sono, non posso ancora commentare, quindi posterò una nuova risposta.

Poiché il metodo menzionato usa un'espressione regolare costruita dall'input dell'utente, è possibile eseguire un'iniezione regex di piccole dimensioni, come segue:

> perl -le '$. = pop; $ _ = (pop) x2; print + (qw / yes no /)[!/$./]' nothing '. *'
sì

La correzione è usare \ Q (noto anche come quotemeta):

> perl -le '$. = pop; $ _ = (pop) x2; print + (qw / yes no /) [! / \ Q $. /]' nulla '. *'
no

Il codice stesso potrebbe essere ulteriormente abbreviato usando 'dire' ma questo viene lasciato come esercizio al lettore :)


Inoltre, invece di print+(qw/yes no/)[te probabilmente puoi scrivere print qw(yes no)[che è più breve di due caratteri.
Timwi,
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.