Помощь новичку Playground


#1

Народ привет. Только приступил к изучению программирования , до этого вообще ни на чем ( наверное кроме бейсик в школе ) не программировал. Столкнулся с тупиком который не могу обойти.
Условия - имеется несколько человек , имен. Имеется общий счет ( допустим в баре ). Этот счет нужно распределить равномерно по нескольким людям в порядке убывания Имени - Уменьшается счет. Пока без сложностей сделал для 3х человек.
1.Как сделать так чтобы числа вставали напротив текста ?
Если пишу в конце (sum) , выводится [Int,Int,Int]
2. Как можно сделать для разного количества человек ?
Те если добавить в nameOfFriends - “String” , появится sum4 и счет уменьшиться еще на 1/8 и тд.

let billOfDrinks = 1752

let nameOfFriends = [“Михаил”,“Александр”, “Сергей”]
var sortedOfNames = nameOfFriends.sorted {
(num1: String, num2: String)-> Bool in
return num1 < num2
}
var countOfFriends = nameOfFriends.count

let sum1 = billOfDrinks * 1/2
let sum2 = billOfDrinks * 1/4
let sum3 = billOfDrinks * 1/6

let sum = [sum1,sum2,sum3]
var billForOne = sum.sorted {
(num1: Int, num2: Int) -> Bool in
return num1 > num2
}

for (names) in sortedOfNames {
print ("(names) должен заплатить “)
}
for (sum) in billForOne {
print (” (sum)")
}


#2

Люди , ну что ни у кого нет ответа на столь простой вопрос ?!


#3

Коллега, оператор print и его параметры подробно описаны в нескольких источниках.
0. Этот форум

  1. Перевод референсной книги по Swift от Ивана
  2. Сама референсная книга на английском языке
  3. Документация встроенная в XCode
  4. Stackoverflow
  5. Developers.apple.com
  6. Yandex, Google и прочее.
    Не стесняйтесь поискать сами прежде чем задать вопрос.
    Теперь по вопросу. В самом первом предложенном мной источнике, в главе Основы есть следующее

Функция print(:separator:terminator:)_ - глобальная функция, которая печатает на экран одно или более значений в надлежащем виде. Функция print(_:separator:terminator:) выводит на экран переданные в нее значения в консоли Xcode. Параметры separator и terminator имеют дефолтные значения, поэтому могут быть пропущены при вызове функции. По умолчанию эта функция заканчивает строку при выводе сообщения, добавляя символ конца строки. Если вы не хотите прерывать строку, то в параметр terminator вам нужно передать пустую строку- например, print(someValue, terminator: “”). Более подробная информация о параметрах с дефолтными значениями находится в Значения по умолчанию для параметров.


#4

вы наверное меня неправильно поняли или пытались до меня что то другое донести с параметром Print .
Либо просто пытались послать на три буквы.)
Сейчас у меня выглядит все так : http://joxi.ru/82Q07x5i1GbqWm
либо, если пытаюсь вывести на одной строке , так : http://joxi.ru/Q2Klxa7i98aRkA
А нужно чтобы произошло сопоставление. Старшего имени к старшей сумме. в одной строке
Сепаратор и терминатор не помогают


#5

Вопрос так и был понят, что бы числа не переносились на новую строку, со скриншотами стало проще.
Реализуйте через словари
http://swiftbook.ru/doc/collection-types/dictionaries

Вот еще разьяснения но на английском языке
https://www.dotnetperls.com/dictionary-swift


#6

И да, забыл послать. На три букв. Только не на, а в В. В GIT например. :grin:


#7

просидел 2 часа над вашими ссылками , но не смог реализовать через словари. Если делать через словарь , то нужно задавать ключ : значения.
Ключ это имя , а оно варьируется . Значение допустим постоянно , но если тоже правильно написать , то тоже будет варьироваться


#8
// Объявляем словарь: ключ по имени, содержит целые значения
var personalBill = [String: Int]() 
//Заполняем словарь персонами
personalBill["Михаил"] = 0
personalBill["Александр"] = 0
personalBill["Сергей"] = 0
//Сортируем
let sortedBill = personalBill.sorted(by: <)
// Выводим сортированный словарь
for item in sortedBill {
    print("Имя:\(item.key) должен:\(item.value) рублей")
}

А дальше по схожему принципу или сами что-то придумайте.


#9

Здравствуйте.
Предлагаю следующий вариант:

//Назначаем общий бюджет
let billOfDrinks = 1752
//Назначаем размер оплаты
let sum1 = billOfDrinks * 1/2
let sum2 = billOfDrinks * 1/4
let sum3 = billOfDrinks * 1/6
//Создаем словарь
let nameOfDrinks = [“Михаил”: sum1, “Александр”: sum2, “Сергей”: sum3]
//Сортируем и выводим
for (nameOfDrinks, billOfName) in nameOfDrinks {
print("(nameOfDrinks) должен заплатить (billOfName) $")}


#10

не получится , вы сразу даете ключи каждому значению. Те имена рассортируются , а вот сумма будет привязана.


#12

По какому принципу будут выбираться имена? Вообще вероятно нужно более конкретизированное ТЗ.


#13

Конкретизирую : в ресторан , в бар прихоядт несколько человек : Миша, Вася, Саша и тд.
После пьянки они решают поделить счет за банкет ( bill = 100р ) между собой , но не поровну , а по старшинству имени .
Те , Вася ( платит больше всех 1/2 от счета ) > Миша ( платит 1/4 от счета ) > Саша ( платит 1/6).
Забив свои имена и общий счет они должны увидеть кто сколько должен за банкет.

Вася должен заплатить 50 р
Миша должен заплатить 25 р
Саша должен заплатить 17 р


#14

Т.е. “страшинство имени” это упорядоченость имён по первым буквам в имени согласно алфавиту русского языка?
Опять же получается, что они не заплатят 100% по счету)


