التحقق من تدوير السلاسل النصية بالمطابقة الدقيقة
يحافظ تدوير السلسلة النصية على جميع المحارف بترتيبها الدائري نفسه، مع نقل بادئة من البداية إلى النهاية، أو نقل لاحقة إلى البداية بصورة مكافئة.
شغّل الأداة مجانًا
تقارن هذه الأداة سلسلتين وتحدد ما إذا كان بالإمكان الحصول على الثانية بتدوير الأولى بأي عدد من المواضع، بما في ذلك عدم الإزاحة. المطابقة دقيقة، لذلك تظل حالة الأحرف والمسافات وعلامات الترقيم ومحارف Unicode ذات دلالة. ولأن التدوير لا يضيف محارف ولا يحذفها، فإن اختلاف الطول يولد خطأ تحقق واضحاً بدلاً من نتيجة سالبة.
ما الذي يعد تدويراً لسلسلة نصية
يغير التدوير نقطة بداية السلسلة من دون تغيير التتابع الدائري لمحارفها. فعلى سبيل المثال، يؤدي تدوير “waterbottle” بنقل المحارف الثلاثة الأولى إلى النهاية إلى “erbottlewat”. تستخدم السلسلة المرشحة المحارف نفسها تماماً وبالترتيب الدوري نفسه، ولا يتغير إلا الحد الفاصل بين النهاية والبداية. ويعد التدوير بمقدار صفر موضع صحيحاً، ولذلك تكون كل سلسلة تدويراً لنفسها. لا تغير المحارف المتكررة هذه القاعدة، لكنها قد تجعل أكثر من موضع تدوير ينتج المظهر نفسه. هذا الفحص أدق من اختبار ما إذا كانت سلسلتان تبديلتين للحروف؛ فالتبديلة تسمح بإعادة ترتيب المحارف بحرية، أما التدوير فيحافظ على ترتيبها حول الدورة. كما أن المطابقة حرفية وتميز حالة الأحرف. وتدخل المسافات وعلامات الترقيم والمحارف المركبة وفواصل الأسطر في المقارنة. ضعوا القيمة الأصلية في `first` والسلسلة المرشحة في `second`؛ وتحتوي النتيجة على القيمة المنطقية الوحيدة `is_rotation`.
كيفية إجراء الفحص
تتحقق الأداة أولاً من أن الحقلين سلسلتان نصيتان ومن تساوي طولهما. ويعد تساوي الطول شرطاً ضرورياً، لأن التدوير لا يدرج محرفاً ولا يحذفه. إذا اختلف الطولان، يرفض الطلب بوصفه إدخالاً غير صالح، وبذلك يمكن التمييز بين مقارنة سيئة التكوين وسلسلة مرشحة صحيحة الطول لكنها ليست تدويراً. عند صلاحية الإدخال، يبحث التنفيذ عن السلسلة المرشحة خلال مرورين متتاليين على السلسلة الأصلية. ولا بد أن يظهر أي تدوير ممكن داخل فضاء البحث الدائري هذا. تستخدم الخوارزمية جدول بادئات كي لا تعيد البدء من المحرف التالي بعد كل فشل في مطابقة جزئية، مما يوفر سلوكاً خطياً حتمياً بالنسبة إلى طول الإدخال. وهي لا تستدعي خدمة شبكية أو نموذجاً لغوياً، ولا تطبق قواعد محلية أو تطبيعاً للنص. لذلك تعطي سلسلة وحدات الترميز نفسها الإجابة ذاتها دائماً. وتعد سلسلتان فارغتان تدويراً إحداهما للأخرى، كما تحقق السلاسل المتطابقة حالة التدوير الصحيح بمقدار صفر.
تفسير النتائج وإعداد الإدخال
تعني النتيجة `true` وجود إزاحة دائرية واحدة على الأقل من `first` تتطابق قيمتها الكاملة مع `second`. أما `false` فتعني أن السلسلتين متساويتان في الطول، لكن لا تنتج أي إزاحة تطابقاً دقيقاً. قبل مقارنة نصوص من مصادر مختلفة، حددوا ما إذا كانت المطابقة الحرفية تناسب المسألة التي تعالجونها. لا تزيل هذه القدرة المسافات، ولا توحد حالة الأحرف، ولا تحذف علامات الترقيم، ولا تطبق تطبيع Unicode، لأن أياً من هذه التحويلات سيغير السلاسل المقدمة من دون تصريح. إذا كان تطبيقكم يعد “A” و“a” متكافئتين، أو يعامل صيغ Unicode المركبة والمفككة على أنها متساوية، فطبعوا القيمتين بطريقة متسقة قبل الإرسال. احتفظوا بالمسافات البادئة أو اللاحقة عندما تكون جزءاً من معرفات أو متتاليات مرمزة. السعر الأساسي لواجهة API هو $0.002 لكل طلب، بينما تستطيع نسخة المتصفح تنفيذ المنطق الحتمي نفسه محلياً. ينبغي أن تشمل الاختبارات الآلية حالات تدوير ناجحة، وحالات سالبة متساوية الطول، ومحارف متكررة، وسلاسل متطابقة، وخطأ اختلاف الطول.
حالات الاستخدام
التحقق من خرج مخزن دائري
تأكدوا من أن المخزن الملتقط يحتوي على التتابع المتوقع حتى إذا بدأت القراءة من موضع مختلف في الدورة.
اختبار تمارين البرمجة
تحققوا من الإجابات المتوقعة لمسائل التدوير من دون الخلط بين الترتيب الدائري والتبديل الحر للمحارف.
مقارنة المعرفات الدورية
حددوا ما إذا كان تمثيلان متساويا الطول يصفان الدورة المتكررة نفسها مع اختلاف نقطة البداية.
الأسئلة الشائعة
هل تعد السلسلة غير المتغيرة تدويراً؟
نعم. يسمح بالتدوير بمقدار صفر موضع، ولذلك تكون كل سلسلة تدويراً لنفسها.
هل تعامل الأحرف الكبيرة والصغيرة على أنها متساوية؟
لا. المطابقة دقيقة وتميز حالة الأحرف، ولذلك تختلف وحدات الترميز الخاصة بها.
ماذا يحدث عندما يختلف طول السلسلتين؟
تعيد القدرة خطأ إدخال غير صالح، لأن التدوير لا يستطيع تغيير عدد المحارف.
هل تدوير السلسلة هو نفسه تبديل حروفها؟
لا. يحافظ التدوير على الترتيب الدائري، بينما يسمح التبديل بإعادة ترتيب المحارف بحرية.
هل تعد السلاسل الفارغة تدويرات؟
نعم. للسلسلتين الفارغتين الطول نفسه، وتتطابقان بتدوير مقداره صفر موضع.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/text/string-rotation-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"first":"waterbottle","second":"erbottlewat"}'const res = await fetch("https://api.kit.forhosting.com/text/string-rotation-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"first": "waterbottle",
"second": "erbottlewat"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/string-rotation-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"first": "waterbottle",
"second": "erbottlewat"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/string-rotation-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"first":"waterbottle","second":"erbottlewat"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"first":"waterbottle","second":"erbottlewat"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/string-rotation-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"first": "waterbottle",
"second": "erbottlewat"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.string_rotation_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
max_tokens | 20000 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |