1 (изменено: OwnCorporation, 2013-10-29 02:59:10)

Тема: AHK: Перетасовка координат в переменной от n числа

Есть.
Число = 4
Есть 6 координат.
Круговорот = 408,445|72,349|72,177|368,111|707,177|707,349

Моя задача.
1. Перетасовать координаты в переменной от числа 4.
То есть чтоб координаты в переменной Круговорот
Поменялись местами вот так.
Круговорот = 368,111|707,177|707,349|408,445|72,349|72,177

Мое решение.

StringSplit, coordsArray, [b]Круговорот [/b], |
Loop, %coordsArray0%
{
    if a_index = 7
        break
    this_coords := coordsArray%число%
    test_coords2.= this_coords "|"
    число++
    if (число> 6)
        число= 1
}
StringTrimRight, test_coords2, test_coords2, 1

Все работает!
Но моих знаний не достаточно, чтобы сделать это более простым способом.
Прошу помощи с объяснением построчно.

P.s:
if !ErrorLevel
Say, Level UP!

2 (изменено: OwnCorporation, 2013-10-29 01:14:12)

Re: AHK: Перетасовка координат в переменной от n числа

Подумал. Разобрал снова задачу.
1. Записать все координаты в переменную1 до того числа.
2. Записать все координаты в переменную2 после этого числа.
3. Переставить переменную1 после переменной2.
4. Перетасовка = переменная2+переменная1
Сделал более понятно.

Loop, parse, circle, |
    if (A_index >= Number_start)
        save2.=A_LoopField "|"
    else
        save1.=A_LoopField "|"
reshuffle:=save2 "" save1
StringTrimRight, reshuffle, reshuffle, 1
MsgBox, % reshuffle

Но моих знаний не достаточно, чтобы сделать это более простым способом. - еще в силе!
Кто знает еще более простой способ прошу отписаться.

Более понятный вариант.

Loop, parse, circle, |
    if (A_index >= Number_start)
        after.=A_LoopField "|" ; После числа
    else
        before.=A_LoopField "|" ; ДО числа
reshuffle:=after before
MsgBox, % reshuffle
P.s:
if !ErrorLevel
Say, Level UP!

3

Re: AHK: Перетасовка координат в переменной от n числа

Есть известная тебе команда:


Number_start = 4
circle = 408,445|72,349|72,177|368,111|707,177|707,349

Sort, circle, P%Number_start% D|
MsgBox, % circle

По правилам форума нельзя давать ответ в твоей теме, так как у тебя нарушения:
Код оформляется тэгом code.
В названии темы после "AHK:" ставится пробел.
Слова в предложении с маленькой буквы после первого, точка в конце заголовка не ставится.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Перетасовка координат в переменной от n числа

serzh82saratov
Спасибо большое!
Где можно более подробно прочитать про сортировку на русском ?

P.s:
if !ErrorLevel
Say, Level UP!

5

Re: AHK: Перетасовка координат в переменной от n числа

Где можно более подробно прочитать про сортировку на русском ?

Только в переводчике гугл

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Перетасовка координат в переменной от n числа

Number_start = 4
circle = 408,445|72,349|72,177|368,111|707,177|707,349

Sort, circle, P%Number_start% D|

MsgBox, % circle

Не верно работает.
Получаю сортировку по первому числу в таком виде:
368,111|707,177|707,349|408,445|72,177|72,349
Нужно в таком:
368,111|707,177|707,349|408,445|72,349|72,177

P.s:
if !ErrorLevel
Say, Level UP!

7 (изменено: serzh82saratov, 2013-10-29 02:26:23)

Re: AHK: Перетасовка координат в переменной от n числа

Да действительно что то видимо глючит.

Твой вариант хорош, можно чуть короче записать:


FirstItem = 4
circle = 408,445|72,349|72,177|368,111|707,177|707,349
 
Loop, parse, circle, |
    (A_index >= FirstItem) ? (after .= A_LoopField "|") : (before .= A_LoopField "|")  
MsgBox, % reshuffle := SubStr( after before, 1, -1)

