Софтуерно Инженерство
Loading...
+ Нов въпрос
velio84 avatar velio84 241 Точки

[Homework] Java Basics - Loops, Methods, Classes - September 2014

Имам нужда от малко помощ за 4 задача - Full House With Jokers

нещо не мога да измисля решението, а донякъде и не разбирам условието. Колко всъщност са жокерите в тестето? От примерите след задачата оставам с впечатлението, че са 5, тък като има и ръка * * * * *

Предната 3та задача я реших, където е тесте без жокери. Към момента клоня към някакво решение подобно на 3та, но когато намеря full house от нормални карти, вътре да вкарам нови цикли и if-ове, които да извъртят вече намерния full house със жокери, като в същото време един int count брои колко са ръцете. Но нещо не мога да го измисля... :) Някой може ли да подскаже поне с 5 жокера колко full house-a могат да се направят?

Тагове:
2
Java Advanced 12/09/2014 02:19:48
Filkolev avatar Filkolev 4501 Точки

Броят full houses е показан в примера към задачата и е бая голям. Проблемът идва оттам, че жокера може да е всичко, т.е. ти ако имаш ръка 7 7 7 2 *, това е фул, като сложиш и боите става още по-заплетено, защото същата ръка може да я направиш още три пъти, в които двойката ти е различна боя. И да, 5 жокера са показали, така че явно са толкова. Имам идеи как да я реша, но ще я подхвана утре, ако ще идваш на лекцията може да я мислим на място. Мислех, че след като реша предишната ще е нужно малко коригиране да включа жокерите, но не е толкова просто.

0
velio84 avatar velio84 241 Точки

За съжаление не съм в София и съм записан да уча онлайн...

И аз мислех първоначално, че с леки поправки по 3-та ще се направи, но нещо зациклих и я прескочих. Сега обаче й дойде пак времето, понеже зациклих на други laughing

0
Filkolev avatar Filkolev 4501 Точки

Винаги може да прегледаш какво са писали колегите от първия випуск; все пак има още малко време, докато е възможно аз поне предпочитам да се мъча с по-тежките задачи.

0
velio84 avatar velio84 241 Точки

Мога да погледна наистина, но предпочитам първо да се поблъскам сам, докато ми издържат нервите laughing

Остават ми само тия жокери и последната с excel, но нея не съм я почвал даже.

Още приемам съвети за 4 задача smile

0
Filkolev avatar Filkolev 4501 Точки

Аз имам питане по тази задача - 4-та, Full House With Jokers. От вчера не съм хващал комп и не съм пробвал да я реша, но обмислях варианти и не мога да разбера съвсем как трябва да броим ръцете с жокерите. Да вземем за пример ръката "2 2 3 * *". Тя реално може да се сметне като "2 2 2 3 3" и като "2 2 3 3 3", така ли? Освен това, като включим боите на 2-ките и 3-ките се получават нови ръце със същите стойности. Предполагам, че на този принцип ги броим.

Друг случай, жокерите уникална карта ли са или приемат произволна стойност? Предполагам, че е първото, защото в задачата е даден пример с 5 жокера, и то един. Какво би означавало второто: Казваме, че * = 2, правим комбинацията съответно 2 2 2 * *, като втората двойка жокери ще стане 3, или имаме 2 2 2 3 3, след това 2 2 2 4 4 и т.н. Т.е. ще се изциклят реално всички варианти с обикновени карти. Мисля, че като бройка това ще даде резултатът от предната задача - към 4000 комбинации. И това само от ръката * * * * * като въртим жокерите и им присвояваме различни стойности. По този параграф мисля, че жокерите се смятат за отделна карта, а не за някоя конкретна.

0
mihayloff14 avatar mihayloff14 825 Точки

Според мен условието на задачата и output-а от домашното е грешен, тъй като според него 2223* и 222*3 са две различни ръце, а фактически не е така. Лично аз съм го направил да не генерира тези комбинации. Ето и решението ми, малко е сложно знам :D:

линк

0
Filkolev avatar Filkolev 4501 Точки

Много е неясно условието и трябва да гадаем точно какво е имал предвид автора, защото явно се правят имплицитни допускания кое е уникална комбинация и кое не. Мисля си, че има много място за интерпретации и реално може 4-5 човека да получаваме различни резултати и всички да те да са верни при едни или други допускания.

1
velio84 avatar velio84 241 Точки

