08 martie 2017

Generate classes for XML Schema (xjc)

Fie o schema (model.xsd):



Si o implementare (input.xml):



Metoda (1)

In Maven (pom.xml)



(mvn clean install) => target/generatedSources/jaxb/generated/


Metoda (2)

Cu xjc din suita jdk-ului:

> xjc -d <path-to-folder-to-add> -p <package-name> model.xsd

Comanda creeaza un proiect nou avand fisierele sursa generate din schema.


Utilizare pentru parsarea lui input.xml:



06 martie 2017

Code jam, for women (solutiile mele, #2)

Which two dancers will be next to dancer number K when the dance is over?

# init
T = 0
i = 1

def solve(caseId, D, K, N):
pos = [0 for i in range(D)]
i = 1
while i<= D:
    # even -> ccw
if i % 2 == 0:
pos[(i - N) % D] = i
# odd -> cw
else:
pos[(i + N) % D] = i

    i += 1
  posK = pos.index(K)
msg = "Case #"+ str(caseId) + ": " + str(pos[(posK+1)%D]) + " " + str(pos[(posK-1)%D])
print msg


with open("B-large-practice.in", "r") as myFile:
        T = eval(myFile.readline())
        for line in myFile:
                D, K, N = line.split(' ')
                solve (i, eval(D), eval(K), eval(N))
                i = i + 1

myFile.close()

# This solution does not scale !!!
# if D is very large, we can't afford to use an array that large!
# hence got this math solution below:

case = 1

def fix(number, D):
  while number <= 0:
    number += D
  while number > D:
    number -= D
  return number

def getLeft(index_K, D, N):
  if index_K == D-1:
    index_left = 0
  else:
    index_left = index_K + 1

  j = 0 # does not matter as we add/subtract as we want
  left = D*j + index_left + N
  if left % 2 == 0:
    return fix(left,D)
    
  left = D*j + index_left - N
  if left % 2 == 1:
    return fix(left,D)
  return -1  


def getRight(index_K, D, N):
  if index_K == 0:
    index_right = D-1
  else:
    index_right = index_K - 1
  
  j = 0
  right = D*j + index_right + N
  if right % 2 == 0:
    return fix(right,D)
    
  right = D*j + index_right - N
  if right % 2 == 1:
    return fix(right,D)
  return -1


def solve(caseId, D, K, N):
  if K % 2 == 0:
    index_K = (K - N) % D # K is at position (K-N)%D
    left = getLeft (index_K, D, N)
    right = getRight (index_K, D, N)
  else:
    index_K = (K + N) % D
    left = getLeft (index_K, D, N)
    right = getRight (index_K, D, N)
  
  msg = "Case #"+ str(caseId) + ": " + str(left) + " " + str(right)
  print msg


with open("B-large-practice.in", "r") as myFile:
        T = eval(myFile.readline())
        for line in myFile:
                D, K, N = line.split(' ')
                solve (case, eval(D), eval(K), eval(N))
                case = case + 1


myFile.close()

03 martie 2017

Java8 (Streams, filtering) & Unit testing - exemplu dragut

package ch.makery.address;

import ch.makery.address.model.Person;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.*;

/** * Created by Geo on 3/3/2017. */
@RunWith(value = Parameterized.class)
public class StreamTest {

    public Map<String, List<Person>> people;

    @Before    
    public void init () {
        people = new HashMap<>();
        people.put("Bucharest", new ArrayList<Person>());
        people.put("Pitesti", new ArrayList<Person>());
        people.put("Timisoara", new ArrayList<Person>());
        people.put("Iasi", new ArrayList<Person>());
        people.put("Cluj", new ArrayList<Person>());

        people.get("Bucharest").add(new Person("Geo", "T", "Bucharest", 51081, 1969, 2, 21));
        people.get("Bucharest").add(new Person("Kate", "M", "Bucharest", 97124, 1999, 2, 21));
        people.get("Bucharest").add(new Person("Alex", "W", "Bucharest", 51081, 1999, 2, 21));
        people.get("Bucharest").add(new Person("Ana", "T", "Bucharest", 51081, 2009, 2, 21));

        people.get("Pitesti").add(new Person("Lena", "A", "Pitesti", 70503, 2009, 2, 21));
        people.get("Timisoara").add(new Person("Catalin", "F", "Timisoara", 51081, 2000, 2, 21));
        people.get("Iasi").add(new Person("Petri", "T", "Iasi", 51081, 1976, 2, 21));
        people.get("Cluj").add(new Person("Sahar", "A", "Cluj", 97124, 1977, 2, 21));
    }

    @Parameterized.Parameter(value=0)
    public int age;

    @Parameterized.Parameter(value=1)
    public String city;

    @Parameterized.Parameter(value=2)
    public List<Integer> postalCodes;

    @Parameterized.Parameter(value=3)
    public String expected;

    @Parameterized.Parameters(name = "{index}: testFilterPersons({0},{1},{2}) => {3}")
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {18, "Bucharest", Arrays.asList(51081), "Geo T\nAlex W\n"},
                {18, "Cluj", Arrays.asList(51081, 97124), "Sahar A\n"}
        });
    }

    @Test    
    public void testFilterPersons() {
        assert(filterPersons(age,city,postalCodes).equals(expected));
    }


    private String filterPersons(int age, String city, List<Integer> postalCodes) { // why void?        
        return (people.get(city)).stream()
           .filter( person -> postalCodes.contains(person.getPostalCode()) && person.getAge() >= age)
           .map ( person -> person.getFirstName() + " " + person.getLastName())
           .reduce ("", (a,b) -> a+b+"\n");
    }

}