Ще декілька об’єктів GAP
Огляд
Викладання: 15 хв
Вправи: 5 хвПитання
Подальші приклади об’єктів і операцій з ними
Цілі
Перегляньте приклади типів, які вбудовані в GAP, але можуть бути відсутні в інших системах
Подивіться приклади арифметики списку
Наразі ми познайомилися з трьома типами GAP:
-
такі прості об’єкти, як цілі числа, раціональні числа, булеві значення, перестановки;
-
такі складені об’єкти, як lists;
-
такі об’єкти з більш складним внутрішнім представленням, як групи.
У цьому розділі ми продемонструємо деякі інші приклади базових об’єктів, які існують у GAP (система розширювана, тому можна вводити нові типи об’єктів, але це виходить за рамки цього уроку!).
Деякі інші прості об’єкти - це floats, cyclotomics and finite field elements:
1.15; Float(1232/3456567);
1.15
0.000356423
E(4); E(4)^2; E(6);
E(4)
-1
-E(3)^2
AsList(GF(2)); Z(5); Z(5)^4;
[ 0*Z(2), Z(2)^0 ]
Z(5)
Z(5)^0
Ви вже знаєте про списки.
Іншим типом складених об’єктів є записи. У той час як список містить субоб’єкти, проіндексовані
за їх позиціями в списку, запис містить субоб’єкти, які називаються компонентами
запису, які індексуються за своїми іменами. Elements of a record are accessed with .
date:= rec(year:= 2015, month:= "Nov", day:= 17);
rec( day := 17, month := "Nov", year := 2015 )
date.year;
2015
date.time:= rec(hour:= 14, minute:= 55, second:= 12);
rec( hour := 14, minute := 55, second := 12 )
date;
rec( day := 17, month := "Nov",
time := rec( hour := 14, minute := 55, second := 12 ), year := 2015 )
RecNames(date);
[ "time", "year", "month", "day" ]
Далі є рядки та символи. Хоча GAP спеціально друкує рядки, насправді рядок — це лише список символів, і будь-яка функція, яка приймає список, також прийматиме рядок. Навпаки, символи є простими об’єктами, такими як цілі числа.
gap> w:="supercalifragilisticexpialidocious"; Length(w);
"supercalifragilisticexpialidocious"
34
Рядки позначаються подвійними лапками, а символи одинарними.
gap> "s" in w; 's' in w; IsSubset(w,"s"); IsSubset(w,['s','f']); ['c','a','t'] = "cat";
false
true
true
true
true
Зауважте, що
gap> PositionSublist(w,"sf"); PositionSublist(w,"fr");
fail
10
Будьте обережні! Деякі операції можуть створити новий список, тоді як інші є деструктивними. Наприклад:
gap> SortedList(w); w;
"aaacccdeefgiiiiiiillloopprrssstuux"
"supercalifragilisticexpialidocious"
але
gap> Sort(w); w;
"aaacccdeefgiiiiiiillloopprrssstuux"
Яка літера зустрічається у “supercalifragilisticexpialidocious” найчастіше?
gap> c := Collected(w);
[ [ 'a', 3 ], [ 'c', 3 ], [ 'd', 1 ], [ 'e', 2 ], [ 'f', 1 ], [ 'g', 1 ],
[ 'i', 7 ], [ 'l', 3 ], [ 'o', 2 ], [ 'p', 2 ], [ 'r', 2 ], [ 's', 3 ],
[ 't', 1 ], [ 'u', 2 ], [ 'x', 1 ] ]
gap> k := Maximum( List( c, v -> v[2] ) ); Filtered( c, v -> v[2] = 7 );
7
[ [ 'i', 7 ] ]
Пошук найпоширеніших букв у списку за допомогою лише одного проходу
Команда
k := Maximum( List( c, v -> v[2] ) ); Filtered( c, v -> v[2] = 7 );двічі перебирає список
c(уListіFiltered), а також перебирає інший список такої ж довжини, що йcу викликуMaximum. Якщо список довгий, це призведе до певного зниження продуктивності та пам’яті. Спробуйте написати код, який знаходить літери, які найчастіше трапляються вc, не створюючи проміжного списку.
Ключові моменти
GAP має безліч різноманітних безпосередніх, позиційних і складових об’єктів.
Арифметика списків є дуже гнучкою та потужною.
Такі об’єкти, як списки та записи, підходять для зберігання структурованих і пов’язаних даних.