Направих някакво решение на 4 задача, но не изкарва резултат като от заданието. Така или иначе не мисля да задълбавам повече в нея и да губя време, тъй като така или иначе условието е малко неясно. Аз добавих още 5 карти в тестето "*", които да се въртят в циклите заедно с другите. Сложих и някакъв алгоритъм, който да гледа първо дали някоя от картите е "*" и да прилага разни сравнения, после гледа дали всички не са "* * * * *", а ако няма жокери, си гледа дали е обикновен full house.

,,решението" ми на 4 задача

останалите, без 11 с excel-ския файл

кофти номерация на задачите, знам, но вече ще ги правя с _01_Whatever smile

1
ph.kolarov avatar ph.kolarov 63 Точки

Здравейте, имам един въпрос по 5та задача. Някой има ли идея как мога да форматирам методите, За да излизат с 5 знака след дес. запетая... Каквото и да сложа изходът е доста странен?

Задача 5

0
14/09/2014 19:16:25
Samuil.Petrow avatar Samuil.Petrow 1548 Точки

DecimalFormat df = new DecimalFormat("#.00000");

Другата алтернатива е при изкарването със стринг формат:

System.out.println(String.Format("%.5f", chisloto));

0
14/09/2014 19:16:04
ph.kolarov avatar ph.kolarov 63 Точки

Ами пробвах и двата варианта и изхода си остава непроменен... къде бъркам ?

1
VenelinGrozev avatar VenelinGrozev 130 Точки

Проблемът е в това, че след изчисляването на градусите/радианите връщаш резултата като String  в методите radianConverter и degreeConverter:

private static String radianConverter(double deg) {
 
     return (deg * Math.PI) / 180 + " rad";
 
}
 
(deg * Math.PI) / 180 се изчислява като double и резултатът е примерно 2.1240334. После след като го слепиш с "rad" вече губиш възможността да го форматираш като число с printf().
 
Можеш да промениш тези методи да връщат double вместо String и върнатият резултат да форматираш така:
 
printf("%.2f rad", radian); или printf("%.2f deg", degree); //.2 казва с колко знака след десетичната запетая да се изпечата, f означава число с плаваща запетая (double или float).
 
Като съответно radian или degree ти съдържат вече конвертираният резултат от годните методи като число.
 
1
a.polyanska avatar a.polyanska 107 Точки

Здравейте,

 

Имам питане за 03 задача- фул хаус-овете. Ето моят код: http://pastebin.com/2MmVSq26

 

Видях, че кодът на velio84  е доста подобен, направо същият :)

Само дето не ще да е съвсем същият, защото на мен броячът ми отчита повече от десет пъти повече броя комбинации, а именно Full houses: 44928. Доста преглеждах, но така и не мога да установя защо излизат толкова много. Някой може ли да ми помогне да открия грешката?

 

0
ph.kolarov avatar ph.kolarov 63 Точки

Забележи, че при него за да избегне повтаряне при масивите suit всеки следващ започва с предния +1... това е за да се избегнат повтарящи се комбинации... 

Аз обаче нещо не разбирам тези решения ... ще се радвам ако ми обясниш стъпка по стъпка как действа твоя код, защото при мен нещата изглеждат доста по различни.

Задача 3

1
14/09/2014 22:28:58
velio84 avatar velio84 241 Точки

@ph.kolarov

малко кофти си именувал променливите и много много не мога да се ориeнтирам в кода ти. Но ми направи впечатление, че сравняваш стрингове с ==

В джава това не работи правилно и дава проблеми, може от там да идва грешния ти резултат. Трябва да ги сравняваш по следния начин:

