Kumite (ko͞omiˌtā) is the practice of taking techniques learned from Kata and applying them through the act of freestyle sparring.
You can create a new kumite by providing some initial code and optionally some test cases. From there other warriors can spar with you, by enhancing, refactoring and translating your code. There is no limit to how many warriors you can spar with.
A great use for kumite is to begin an idea for a kata as one. You can collaborate with other code warriors until you have it right, then you can convert it to a kata.
It works once every year :)
function ok() { return ok.toString().substr(9, 2); }
ok=_=>"ok"wink=(v,o)=>"wink"- function ok() {
- return ok.toString().substr(9, 2);
- }
describe("Ok", function() { it("should return ok", function() { Test.assertEquals(ok(), "ok") }); });
- describe("Ok", function() {
- it("should return ok", function() {
- Test.assertEquals(ok(), "ok")
- });
});describe("Wink", function() {it("should return wink", function() {Test.assertEquals(wink(), "wink")});- });
Your family members are a bit picky when it comes to choose who they want to seat next to in a family outing to the restaurant. Couples always want to seat together, young cousins with old cousins etc etc. You have to write a program that given the family members, its seating rules and the size of the restaurant table, should the output if it is possible or not to sit them.
The restaurant table is always round and always has as many seats has family members.
example
// family members seating rules
canTheySit(["Mark", "Marta", "Oliver"], ["Mark", "Marta"]) == true
Contributing my own, different solution. It passes the tests but it's possible that it would fail on a different edge case.
I could see this as a decent kata provided it's not a duplicate :) (then again if it's a duplicate, this kumite shouldn't be here)
// there are three conditions that could cause the rules to fail: // - a name in the rules doesn't exist in the family // - a family member wants to sit next to three other people, or themself // - a loop consisting of a smaller subset of the family exists // this solution checks for these three function canTheySit(familyMembers, rules) { var desiredSeating = {}; familyMembers.forEach(member => desiredSeating[member] = []); if (rules.some(rule => { if (rule.some(member => !desiredSeating[member]) || rule[0] == rule[1]) return true; desiredSeating[rule[0]].push(rule[1]); desiredSeating[rule[1]].push(rule[0]); return rule.some(member => desiredSeating[member].length > 2); })) return false; var visited = {}; for (var m = 0; m < familyMembers.length; m++) { var member = familyMembers[m]; if (visited[member]) continue; visited[member] = true; var loopLength = 0; var currMember = member; while (desiredSeating[currMember].length > 0) { var prevMember = currMember; currMember = desiredSeating[currMember][0]; visited[currMember] = true; loopLength++; if (currMember == member) return loopLength == familyMembers.length; var currSeating = desiredSeating[currMember]; currSeating.splice(currSeating.indexOf(prevMember), 1); } } return true; }
function arrangeSeating(table, seating){// first check if table is in any one of this solutions// none is seated// one is seated// both are seatedvar seated = {};seated[seating[0]] = false;seated[seating[1]] = false;for(var i = 0; i < table.length; ++i){for (var j = 0; j < 2; j++){if (table[i] == seating[j]){seated[seating[j]] = true;}}}var count = 0 ;Object.keys(seated).forEach((id) => {if (seated[id]) {count++;}});- // there are three conditions that could cause the rules to fail:
- // - a name in the rules doesn't exist in the family
- // - a family member wants to sit next to three other people, or themself
- // - a loop consisting of a smaller subset of the family exists
- // this solution checks for these three
- function canTheySit(familyMembers, rules) {
- var desiredSeating = {};
- familyMembers.forEach(member => desiredSeating[member] = []);
- if (rules.some(rule => {
- if (rule.some(member => !desiredSeating[member]) || rule[0] == rule[1])
- return true;
// find two empty seatsif (count == 0){for(var i = 0; i < table.length; ++i){if (table[i] === "Empty" && table[(i + 1) % table.length] == "Empty"){table[i] = seating[0];table[(i + 1) % table.length] = seating[1];return true;}}}else if (count == 1){// one of them is seated let's see if any chair next to him is filled- desiredSeating[rule[0]].push(rule[1]);
- desiredSeating[rule[1]].push(rule[0]);
var seatedOne = "";var toSit = "";if (seated[seating[0]] == true){seatedOne = seating[0];toSit = seating[1];}else{seatedOne = seating[1];toSit = seating[0];}- return rule.some(member => desiredSeating[member].length > 2);
- }))
- return false;
- var visited = {};
- for (var m = 0; m < familyMembers.length; m++) {
- var member = familyMembers[m];
- if (visited[member]) continue;
- visited[member] = true;
for(var i = 0; i < table.length; ++i){if (table[i] === seatedOne){var rightSeat = (i + 1) % table.length;var leftSeat = ((table.length + i) - 1) % table.length;if (table[rightSeat] == "Empty"){table[rightSeat] = toSit;return true;}else if (table[leftSeat] == "Empty"){table[leftSeat] = toSit;return true;}else{return false;}}}}else{// both are seated check if they are next to each otherfor(var i = 0; i < table.length; ++i){if (table[i] === seating[0]){var rightSeat = (i + 1) % table.length;var leftSeat = ((table.length + i) - 1) % table.length;if (table[rightSeat] === seating[1]){return true;}else if (table[leftSeat] === seating[1]){return true;}else{return false;}}- var loopLength = 0;
- var currMember = member;
- while (desiredSeating[currMember].length > 0) {
- var prevMember = currMember;
- currMember = desiredSeating[currMember][0];
- visited[currMember] = true;
- loopLength++;
- if (currMember == member)
- return loopLength == familyMembers.length;
- var currSeating = desiredSeating[currMember];
- currSeating.splice(currSeating.indexOf(prevMember), 1);
- }
- }
return false;}function canTheySit(familyMembers, rules){var indices = {};var indices_inv = {};var pairs = Array(familyMembers.length).fill().map(()=>Array(familyMembers.length).fill(false));for (var i = 0; i < familyMembers.length; ++i){indices[familyMembers[i]] = i;indices_inv[i] = familyMembers[i];}rules.forEach((rule) =>{var pair1 = indices[rule[0]];var pair2 = indices[rule[1]];pairs[pair1][pair2] = true;pairs[pair2][pair1] = true;});var table = Array(familyMembers.length).fill("Empty");var toReturn = true;var i = 0;pairs.forEach((list) =>{var total = 0;for (var j = i + 1; j < list.length; ++j){if (list[j]){// find if possible to sitif (!arrangeSeating(table, [indices_inv[i], indices_inv[j]])){toReturn = false;}}}i++;});return toReturn;- return true;
- }
// TODO: Add your tests here // Starting from Node 10.x, [Mocha](https://mochajs.org) is used instead of our custom test framework. // [Codewars' assertion methods](https://github.com/Codewars/codewars.com/wiki/Codewars-JavaScript-Test-Framework) // are still available for now. // // For new tests, using [Chai](https://chaijs.com/) is recommended. // You can use it by requiring: // const assert = require("chai").assert; // If the failure output for deep equality is truncated, `chai.config.truncateThreshold` can be adjusted. describe("Solution", function() { it("should test for something", function() { Test.assertEquals(canTheySit(["Mark", "Marta", "Oliver"], [["Mark", "Marta"]]), true); Test.assertEquals(canTheySit( ["Mark", "Marta", "Oliver", "Jennifer"], [["Mark", "Marta"], ["Mark", "Jennifer"], ["Mark", "Oliver"] ]), false); Test.assertEquals(canTheySit( ["1", "2", "3", "4", "5"], [["1", "3"], ["1", "5"], ["5", "4"], ["3", "4"] ]), false); Test.assertEquals(canTheySit( ["1", "3", "4", "5"], [["1", "3"], ["1", "5"], ["5", "4"], ["3", "4"]] ), true); // reverse Test.assertEquals(canTheySit(["Mark", "Marta", "Oliver"], [["Mark", "Marta"]]), true); Test.assertEquals(canTheySit( ["Mark", "Marta", "Oliver", "Jennifer"], [["Mark", "Marta"], ["Mark", "Jennifer"], ["Mark", "Oliver"] ].reverse()), false); Test.assertEquals(canTheySit( ["1", "2", "3", "4", "5"], [["1", "3"], ["1", "5"], ["5", "4"], ["3", "4"]].reverse()), false); Test.assertEquals(canTheySit( ["1", "3", "4", "5"], [["1", "3"], ["1", "5"], ["5", "4"], ["3", "4"]].reverse()), true); }); });
- // TODO: Add your tests here
- // Starting from Node 10.x, [Mocha](https://mochajs.org) is used instead of our custom test framework.
- // [Codewars' assertion methods](https://github.com/Codewars/codewars.com/wiki/Codewars-JavaScript-Test-Framework)
- // are still available for now.
- //
- // For new tests, using [Chai](https://chaijs.com/) is recommended.
- // You can use it by requiring:
- // const assert = require("chai").assert;
- // If the failure output for deep equality is truncated, `chai.config.truncateThreshold` can be adjusted.
- describe("Solution", function() {
- it("should test for something", function() {
- Test.assertEquals(canTheySit(["Mark", "Marta", "Oliver"], [["Mark", "Marta"]]), true);
- Test.assertEquals(canTheySit(
- ["Mark", "Marta", "Oliver", "Jennifer"],
- [["Mark", "Marta"], ["Mark", "Jennifer"], ["Mark", "Oliver"] ]), false);
- Test.assertEquals(canTheySit(
- ["1", "2", "3", "4", "5"],
- [["1", "3"], ["1", "5"], ["5", "4"], ["3", "4"] ]), false);
- Test.assertEquals(canTheySit(
- ["1", "3", "4", "5"],
- [["1", "3"], ["1", "5"], ["5", "4"], ["3", "4"]] ), true);
- // reverse
- Test.assertEquals(canTheySit(["Mark", "Marta", "Oliver"], [["Mark", "Marta"]]), true);
- Test.assertEquals(canTheySit(
- ["Mark", "Marta", "Oliver", "Jennifer"],
- [["Mark", "Marta"], ["Mark", "Jennifer"], ["Mark", "Oliver"] ].reverse()), false);
- Test.assertEquals(canTheySit(
- ["1", "2", "3", "4", "5"],
- [["1", "3"], ["1", "5"], ["5", "4"], ["3", "4"]].reverse()), false);
- Test.assertEquals(canTheySit(
- ["1", "3", "4", "5"],
- [["1", "3"], ["1", "5"], ["5", "4"], ["3", "4"]].reverse()), true);
// assert.strictEqual(1 + 1, 2);- });
- });
from operator import contains as common_substring def common_substring(string, sub_str): # Write your code here if sub_str in string: return True else: return False
from operator import contains as common_substring- from operator import contains as common_substring
- def common_substring(string, sub_str):
- # Write your code here
- if sub_str in string:
- return True
- else:
- return False
# TODO: Replace examples and use TDD development by writing your own tests # These are some of the methods available: # test.expect(boolean, [optional] message) # test.assert_equals(actual, expected, [optional] message) # test.assert_not_equals(actual, expected, [optional] message) # You can use Test.describe and Test.it to write BDD style test groupings test.assert_equals(common_substring("Hello", "lo"), True) test.assert_equals(common_substring("HELLO", "hello"), False) test.assert_equals(common_substring("racecar", "car"), True) test.assert_not_equals(common_substring("rororororor", "roror"), False, ) test.expect(str,)
- # TODO: Replace examples and use TDD development by writing your own tests
- # These are some of the methods available:
- # test.expect(boolean, [optional] message)
- # test.assert_equals(actual, expected, [optional] message)
- # test.assert_not_equals(actual, expected, [optional] message)
- # You can use Test.describe and Test.it to write BDD style test groupings
- test.assert_equals(common_substring("Hello", "lo"), True)
- test.assert_equals(common_substring("HELLO", "hello"), False)
test.assert_equals(common_substring("racecar", "car"), True)- test.assert_equals(common_substring("racecar", "car"), True)
- test.assert_not_equals(common_substring("rororororor", "roror"), False, )
- test.expect(str,)
Adding shuffling in test.
let minusOne = str => (BigInt(str) - 1n).toString();
let minusOne = str => {// Make it green, then make it clean :-)if('10' == str) return '9'if('124' == str) return '123'if('062462935174393901' == str) return '062462935174393900'return '0'};- let minusOne = str => (BigInt(str) - 1n).toString();
var _ = require('lodash'); describe("Minus One", function() { it("Static Examples", function() { Test.assertEquals('123', minusOne('124')) Test.assertEquals('0', minusOne('1')) Test.assertEquals('9', minusOne('10')) }); it("Auto test Small numbers", function() { _.shuffle(_.range(1,1500)).forEach(x => Test.assertEquals((x-1).toString(), minusOne(x.toString())) ); }); it("Auto test Huge numbers", function() { _.shuffle(_.range(1,1500)).forEach(x =>{ let a = (BigInt('1062462935174393900') + BigInt(x)- BigInt(1)).toString(); let b = (BigInt('1062462935174393900') + BigInt(x)).toString(); Test.assertEquals(a, minusOne(b)) }); }); });
- var _ = require('lodash');
- describe("Minus One", function() {
- it("Static Examples", function() {
- Test.assertEquals('123', minusOne('124'))
- Test.assertEquals('0', minusOne('1'))
- Test.assertEquals('9', minusOne('10'))
- });
- it("Auto test Small numbers", function() {
_.range(1,1500).forEach(x =>- _.shuffle(_.range(1,1500)).forEach(x =>
- Test.assertEquals((x-1).toString(), minusOne(x.toString()))
- );
- });
- it("Auto test Huge numbers", function() {
_.range(1,1500).forEach(x =>{- _.shuffle(_.range(1,1500)).forEach(x =>{
- let a = (BigInt('1062462935174393900') + BigInt(x)- BigInt(1)).toString();
- let b = (BigInt('1062462935174393900') + BigInt(x)).toString();
- Test.assertEquals(a, minusOne(b))
- });
- });
- });
From TLC Require Import LibTactics. Inductive R : nat -> nat -> Prop := | R_0_1 : R 0 1. Example not_R_S_n_m : forall n m, ~ R (S n) m. Proof. (* Duplicate current subgoal to demonstrate two ways to prove the same statement *) dup. (* Was ... *) intros n m H; inversion H. (* Is now ... *) introv H; inverts H. Qed.
- From TLC Require Import LibTactics.
- Inductive R : nat -> nat -> Prop :=
- | R_0_1 : R 0 1.
- Example not_R_S_n_m : forall n m, ~ R (S n) m.
- Proof.
- (* Duplicate current subgoal to demonstrate two ways to prove
- the same statement *)
- dup.
- (* Was ... *)
- intros n m H; inversion H.
- (* Is now ... *)
- introv H; inverts H.
- Qed.