#15

да все верно , не 100% )) так хотя бы реализовать задач , а потом можно накрутить.
сейчас пытаюсь сделать как предложил agafon.aga , но опять же там персональное значение сумм, пытаюсь разобраться .


#16

Полагаю, так.

Ответ на первый вопрос:

for (index, names) in sortedOfNames.enumerated() {
print ("\(names) должен заплатить \(billForOne[index])") }

#17

Higderin вы гений , спасибо.все работает. Оказывается все просто

let billOfDrinks = 1752

let nameOfFriends = [“Михаил”,“Александр”, “Сергей”, “Андрей”]
var sortedOfNames = nameOfFriends.sorted {
(num1: String, num2: String)-> Bool in
return num1 < num2
}
var countOfFriends = nameOfFriends.count

let sum1 = billOfDrinks * 1/2
let sum2 = billOfDrinks * 1/4
let sum3 = billOfDrinks * 1/6
let sum4 = billOfDrinks * 1/8

let sum = [sum1,sum2,sum3,sum4]
var billForOne = sum.sorted {
(num1: Int, num2: Int) -> Bool in
return num1 > num2
}

for (index, names) in sortedOfNames.enumerated() {
print ("(names) должен заплатить (billForOne[index])") }


#18

Ответ на второй вопрос:

От количества друзей в первом массиве зависят суммы во втором

Заместо этого:

let sum1 = billOfDrinks * 1/2
let sum2 = billOfDrinks * 1/4
let sum3 = billOfDrinks * 1/6
let sum = [sum1,sum2,sum3]

Вставляем:

var sum = [Int]()
var number = 2
for _ in 1...countOfFriends {
sum.append(billOfDrinks * 1/number)
number += 2    
}

Немного кривовато, но я не знаю, как ещё реализовать шаг 1/2, 1/4, 1/6. Массив можно и не сортировать по идее


#19

были бы такими ответы для новичков , было бы проще и интереснее учится , чем отсыл к гуглу.
еще раз спасибо.
Кому интересно , получилось вот так :

let billOfDrinks = 1752

let nameOfFriends = ["Михаил","Александр", "Сергей","Лариса","Михаил"]
var sortedOfNames = nameOfFriends.sorted {
(num1: String, num2: String)-> Bool in
return num1 < num2
}
var countOfFriends = nameOfFriends.count

var sum = [Int]()
var number = 2
for _ in 1...countOfFriends {
sum.append(billOfDrinks * 1/number)
number += 2    
}

var billForOne = sum.sorted {
(num1: Int, num2: Int) -> Bool in
return num1 > num2
}

for (index, names) in sortedOfNames.enumerated() {
print ("\(names) должен заплатить \(billForOne[index])") }

#20

Интереснее? Вы для себя учите? Или по бырому хотите наловчиться шлак клепать и рубать баблишко?


#21

Человек помог мне, дописал код , я дальше стал разбирать что он написал пока разбирал узнал новое и узнал почему он написал так . Пошел двигаться дальше . Это лучше чем стоишь на месте перебираешь кучу вариантов и у тебя не получается , тем более когда ты впервые в это окунулся .
Вас что родители ничему не учили , не учили разговаривать, писать , считать . Они вас спрашивали : что дружочек ?! хочешь наловить шлака и ничего сам по жизни не делать и прокатить по ней с легкостью и стать богатым ?!