if (faces[i].equals(faces[j]) && faces[i].equals(faces[j2]) && !faces[j2].equals(faces[k])) {  -- това ти е първия if

това сравнение е само за стрингове. За char си ползвай ==

Можеш да погледнеш решението ми на 4-та задача (което пак казвам, че не изкарва резултата от заданието, но поне да видиш кода) - тук решението е малко по-различно от 3-та задача, но ползва подобна логика.

А логиката ми на 3-та е следната:

Не гледам дали първите 3 са равни на другите 2, а свеждам картите до лява и дясна (i и j цикълите). Така то извърта само вариантите, когато има фулхаус (единственото условие е лявата карта, да не е равна на дясната). Така като има фулхаус, за да отпечата картите, следващите 5 for цикъла въртят боите - за всяка карта. За да не се поварят картите, боите са l1, l2 = l1 + 1, l3 = l2 + 1 (за левите 3 карти) и r1, r2 = r1 + 1 (за десните 2 карти). Тъй като картите отляво и дясно са различни, няма как да се припокрият боите, т.е като боята е suit[l1] = suit[r1] = 0 (пика примерно), лявата карта ще 2 пика, дясната 3 пика.

Малко куцо обяснение, но се надявам да си ме разбрал smile

В решенеито ми на 4 задача, ако от масива махнеш жокерите и от if-овете оставиш само посления

if ((c1.equals(c2)) && (c2.equals(c3)) && (c4.equals(c5)) && (!c3.equals(c4))) 

house++;

се получава същия отговор като 3-та.

Тук въртя 5 пъти масива с faces и 5 пъти масива с боите(по същата логика като предната (s1, s2 = s1 + 1, s3 = s2 + 1, s4, s5 = s4 + 1)

 

@a.polyanska

пробвай вместо да проверяваш j suit-овете с if-ове, да ги направиш да вървят с +1

j1 = 0, j2 = j1 + 1, j3 = j2 + 1 (за левите 3 карти),  j4 = 0, j5 = j4 + 1 (за десните 2)

0
14/09/2014 23:22:30
a.angelov avatar a.angelov 1317 Точки

Ами това е да - получават ти се повече комбинации от suit-овете - преповтаряш комбинации.

При твоя код ще имаш такива варианти, които реално са едни и същи:

1. спатия, каро, купа;

2. купа, каро, спатия;

Докато той елиминира тези повторения, като индекса на всяка следваща боя е равен на индекса на предната боя плюс единица.

 

А ето и едно мое решение, доста по-различно от тези:

03. Full House

1
14/09/2014 23:15:12
BoYaN avatar BoYaN 331 Точки

Здравейте колеги,

това са рашенията ми на задачите от Цикли, методи и работа с класове в Java.

_01_SymmetricNumbersInRange
_02_Generate3LetterWords
_03_FullHouse
_04_FullHouseWithJokers
_05_AngleUnitConverter
_06_RandomHandsOf5Cards
_07_DaysBetweenTwoDates
_08_SumNumbersFromTextFile
Product.java
_09_ListOfProducts
_10_OrderOfProducts
_11_Excel

Доста от кода е взаимстван от решения на други колеги, на които благодаря.

Опитах се да обясня и решенията, до които стигнах в блога ми.

На задачата FullHouse with Jokers съм ползвал преработен вариант на алгоритъма за намиране на Subset Sum (от курса C# Basics), с побитово представяне на числата (32 bit Integer), но математическия модел пак не мога да го обясня. Ако някой по-навътре с алгоритмите и математика го разясни, ще му бъда благодарен, че вчера половин час гледах Debug конзолата и така и не схванах какво точно се случва, иначе работи идеално.

3
16/09/2014 14:24:11
dim4o avatar dim4o 289 Точки

За 4 зад., Full House with Jokers използвам следната стратегия:

Условието не отговоаря изобщо на дадения output - това изобщо няма какво да го коментирам.

1. Вътря си циклите като в предната зад. 3

2. В най-вътрешния поставям жокерите на всички възможни позиции. Тук има 2^5 варианта. Правя го побитово, защото така ми се струва най-лесно. Иначе може и с листове да се направи и с рекурсия - и двата варианта са с повече код и по-бавни. Ако тук ги преброим излиза 119808 (като в дадения output), но това не е коректно, тъй като има много повторения.

3. Картите се сортират и се добават в HashSet примерно. Ако не се сортират пак ще се получат повторения. Между другото може и да преброим повторенията за всяка ръка ако използваме някакъв Map<String, Integer>. Предполагам хич няма да са малко.

4. Принтирам HashSet-a и размера му.

Ще пусна решението довечера, защото в момента нямам достъп до файловете Между другото се прецаках доста яко. Решил съм всички задачите отдавна, но не съм предал нищо, защото си мислех, че за online студенти домашните не носят точки (както беше за Ниво 0), но се оказа, че не е така. Много ме яд, защото ги имам всичките. Смятам да предам поне оставащите 2...

1
dim4o avatar dim4o 289 Точки

Ето какво трябва да представлява според мен решението на Full House With Jokerс

Получава се 14223 full houses.

1