Знал бы инглиш, то написал бы Lexikos`у о проблеме в команде Sort.

up:
Хотя скорее всего это я не понимаю что должна делать опция

Pn: Sorts items based on character position n (do not use hexadecimal for n). If this option is not present, n defaults to 1, which is the position of the first character. The sort compares each string to the others starting at its nth character. If n is greater than the length of any string, that string is considered to be blank for the purpose of the sort. When used with option N (numeric sort), the string's character position is used, which is not necessarily the same as the number's digit position.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8 (изменено: OwnCorporation, 2013-10-29 02:53:58)

Re: AHK: Перетасовка координат в переменной от n числа

Loop, parse, circle, |
    (A_index >= FirstItem) ? (after .= A_LoopField "|") : (before .= A_LoopField "|")

Спасибо еще раз!
А где можно прочитать про такую конструкцию записи ?

P.s:
if !ErrorLevel
Say, Level UP!

9 (изменено: serzh82saratov, 2013-10-29 02:48:29)

Re: AHK: Перетасовка координат в переменной от n числа

Выражения
И там же "Тернарный условный оператор".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10 (изменено: Irbis, 2013-10-29 15:49:26)

Re: AHK: Перетасовка координат в переменной от n числа

Можно обойтись без цикла, склеить строку и вырезать нужный кусок ))

Круговорот = 408,445|72,349|72,177|368,111|707,177|707,349
MsgBox % Swap(Круговорот, 4)
Return

Swap(a, n) {
   Return SubStr(a "|" a, InStr(a, "|",,,n)+1, StrLen(a))
}

При этом предполагается, что длина строки Круговорот не превышает 8Кб

Более кратко, без функции:

n := 4, a := "408,445|72,349|72,177|368,111|707,177|707,349"
MsgBox % SubStr(a "|" a, InStr(a, "|",,,n)+1, StrLen(a))

11 (изменено: OwnCorporation, 2013-10-29 16:37:22)

Re: AHK: Перетасовка координат в переменной от n числа

Irbis
Спасибо!
Но для меня такая запись еще сложная.
Мог бы подробней объяснить. Что за чем происходит ?
MsgBox % Swap(Круговорот, 4) - Не понял!
Return

Swap(a, n) { - Не понял!
   Return SubStr(a "|" a, InStr(a, "|",,,n)+1, StrLen(a)) - Не понял!
}

P.s:
if !ErrorLevel
Say, Level UP!

12

Re: AHK: Перетасовка координат в переменной от n числа

Попробую.
Итак, для простоты представим, что есть строка 12345, нужно из нее получить 34512, или 51234..., в зависимости, от сдвига. Удваиваем строку (1234512345), и затем вырезаем нужную часть - 1234512345

SubStr отвечает за вырезание, InStr ищет n-ный символ "|", StrLen возвращает длину вырезаемой части - она равна исходной длине строки.

13 (изменено: serzh82saratov, 2013-10-29 18:16:47)

Re: AHK: Перетасовка координат в переменной от n числа

При этом предполагается, что длина строки Круговорот не превышает 8Кб

Можешь пояснить, почему 8Кб?
Так понял тут ещё играет роль дублирование строки в SubStr.
---
Лучше наверное записать n-1. Чтобы n совпадало с номером подстроки которая должна стать первой в новой строке:


n := 4, a := "408,445|72,349|72,177|368,111|707,177|707,349"
MsgBox % SubStr(a "|" a, InStr(a, "|",,, n-1)+1, StrLen(a))

Вообще решение очень хорошее, не обращал до этого внимание на параметр Occurrence в InStr.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Перетасовка координат в переменной от n числа

Верно, ограничение в 16Кб на длину строки.

Можно n, можно n-1, смотря как рассматривать этот параметр. Если n взять за номер подстроки (по твоему выражению), то n-1.
Я рассматривал n как величину кругового сдвига начальной строки (для n=1 сдвиг на одну позицию, вторая координата становится первой и т.д.), поэтому подставил в выражение просто n.

15 (изменено: serzh82saratov, 2013-10-29 19:02:39)

Re: AHK: Перетасовка координат в переменной от n числа

Есть похожий вариант не дублировать строку:


n := 4, a := "408,445|72,349|72,177|368,111|707,177|707,349" 
MsgBox % ((p := InStr(a, "|",,, n-1)) ? SubStr(a, p+1) "|" SubStr(a, 1, p-1) : a)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: Перетасовка координат в переменной от n числа

Тоже хороший вариант, если длина строки неизвестна

+ 

А теперь объясни его действие ТС'у, раз он более простой вариант не понял

17

Re: AHK: Перетасовка координат в переменной от n числа

А теперь объясни его действие ТС'у, раз он более простой вариант не понял

По логике думаю даже проще. Если найден разделитель, составляем строку из: после, разделитель, начало.

Верно, ограничение в 16Кб на длину строки.

Почему всё таки 16Кб? Я знаю ограничение на 16383 символов на длину строки. А если текст переменных в AutoHotkey содержится в UTF-16 (2 байта на символ), то получится 8Кб, или я ошибаюсь?
---
Ради разминки, можно ли решить задачу с помощью только одного вызова RegExReplace, не могу сообразить шаблон.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18

Re: AHK: Перетасовка координат в переменной от n числа

Решение с RegExReplace:

n := 4, a := "408,445|72,349|72,177|368,111|707,177|707,349" 
MsgBox % Trim(RegExReplace(a, "(.*?(?:.*?\||$){" n-1 "})(.*)", "$2|$1"), "|")
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19 (изменено: OwnCorporation, 2013-10-29 20:28:38)

Re: AHK: Перетасовка координат в переменной от n числа

Вроде понял логику.
Первый вариант:
1.Запомнить до.
2.запомнить после.
3.поменять местами.

В первом варианте 2 раза используется память.
Второй вариант:
1.Вырезать после.
2.Вставить до.

Во втором варианте 1 раз используется память.
По логике второй вариант быстрее.
Уточните, если не правильно понял!
Спасибо!
Но это о логике.
А вот о конструкции записи я нечего не понял с того момента как начались функции.
Я только сообразил как они называются. Чтиво уже нашел.
Спасибо еще раз!

P.s:
if !ErrorLevel
Say, Level UP!

20

Re: AHK: Перетасовка координат в переменной от n числа

n := 4, a := "408,445|72,349|72,177|368,111|707,177|707,349" 
MsgBox % ((p := InStr(a, "|",,, n-1)) ? SubStr(a, p+1) "|" SubStr(a, 1, p-1) : a)

Про "Тернарный условный оператор" я тебе давал ссылку.
То есть (p := InStr(a, "|",,, n-1)) - это его условие. В данном случае результатом будет присвоение p. Если InStr вернёт 0, то будет ложь, и выполнится то что после :, то есть результат всего выражения просто будет равен а, то есть значению переменной а. Если InStr что то находит он вернёт позицию больше нуля, то есть условие будет правдой, и выполнится то что после ?, то есть SubStr(a, p+1) "|" SubStr(a, 1, p-1).
Это тоже самое что и запись:


n := 4, a := "408,445|72,349|72,177|368,111|707,177|707,349" 

If (p := InStr(a, "|",,, n-1)) != 0
    Res := SubStr(a, p+1) "|" SubStr(a, 1, p-1)
Else
    Res := a
MsgBox % Res

В примере InStr находит позицию третьего | (то есть n-1) в переменной а, и сохраняет его позицию в p.
Res := SubStr(a, p+1) "|" SubStr(a, 1, p-1)
Добавляем в строку результата:

. SubStr(a, p+1) начиная со следующего символа после р (p+1) и до конца вырезаем фрагмент. 

. "|"  добавляем разделитель.

. SubStr(a, 1, p-1) добавляем начало строки (a, 1, p-1) до найденного | (a, 1, p-1).

Res := "368,111|707,177|707,349" + "|" + "408,445|72,349|72,177"

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui