ตรวจจับสตริงที่หมุน


20

stdinอ่านสองสายจาก
เอาต์พุตYesถ้าสตริงหนึ่งเป็นเวอร์ชันที่หมุนได้ของอีกสตริง
มิฉะนั้นเอาท์พุทNo

Testcases

อินพุต

CodeGolf GolfCode

เอาท์พุต

Yes

อินพุต

stackexchange changestackex

เอาท์พุต

Yes

อินพุต

stackexchange changestack

เอาท์พุต

No

อินพุต

Hello World

เอาท์พุต

No

ดังนั้น ( abcdefAB , ABabcdef ) คือ "ใช่"
Eelvex

มันควรจะเป็นการหมุนหรือการผสมผสานที่ดีเช่นกัน? เช่น. สิ่งที่จะStackexchange Stackchangeexกลับมา?
jpjacobs

1
@ สิบสองใช่ @jpjacobs Noมันจะกลับมา การหมุนเป็นกะเหมือนสัญญาณเลื่อน LED
gnibbler

สตริงไม่มีช่องว่างเสมอและคั่นด้วยช่องว่างหรือไม่
Joey

โดยเฉพาะอย่างยิ่งตัวอักษรอะไรที่ได้รับอนุญาตในสตริงเหล่านั้น?
Joey

คำตอบ:


7

APL (28)

รับอินพุตเป็นสองบรรทัด

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

คำอธิบาย:

  • A←⍞: อ่านบรรทัดอินพุตและเก็บไว้ใน A
  • ⌽∘A¨⍳⍴A: หมุน A ตาม x สำหรับแต่ละ x ใน [1..length A] ให้รายการคือestT stTe tTes Test
  • (⊂⍞)∊: อ่านบรรทัดอินพุตอื่นและดูว่าอยู่ในรายการนี้หรือไม่
  • 1+: เพิ่มหนึ่งในนี้โดยให้ 1 ถ้าสตริงไม่หมุนและ 2 ถ้าพวกเขา
  • 'No' 'Yes'[... ]: เลือกองค์ประกอบแรกหรือองค์ประกอบที่สองจากรายการ'No' 'Yes'ขึ้นอยู่กับว่าสตริงถูกหมุนหรือไม่
  • ค่านี้จะถูกส่งออกโดยอัตโนมัติ

19

ทับทิม49 41

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

แก้ไข: แทนที่ gets.split โดย $ *


นั่นเป็นความคิดที่แยบยล
Joey

ฉลาดมาก. :)
st0le

$*เป็น argv เมื่อคำถามที่ระบุstdinว่า
Mathieu CAROFF

7

Python ขนาด 70 ไบต์

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

ทดสอบ ...


+1 ดีการเลือกผลลัพธ์จากอาร์เรย์นั้นฉลาด! :-)
Tamara Wijsman

3
คำถามระบุว่าคุณควรอ่านสองสายจากstdinซึ่งวิธีนี้ไม่ได้
Ventero

@Ventero: แก้ไข
Quixotic

คุณสามารถข้ามช่องว่างในprint ['No
movatica

6

Python 70 ตัวอักษร

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

ขอบคุณ gnibbler สำหรับเคล็ดลับการหั่น


1
ปัญหาเดียวกับวิธีแก้ไข GolfScript: หากคุณป้อนเข้าnn nfnคุณจะได้รับYesซึ่งผิด
Tamara Wijsman

@TomWij ขอบคุณที่ค้นหาบั๊ก การแก้ไข ควรทำงานตอนนี้
fR0DDY

คุณสามารถแทนที่ได้<>ด้วย-เนื่องจากจะทำให้เกิด0ความยาวเท่ากัน
Tamara Wijsman

แต่ถ้าพวกมันมีความยาวไม่เท่ากันล่ะ? ถ้าอย่างนั้นก็ใช้งานไม่ได้ :-)
hallvabo

@ hallvabo ดังนั้นสตริงจะไม่ถูกหมุนด้วยกัน
fR0DDY

5

J, 47

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

ทำไม J ทั้งสองตอบ?
JB

@JB: เพราะอันนี้ใช้ buildin หมุน ทั้งสองคำตอบ su ^ H ^ H นั้นไม่ค่อยดีนัก มีห้องมากมายสำหรับเล่นกอล์ฟ
Eelvex

ทำไมอีกคนหนึ่งฉันก็อยากถาม :-)
JB

@JB: เพราะฉันคิดว่าอันนี้แทบจะไม่ถูกกฎหมาย (: p) [ในขณะที่อีกอันหนึ่งยื่นออกมาอย่างดี ]
Eelvex

errr ... อีกอันหนึ่งดูเหมือนว่าจะอ่านอินพุตจากบรรทัดคำสั่งด้วย
JB

5

ตามสเป็ค (ความยาวสตริงเดียวกัน):

Perl, 42 43 ตัวอักษร

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

หากอนุญาตให้ใช้สตริงขนาดต่างกันโซลูชันจะเป็น:

Perl, 47 ตัวอักษร

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

RBO


ปัญหาเดียวกับวิธีแก้ไข GolfScript: หากคุณป้อนเข้าnn nfnคุณจะได้รับYesซึ่งผิด
Tamara Wijsman

1
ดูเหมือนว่าจะโอเค (ฉันพลาด '!' ในรุ่นแรก) "nn nfn" => ไม่ "CodeGolf GolfCode" => ใช่
รองเท้ายาง

5

Golfscript, 31

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

ระยะตรวจสอบนี้หนึ่งครั้งแรกดังนั้นจึงควรทำงานตามที่คาดไว้


:)และ=)+1 สำหรับโค้ดที่มีความสุขมาก
TuxCrafting

4

J, 57

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

ตัวอย่างการใช้งาน:

$ 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

JavaScript, 51

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

JavaScript ไม่มีโฮสต์แบบบัญญัติดังนั้นคำตอบนี้ถูกเขียนเป็นฟังก์ชันของอาร์กิวเมนต์สองตัว คะแนนสูงสุดถึง 60 ถ้าเราไม่อนุญาตคุณสมบัติ JS 1.7 (การปิดนิพจน์)

ในเชลล์ SpiderMonkey สิ่งนี้จะเป็น (สำหรับคะแนน 71):

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

5 ปีต่อมาและตอนนี้คุณสามารถใช้=>สัญกรณ์ฟังก์ชั่น;)
J Atkin

3

งูหลาม 66 63

A, B = raw_input (). แยก ()
print'YNeos' [เป็น! = (2 * ก) .replace (ข "") :: 2]

ทางออกอื่นใน 69 ถ่าน

A, B = raw_input (). แยก ()
พิมพ์ ['ไม่', 'ใช่'] [a ใน b * 2 และ len (a) == len (b)]

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

@gnibbler เคล็ดลับดีขอบคุณสำหรับคำแนะนำ ฉันอัปเดตรหัสแล้ว
คนเขียนโปรแกรม


2

JavaScript (120 ตัวอักษร)

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

เอาท์พุท:

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

2

Ruby, 58 (62) ตัวอักษร

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

วิธีแก้ปัญหานี้ถือว่าอินพุตมีอักขระตัวอักษรผสมตัวเลขเท่านั้น (จริง ๆ แล้วทุกอย่างที่ไม่มีความหมายพิเศษภายในนิพจน์ทั่วไปก็โอเค)

วิธีแก้ปัญหาที่ไม่มีข้อ จำกัด นี้คือ 4 ตัวอักษรอีกต่อไป

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'

ปัญหาเดียวกับวิธีแก้ไข GolfScript: หากคุณป้อนเข้าnn nfnคุณจะได้รับYesซึ่งผิด
Timwi

ปัญหาได้รับการแก้ไขแล้วเหลือน้อย ... :-)
Tamara Wijsman

ไม่ได้อ่านจาก stdin ตามที่ระบุ
Wooble

ตอนนี้ไม่ ... :-)
Tamara Wijsman


2

ทับทิม, 41

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

ไม่พิมพ์อะไรผลลัพธ์ใน ': ไม่' สำหรับอินพุต 'aaa aaa' (บนเครื่องของฉัน) วิธีการ regexp อาจเป็นความคิดที่ดี
steenslag

แก้ไขการพิมพ์และป้อนข้อมูลจาก stdin แทน args: puts gets =~ /^(.+)(.*) \2\1$/ ?:Yes: :No- เพิ่มเป็น 41 chars
Nemo157

2

Haskell ( 98 96 ตัวอักษร)

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

สกาล่า 78

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

มันเป็นเรื่องน่าอายเกี่ยวกับการตรวจสอบขนาดโดยไม่นับลงไปที่54

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

"""val b=readLine split " " print(b(0).sorted==b(1).sorted)""".lengthอัตราผลตอบแทน 56
ผู้ใช้ที่ไม่รู้จัก


2

GolfScript ขนาด 25 ไบต์

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

มันทำงานอย่างไร

             # 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

ลัวะ 115 ตัวอักษร

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

โปรแกรม 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

perl, 123 ตัวอักษร

@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

ทับทิม, 30 37

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

เวอร์ชันที่พิมพ์ "true" และ "false" แทน "yes" และ "no":

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

ทั้งสองทำงานกับสตริงที่มีความยาวต่างกัน (ไม่เหมือนกับสตริงเก่า)


ทำงานได้หากทั้งสองสายมีความยาวเท่ากัน แต่ไม่สามารถป้อนข้อมูลได้เช่น 'golfcode golf'
steenslag


1

Perl (แก้ไขด่วน)

วิธีแก้ปัญหารองเท้าบูทยางเป็นผู้ใช้ใหม่ที่ฉันยังไม่สามารถแสดงความคิดเห็นดังนั้นฉันจะโพสต์คำตอบใหม่

เนื่องจากวิธีการดังกล่าวใช้นิพจน์ทั่วไปที่สร้างจากอินพุตของผู้ใช้จึงเป็นไปได้ที่จะทำการฉีด regex ขนาดเล็กดังนี้:

> perl -le '$. = pop; $ _ = (ป๊อป) x2; พิมพ์ + (qw / ใช่ไม่/)ه!/$./]' any '. *'
ใช่

การแก้ไขคือการใช้ \ Q (หรือที่รู้จักในชื่อ quotemeta):

> perl -le '$. = pop; $ _ = (pop) x2; พิมพ์ + (qw / ใช่ไม่ /) [! / \ Q $. /]' any '. *'
ไม่

โค้ดอาจถูกทำให้สั้นลงอีกโดยใช้ 'พูด' แต่สิ่งนี้จะเหลือสำหรับการออกกำลังกายของผู้อ่าน :)


นอกจากนี้print+(qw/yes no/)[คุณอาจจะเขียนprint qw(yes no)[ตัวอักษรสั้นกว่าสองตัวแทน
Timwi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.