From 48f2e7bb8c0090a9de57de5cce2234f4fe7101de Mon Sep 17 00:00:00 2001 From: kwccoin Date: Wed, 25 Dec 2019 15:50:09 +0000 Subject: [PATCH 01/26] seems not working totally see run-error-log.txt --- .DS_Store | Bin 0 -> 8196 bytes mytestleinproj/.DS_Store | Bin 0 -> 6148 bytes mytestleinproj/clojure-noob/.gitignore | 12 + mytestleinproj/clojure-noob/CHANGELOG.md | 24 ++ mytestleinproj/clojure-noob/LICENSE | 277 ++++++++++++++++++ mytestleinproj/clojure-noob/README.md | 44 +++ mytestleinproj/clojure-noob/doc/intro.md | 3 + mytestleinproj/clojure-noob/project.clj | 9 + .../clojure-noob/src/clojure_noob/core.clj | 29 ++ .../test/clojure_noob/core_test.clj | 7 + run-error-log.txt | 93 ++++++ 11 files changed, 498 insertions(+) create mode 100644 .DS_Store create mode 100644 mytestleinproj/.DS_Store create mode 100644 mytestleinproj/clojure-noob/.gitignore create mode 100644 mytestleinproj/clojure-noob/CHANGELOG.md create mode 100644 mytestleinproj/clojure-noob/LICENSE create mode 100644 mytestleinproj/clojure-noob/README.md create mode 100644 mytestleinproj/clojure-noob/doc/intro.md create mode 100644 mytestleinproj/clojure-noob/project.clj create mode 100644 mytestleinproj/clojure-noob/src/clojure_noob/core.clj create mode 100644 mytestleinproj/clojure-noob/test/clojure_noob/core_test.clj create mode 100644 run-error-log.txt diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fe7d9e40e36f743a80a94057092a7cf58615ffa2 GIT binary patch literal 8196 zcmeHMPiqrF6o1pCHlbQ`5ZmK|2p&pE1PvlWnkHz#f4HItm3H%oW@VENNouGul8Ya} zn_dM4@!(g`TTfo4;N1`42hiXA$#y5%L~n|nDLcQ(y!YnK`|X?Aoh=cu!fq`~v_?b; zTpUx&s3HoN^J}UssGc)G27B^$vUb&Pwx={rhhe}lU>GnA7zPXj{|Wurc50%m^4Sf zrS$R&M-rtuF?IN0$}>|Z6ehf5d`qYk%S$x1VZbmj%>X~U$027+hAywomA4zAZv%4iF2b)%HL8=Nd1fEW7&#=J;ak&)^d8dC{cpno zC88*i?#`-MdiiD~NNCdbnF% z)E>~K7PY~jPmd>T-%ms~*S6B{wiW05mA2=0dzs8vwh)Ui9$QKz@pmHe$Zq(3yXW+F zy9KB7fd9Jf^coe_zU%v5&~_^K+SBMXVsfQ7r zl)r=eHCl6H*6(rQ5H_09Fs^bhmlPi^!p`NRX7>*I;tX?cE&=P2i5 zd7KZ(jw-SwjoORMj&Noz(;ejC1{LWBFpV`Cv0B(F#t&P?kcXYgH6^sdD^_Xgd@uDe zmXd^-MelfD3#5k}PD^#R#G6Nayh8L9!Ct^RJg-1cpBcS@ULcz>w~#z?c7Z%%ei+^q z!+>BQCV5!n=l{~|@BfA^!+>GnKW2c%i*~Vq0LQO0ld+zZq(8o1bdu|;30)Xu%U>sZsWmQVWmB&=x#QcEt{Q?Yz&&F>|f~3 z{u{j&`U6U#|D}Cz<|#^=fEN*+7v6ktXTCSH^M#q&0RZ9kqbfiN0339}!U7imF={6t zvl*_LM-;k`K6If8Zy*IV#ZlW4tqC(`*2C<30 z_E#H5Q}V(=ufusi!cG$RvP$Kbn3*liy_k23_JPalG;6>_|% zRB{ss;m5c+I4Ui_S7{c+X|t=7elXY`|N!9W%Ttz&j^*U=qo9fR$zpu8Z^P_w5JFVOAa*16}e(zJin$iqNBD|5DRIxCU)$6|f52RbbXUmgxN7nSB4hn`ED?0#<=1 zrGO~Z{kn%!;8^kZ}~;^hW)3Ko1E>wu2p*XY`?O;Uj9GUf)c2F-p5Xc=r_ J6?jku{sBuqi^c!| literal 0 HcmV?d00001 diff --git a/mytestleinproj/clojure-noob/.gitignore b/mytestleinproj/clojure-noob/.gitignore new file mode 100644 index 0000000..d18f225 --- /dev/null +++ b/mytestleinproj/clojure-noob/.gitignore @@ -0,0 +1,12 @@ +/target +/classes +/checkouts +profiles.clj +pom.xml +pom.xml.asc +*.jar +*.class +/.lein-* +/.nrepl-port +.hgignore +.hg/ diff --git a/mytestleinproj/clojure-noob/CHANGELOG.md b/mytestleinproj/clojure-noob/CHANGELOG.md new file mode 100644 index 0000000..15fdaf9 --- /dev/null +++ b/mytestleinproj/clojure-noob/CHANGELOG.md @@ -0,0 +1,24 @@ +# Change Log +All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/). + +## [Unreleased] +### Changed +- Add a new arity to `make-widget-async` to provide a different widget shape. + +## [0.1.1] - 2019-12-25 +### Changed +- Documentation on how to make the widgets. + +### Removed +- `make-widget-sync` - we're all async, all the time. + +### Fixed +- Fixed widget maker to keep working when daylight savings switches over. + +## 0.1.0 - 2019-12-25 +### Added +- Files from the new template. +- Widget maker public API - `make-widget-sync`. + +[Unreleased]: https://github.com/your-name/clojure-noob/compare/0.1.1...HEAD +[0.1.1]: https://github.com/your-name/clojure-noob/compare/0.1.0...0.1.1 diff --git a/mytestleinproj/clojure-noob/LICENSE b/mytestleinproj/clojure-noob/LICENSE new file mode 100644 index 0000000..d3087e4 --- /dev/null +++ b/mytestleinproj/clojure-noob/LICENSE @@ -0,0 +1,277 @@ +Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. diff --git a/mytestleinproj/clojure-noob/README.md b/mytestleinproj/clojure-noob/README.md new file mode 100644 index 0000000..cbbb21f --- /dev/null +++ b/mytestleinproj/clojure-noob/README.md @@ -0,0 +1,44 @@ +# clojure-noob + +FIXME: description + +## Installation + +Download from http://example.com/FIXME. + +## Usage + +FIXME: explanation + + $ java -jar clojure-noob-0.1.0-standalone.jar [args] + +## Options + +FIXME: listing of options this app accepts. + +## Examples + +... + +### Bugs + +... + +### Any Other Sections +### That You Think +### Might be Useful + +## License + +Copyright © 2019 FIXME + +This program and the accompanying materials are made available under the +terms of the Eclipse Public License 2.0 which is available at +http://www.eclipse.org/legal/epl-2.0. + +This Source Code may also be made available under the following Secondary +Licenses when the conditions for such availability set forth in the Eclipse +Public License, v. 2.0 are satisfied: GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or (at your +option) any later version, with the GNU Classpath Exception which is available +at https://www.gnu.org/software/classpath/license.html. diff --git a/mytestleinproj/clojure-noob/doc/intro.md b/mytestleinproj/clojure-noob/doc/intro.md new file mode 100644 index 0000000..14473d9 --- /dev/null +++ b/mytestleinproj/clojure-noob/doc/intro.md @@ -0,0 +1,3 @@ +# Introduction to clojure-noob + +TODO: write [great documentation](http://jacobian.org/writing/what-to-write/) diff --git a/mytestleinproj/clojure-noob/project.clj b/mytestleinproj/clojure-noob/project.clj new file mode 100644 index 0000000..c0aba5a --- /dev/null +++ b/mytestleinproj/clojure-noob/project.clj @@ -0,0 +1,9 @@ +(defproject clojure-noob "0.1.0-SNAPSHOT" + :description "FIXME: write description" + :url "http://example.com/FIXME" + :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0" + :url "https://www.eclipse.org/legal/epl-2.0/"} + :dependencies [[org.clojure/clojure "1.10.0"]] + :main ^:skip-aot clojure-noob.core + :target-path "target/%s" + :profiles {:uberjar {:aot :all}}) diff --git a/mytestleinproj/clojure-noob/src/clojure_noob/core.clj b/mytestleinproj/clojure-noob/src/clojure_noob/core.clj new file mode 100644 index 0000000..ab5a902 --- /dev/null +++ b/mytestleinproj/clojure-noob/src/clojure_noob/core.clj @@ -0,0 +1,29 @@ +; jdk and clojure +; =============== +; brew cask install adoptopenjdk +; brew install clojure + +; lein +; ==== +; https://www.hildeberto.com/2015/07/installing-leiningen-on-mac-os.html +; but need to run +; export PATH=$PATH:/Applications/clojure +; as ~/.bash_profle not work, is it the mac z shell thing??? + +; https://www.braveclojure.com/getting-started/ + +; you have to be in a directory with project.clj + +; trying the real one +; https://github.com/kwccoin/bounty +; got error after saying 4x4 + + +(ns clojure-noob.core + (:gen-class)) + +(defn -main + "I don't do a whole lot ... yet." + [& args] + (println "Hello, World!") + (println "I am a teapot")) diff --git a/mytestleinproj/clojure-noob/test/clojure_noob/core_test.clj b/mytestleinproj/clojure-noob/test/clojure_noob/core_test.clj new file mode 100644 index 0000000..945c278 --- /dev/null +++ b/mytestleinproj/clojure-noob/test/clojure_noob/core_test.clj @@ -0,0 +1,7 @@ +(ns clojure-noob.core-test + (:require [clojure.test :refer :all] + [clojure-noob.core :refer :all])) + +(deftest a-test + (testing "FIXME, I fail." + (is (= 0 1)))) diff --git a/run-error-log.txt b/run-error-log.txt new file mode 100644 index 0000000..be0a8a6 --- /dev/null +++ b/run-error-log.txt @@ -0,0 +1,93 @@ +(base) myMac:mytestleinproj myUser$ cd clojure-noob/ +(base) myMac:clojure-noob myUser$ ls +CHANGELOG.md README.md project.clj src +LICENSE doc resources test +(base) myMac:clojure-noob myUser$ lein run +OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release. +Hello, World! +I am a teapot +(base) myMac:clojure-noob myUser$ ls +CHANGELOG.md README.md project.clj src test +LICENSE doc resources target +(base) myMac:clojure-noob myUser$ cd.. +-bash: cd..: command not found +(base) myMac:clojure-noob myUser$ ls +CHANGELOG.md README.md project.clj src test +LICENSE doc resources target +(base) myMac:clojure-noob myUser$ cd .. +(base) myMac:mytestleinproj myUser$ ls +clojure-noob +(base) myMac:mytestleinproj myUser$ cd .. +(base) myMac:bounty myUser$ ls +CHANGELOG.md README.adoc doc project.clj target +LICENSE cards.iml mytestleinproj src test +(base) myMac:bounty myUser$ lein run +OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release. +Turn: 0 +Bounty: +Player1: +Player2: +=== +Turn: 1 +Bounty: 3 +Player1: 6 +Player2: 1 +=== +Turn: 2 +Bounty: 5 +Player1: 2 +Player2: 5 +=== +Turn: 3 +Bounty: 1 +Player1: 8 +Player2: 7 +=== +Turn: 4 +Bounty: 7 +Player1: 1 +Player2: 2 +=== +Turn: 5 +Bounty: 6 +Player1: 3 +Player2: 6 +=== +Turn: 6 +Bounty: 8 +Player1: 5 +Player2: 4 +=== +Turn: 7 +Bounty: 4 +Player1: 4 +Player2: 3 +=== +Turn: 8 +Bounty: 2 +Player1: 7 +Player2: 8 +=== +4 V 4 +TieException in thread "main" Syntax error compiling at (/private/var/folders/q4/n4sdb9vx2d5429s9dkq2q0ww0000gn/T/form-init11767669843428243374.clj:1:126). + at clojure.lang.Compiler.load(Compiler.java:7647) + at clojure.lang.Compiler.loadFile(Compiler.java:7573) + at clojure.main$load_script.invokeStatic(main.clj:452) + at clojure.main$init_opt.invokeStatic(main.clj:454) + at clojure.main$init_opt.invoke(main.clj:454) + at clojure.main$initialize.invokeStatic(main.clj:485) + at clojure.main$null_opt.invokeStatic(main.clj:519) + at clojure.main$null_opt.invoke(main.clj:516) + at clojure.main$main.invokeStatic(main.clj:598) + at clojure.main$main.doInvoke(main.clj:561) + at clojure.lang.RestFn.applyTo(RestFn.java:137) + at clojure.lang.Var.applyTo(Var.java:705) + at clojure.main.main(main.java:37) +Caused by: java.lang.Exception: Cannot find anything to run for: cards.core + at user$eval140.invokeStatic(form-init11767669843428243374.clj:1) + at user$eval140.invoke(form-init11767669843428243374.clj:1) + at clojure.lang.Compiler.eval(Compiler.java:7176) + at clojure.lang.Compiler.eval(Compiler.java:7166) + at clojure.lang.Compiler.load(Compiler.java:7635) + ... 12 more +(base) myMac:bounty myUser$ From 7adfa196dc570092553d974488ab82e31ec70410 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Wed, 25 Dec 2019 17:27:19 +0000 Subject: [PATCH 02/26] seems work --- .DS_Store | Bin 8196 -> 10244 bytes myJS/card0-impertive.js | 59 ++++++++++++++++++ .../clojure-noob/src/clojure_noob/core.clj | 3 + 3 files changed, 62 insertions(+) create mode 100644 myJS/card0-impertive.js diff --git a/.DS_Store b/.DS_Store index fe7d9e40e36f743a80a94057092a7cf58615ffa2..ebcb455ecbab2e50a6c8c3505a0d878682c3ad1e 100644 GIT binary patch literal 10244 zcmeHMTWl0%6h3EL+8sNz({d>+MV3_VO=-EbTtv55XerXLEp4G%c6X-j!0b-lncV`l zq!`hdka!D5jR^)X0ZjxI;u9noHN*#$*o1%}KA_PTUNF3vi07Y~U1qiyeF75aPiD^S zf6n>O`M>%8+bjTJZ9=RB@B@ICE+z$@ZsQcDXV;kGv1-amBKd>TR~d|`(Sb3RZiS10 zi-3!Oi-3!Oi@?Kz0Ik`qc=Jr@-dzM-1Y88t2(bCVPZyH`OOBY*m^$cY905pXQ?*g( zSzr$&{gw<^a>SIRp@OC>Nz)arBLr`8!8E?zNX+x(-dJ^FYSj`*HkEItPj2tk}O(2Pu?pfo9J z#OftYBzT*w7T+}ra{wOdU=!59Q?L;lpar&)EQctFPCrj5!!L_ss1R{l!TRy799RIo z834w7l!b00KA(3xM(7Rv9QPD|FA z_<2r+2NYS;D=My{Co6kOPOg`GB#)oUZ))1q%(ryP5j7T+_e(uOf!41MHqp=4xRjKo z!H$TkB%(2`M<|Shlt@Ae=~9iNFk`AK&?0eFQCd|^)@3!;)u~H+^;AO+Rp$;(jq7zr zV?Bb9(4=h=wIwH|dTNoHDq_*L4zOml?NVGLSsJLI?oi=A$uBOMzhLR|RcoK98!ZqD zi>6KI`5m$-#dNt>mg4P$vZ(iWg|vti6XjT6M^e`0up+g^LQ$y@4|AO1HEXud*O>^* z&n9GjpHS-c8ntsD_3_;zWwAvSS!<$j#>uW;cR7P}>+>01Y+7=^d8YUI3KOj9F@lE{^sC;^lP7MqVozd3=e z<8xsltf3u48}t(E55i$M3a8;LoP+P+NB9|T!Y#N1f5G2y7Xdje!s$2zXW~38!*X1X z6}T4H;dj#y*sBH|{|l6PU!kcmQ9*SMW7_9pAur@k2b0C-7tZ0#D-^ z{1U&#@9_t`gg@am{1tEEZT!>B(_?KQfbrH=@DBa3^LW7G@sY`RyyT(h@s)g&yfbDN z`xh)NU%6&OZTjVBylMv{?G!YaXVS``T#8c0J0B&A&ncP9&r6Mf%#qPfB$f7h8PkN^ z(K)`^v*wqS@`9JR#u?81qLL*XjQ{}+?Xr?Zyx<|4vxfPKk`)}0UdS?ZtN1Ejm_j7C zwCniCIT`>$wwc9~e2tfQF65ZL^?W18hN1uy5_VF$UV^Le2i!pq=HgVMsgEeSnCMxB z0c<3CHsfa8g4+#(?!<1CuowG@ri`RX93+w+#OLt^JVaD|)gbB-d=ro2dw2}rC(3?` zC-F1$usdS`IYIXJ#dA{M@StW5 zIJl4+aF^2yhnMqC^*$Y>bt0&T^n_L$itl89-c7mpYqc~iTP&_oWqPnWgUs*j|<{w&HT~X$*UR^Of z%z29!RBmY672UUg=(*toZ&ClKU}{1sFn_1-Z`0GHeReFQjmOypHL1P*J<}Gf_ZRa$ z{)>-&Q!tXa@gIB~d}tnF9hx*o21oKzd?0p2h$ZE8SH@+BeS47y+h`+F1NAg9H;_+g zye$(JQ!aL|EaG82b7N&#*_mfqIq-(uL2Ap=IFU_nAJbYphM8IiTIR+ohkDI6mVJak z#-=*!07Z4^?Xho+zWm~K^9^O#+{<7h8)qJV3Pa18HBy};6AzKjj!)Xoi4YvKw_(qd z>QkHWv~R{NGe+;s&pM`4LvC>qa1nSA2xOT-{p|aH!^HppKZw-am@Wb?0{004%&rgC z*HW<5PBt^HhbsJZ?V^hnW;bF=!-a0lgw-3Ly VCwU+L3~fdJU5xGuS)^ l32q?m3UcJe#P7_L`Befr7$Ht)m>kbDV=}9BG*JCYCIC8QHGKd8 diff --git a/myJS/card0-impertive.js b/myJS/card0-impertive.js new file mode 100644 index 0000000..b223f2e --- /dev/null +++ b/myJS/card0-impertive.js @@ -0,0 +1,59 @@ +// node card0-impertive.js + +function runGame() { + let turn = 0; + let bountyCards = [1, 2, 3, 4, 5, 6, 7, 8]; + let playerCards = [[1, 2, 3, 4, 5, 6, 7, 8], + [1, 2, 3, 4, 5, 6, 7, 8]]; + let playerScores = [0, 0]; + + while (bountyCards.length > 0) { + + const bountyCard = popRandom(bountyCards); + console.log(`Turn ${turn}: Bound: ${bountyCard}`); + const card0 = playRandomStrategy(playerCards[0], bountyCard); + const card1 = playEqualStrategy(playerCards[1], bountyCard); + turn +=1; + + if (card0 > card1) { + playerScores[0] += bountyCard; + } else if (card1 > card0){ + playerScores[1] += bountyCard; + } else { + console.log(`\ncard0 is ${card0}`); + console.log(`card1 is ${card1}`); + console.log("ERROR - not cover equal case??!!\n") + } + } + + console.log(`Scores: ${playerScores[0]} v ${playerScores[1]}`); + + if (playerScores[0] == playerScores[1]) { + console.log("PLayer Tie.") + } else if (playerScores[0] > playerScores[1]) { + console.log("PLayer 0 Wins!") + } else { + console.log("PLayer 1 Wins!") + } +} + +runGame(); + +function popRandom(arr){ + const index = Math.floor(Math.random() * arr.length); + const value = arr[index]; + arr.splice(index, 1); + return value; +} + +function playRandomStrategy(playerCards, bountyCard){ + const card = popRandom(playerCards); + console.log(`\tPlayer 0 plays: ${card}`); + return card; +} + +function playEqualStrategy(playerCards, bountyCard){ + playerCards.splice(playerCards.indexOf(bountyCard),1); + console.log(`\tPlayer 1 plays: ${bountyCard}`); + return bountyCard; +} \ No newline at end of file diff --git a/mytestleinproj/clojure-noob/src/clojure_noob/core.clj b/mytestleinproj/clojure-noob/src/clojure_noob/core.clj index ab5a902..ea1f39b 100644 --- a/mytestleinproj/clojure-noob/src/clojure_noob/core.clj +++ b/mytestleinproj/clojure-noob/src/clojure_noob/core.clj @@ -1,5 +1,8 @@ ; jdk and clojure ; =============== + +; https://clojure.org/guides/getting_started#_clojure_installer_and_cli_tools + ; brew cask install adoptopenjdk ; brew install clojure From 601cfb642bd276b951377c42620ffce432cd9f16 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Wed, 25 Dec 2019 17:58:42 +0000 Subject: [PATCH 03/26] add also the oo js --- ...{card0-impertive.js => cardA-impertive.js} | 0 myJS/cardB-OO.js | 104 ++++++++++++++++++ 2 files changed, 104 insertions(+) rename myJS/{card0-impertive.js => cardA-impertive.js} (100%) create mode 100644 myJS/cardB-OO.js diff --git a/myJS/card0-impertive.js b/myJS/cardA-impertive.js similarity index 100% rename from myJS/card0-impertive.js rename to myJS/cardA-impertive.js diff --git a/myJS/cardB-OO.js b/myJS/cardB-OO.js new file mode 100644 index 0000000..64ec14f --- /dev/null +++ b/myJS/cardB-OO.js @@ -0,0 +1,104 @@ +// node cardB-OO.js + +class Deck { + constructor() { + this.cards = [1, 2, 3, 4, 5, 6, 7, 8]; + } + + popRandom(){ + const index = Math.floor(Math.random() * this.cards.length); + const value = this.cards[index]; + this.cards.splice(index, 1); + return value; + } + + remove(cardValue){ + this.cards.splice(this.cards.indexOf(cardValue), 1); + } + + hasCards() { + return this.cards.length > 0; + } +} + +class Player{ + constructor() { + this.cards = new Deck(); + this.score = 0; + } + + scorePoint(value){ + this.score +=value; + } + + getScore() { + return this.score; + } +} + +class RandomPlayer extends Player{ + playCard(scoreCard){ + return this.cards.popRandom(); + } +} + +class EqualPlayer extends Player{ + playCard(scoreCard){ + this.cards.remove(scoreCard); + return scoreCard; + } +} + +class Game { + constructor() { + this.players =[new RandomPlayer(), new EqualPlayer()]; + this.scoreCards = new Deck(); + this.turn = 0; + } + + playTurn(){ + const scoreCard = this.scoreCards.popRandom(); + + console.log(`Turn ${this.turn}: Bounty: ${scoreCard}`); + + const card0 = this.players[0].playCard(scoreCard); + const card1 = this.players[1].playCard(scoreCard); + + console.log(`\tP0: ${card0}`); + console.log(`\tP1: ${card1}`); + + if (card0 > card1) { + this.players[0].scorePoint(scoreCard) + } else if (card1 > card0){ + this.players[1].scorePoint(scoreCard) + } else { + console.log(`\ncard0 is ${card0}`); + console.log(`card1 is ${card1}`); + console.log("NOT SURE - not cover equal case??!!\n") + } + + this.turn += 1; + } + + playGame(){ + while (this.scoreCards.hasCards()){ + this.playTurn(); + } + + console.log(`Scores: ${this.players[0].score} v ${this.players[1].score}`) + + if (this.players[0].score == this.players[1].score){ + console.log("PLayer Tie.") + } else if (this.players[0].score > this.players[1].score) { + console.log("PLayer 0 Wins!") + } else { + console.log("PLayer 1 Wins!") + } + } +} + +// need these lines to creat the game and run it !! + +game = new Game(); +game.playGame() + From 53fcc169adbef9ef0792646146680344a79b93cc Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 12:20:03 +0000 Subject: [PATCH 04/26] trying --- myJS/cardA-impertive.js | 2 +- myJS/cardC-functional-programming.js | 59 ++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 myJS/cardC-functional-programming.js diff --git a/myJS/cardA-impertive.js b/myJS/cardA-impertive.js index b223f2e..7bab9f6 100644 --- a/myJS/cardA-impertive.js +++ b/myJS/cardA-impertive.js @@ -1,4 +1,4 @@ -// node card0-impertive.js +// node cardA-impertive.js function runGame() { let turn = 0; diff --git a/myJS/cardC-functional-programming.js b/myJS/cardC-functional-programming.js new file mode 100644 index 0000000..b223f2e --- /dev/null +++ b/myJS/cardC-functional-programming.js @@ -0,0 +1,59 @@ +// node card0-impertive.js + +function runGame() { + let turn = 0; + let bountyCards = [1, 2, 3, 4, 5, 6, 7, 8]; + let playerCards = [[1, 2, 3, 4, 5, 6, 7, 8], + [1, 2, 3, 4, 5, 6, 7, 8]]; + let playerScores = [0, 0]; + + while (bountyCards.length > 0) { + + const bountyCard = popRandom(bountyCards); + console.log(`Turn ${turn}: Bound: ${bountyCard}`); + const card0 = playRandomStrategy(playerCards[0], bountyCard); + const card1 = playEqualStrategy(playerCards[1], bountyCard); + turn +=1; + + if (card0 > card1) { + playerScores[0] += bountyCard; + } else if (card1 > card0){ + playerScores[1] += bountyCard; + } else { + console.log(`\ncard0 is ${card0}`); + console.log(`card1 is ${card1}`); + console.log("ERROR - not cover equal case??!!\n") + } + } + + console.log(`Scores: ${playerScores[0]} v ${playerScores[1]}`); + + if (playerScores[0] == playerScores[1]) { + console.log("PLayer Tie.") + } else if (playerScores[0] > playerScores[1]) { + console.log("PLayer 0 Wins!") + } else { + console.log("PLayer 1 Wins!") + } +} + +runGame(); + +function popRandom(arr){ + const index = Math.floor(Math.random() * arr.length); + const value = arr[index]; + arr.splice(index, 1); + return value; +} + +function playRandomStrategy(playerCards, bountyCard){ + const card = popRandom(playerCards); + console.log(`\tPlayer 0 plays: ${card}`); + return card; +} + +function playEqualStrategy(playerCards, bountyCard){ + playerCards.splice(playerCards.indexOf(bountyCard),1); + console.log(`\tPlayer 1 plays: ${bountyCard}`); + return bountyCard; +} \ No newline at end of file From 84ec25a81ea43be5fc2ff42fc95cb5a5b9395879 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 12:43:36 +0000 Subject: [PATCH 05/26] ignore .ds_store --- .DS_Store | Bin 10244 -> 10244 bytes .gitignore | 1 + 2 files changed, 1 insertion(+) diff --git a/.DS_Store b/.DS_Store index ebcb455ecbab2e50a6c8c3505a0d878682c3ad1e..77372015fd60c0e6774a1e3154c514b859b5d6fe 100644 GIT binary patch delta 309 zcmZn(XbG6$&uFwUU^hRb(PSP0so00x85kH?81xv@88R74a`RnWl5+BsfMOgB3=Lg# zZXa|+l~2JdUyxxKoSdIq0Mr9C)nIe8z;4FLAEkw@mi-3I3=9k`40;Ud44Diix%nNESv2_Z!sY>aDp{}+yelGL^yB& diff --git a/.gitignore b/.gitignore index d18f225..c357d4b 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ pom.xml.asc /.nrepl-port .hgignore .hg/ +.DS_Store From fd0d26f336265e5a68dabab0de74fc75dc2fbaa7 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 13:04:06 +0000 Subject: [PATCH 06/26] external call --- index.js | 23 +++++++++++++++++++ myJS/cardA-impertive.js | 6 ++++- myJS/cardB-OO.js | 1 + ...unctional-programming.js => cardC-FP-0.js} | 4 +++- 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 index.js rename myJS/{cardC-functional-programming.js => cardC-FP-0.js} (98%) diff --git a/index.js b/index.js new file mode 100644 index 0000000..1efa425 --- /dev/null +++ b/index.js @@ -0,0 +1,23 @@ +// https://evdokimovm.github.io/javascript/nodejs/2016/06/13/NodeJS-How-to-Use-Functions-from-Another-File-using-module-exports.html + +console.log("\n\njust run it <===\n") +require('./myJS/cardA-impertive.js') + +console.log("\n\nstore it as variables then run it <---\n") +var oneGame = require('./myJS/cardA-impertive.js'); +oneGame(); + +console.log("\n\njust run it but now it is a Class<===\n") +require('./myJS/cardB-OO.js') + +console.log("\n\nstore it as variables then run it <---\n") +oneGame = require('./myJS/cardB-OO.js'); +new oneGame(); + +console.log("\n\njust run it but now it is a FP<===\n") +require('./myJS/cardC-FP-0.js') + +console.log("\n\nstore it as variables then run it <---\n") +oneGame = require('./myJS/cardC-FP-0.js'); +oneGame(); + diff --git a/myJS/cardA-impertive.js b/myJS/cardA-impertive.js index 7bab9f6..f4ff979 100644 --- a/myJS/cardA-impertive.js +++ b/myJS/cardA-impertive.js @@ -56,4 +56,8 @@ function playEqualStrategy(playerCards, bountyCard){ playerCards.splice(playerCards.indexOf(bountyCard),1); console.log(`\tPlayer 1 plays: ${bountyCard}`); return bountyCard; -} \ No newline at end of file +} + +module.exports = runGame; + +// see https://evdokimovm.github.io/javascript/nodejs/2016/06/13/NodeJS-How-to-Use-Functions-from-Another-File-using-module-exports.html \ No newline at end of file diff --git a/myJS/cardB-OO.js b/myJS/cardB-OO.js index 64ec14f..095d3a0 100644 --- a/myJS/cardB-OO.js +++ b/myJS/cardB-OO.js @@ -102,3 +102,4 @@ class Game { game = new Game(); game.playGame() +module.exports = Game; \ No newline at end of file diff --git a/myJS/cardC-functional-programming.js b/myJS/cardC-FP-0.js similarity index 98% rename from myJS/cardC-functional-programming.js rename to myJS/cardC-FP-0.js index b223f2e..42b3f62 100644 --- a/myJS/cardC-functional-programming.js +++ b/myJS/cardC-FP-0.js @@ -56,4 +56,6 @@ function playEqualStrategy(playerCards, bountyCard){ playerCards.splice(playerCards.indexOf(bountyCard),1); console.log(`\tPlayer 1 plays: ${bountyCard}`); return bountyCard; -} \ No newline at end of file +} + +module.exports = runGame; \ No newline at end of file From a989adb82d9354bfada9931f0990d53d9cfbebcd Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 13:12:17 +0000 Subject: [PATCH 07/26] modfied a bit --- index-runALLGame.js | 27 +++++++++++++++++++++++++++ index.js | 23 ++++------------------- 2 files changed, 31 insertions(+), 19 deletions(-) create mode 100644 index-runALLGame.js diff --git a/index-runALLGame.js b/index-runALLGame.js new file mode 100644 index 0000000..d09c415 --- /dev/null +++ b/index-runALLGame.js @@ -0,0 +1,27 @@ +// https://evdokimovm.github.io/javascript/nodejs/2016/06/13/NodeJS-How-to-Use-Functions-from-Another-File-using-module-exports.html + +function runALLGame() { + + console.log("\n\njust run it <===\n") + require('./myJS/cardA-impertive.js') + + console.log("\n\nstore it as variables then run it <---\n") + var oneGame = require('./myJS/cardA-impertive.js'); + oneGame(); + + console.log("\n\njust run it but now it is a Class<===\n") + require('./myJS/cardB-OO.js') + + console.log("\n\nstore it as variables then run it <---\n") + oneGame = require('./myJS/cardB-OO.js'); + new oneGame(); + + console.log("\n\njust run it but now it is a FP<===\n") + require('./myJS/cardC-FP-0.js') + + console.log("\n\nstore it as variables then run it <---\n") + oneGame = require('./myJS/cardC-FP-0.js'); + oneGame(); +}; + +module.exports = runALLGame; \ No newline at end of file diff --git a/index.js b/index.js index 1efa425..6523d3b 100644 --- a/index.js +++ b/index.js @@ -1,23 +1,8 @@ // https://evdokimovm.github.io/javascript/nodejs/2016/06/13/NodeJS-How-to-Use-Functions-from-Another-File-using-module-exports.html -console.log("\n\njust run it <===\n") -require('./myJS/cardA-impertive.js') +console.log("\n\njust run it but now it is ALL<===\n") +var ALLGame = require('./index-runALLGame.js') +ALLGame(); -console.log("\n\nstore it as variables then run it <---\n") -var oneGame = require('./myJS/cardA-impertive.js'); -oneGame(); - -console.log("\n\njust run it but now it is a Class<===\n") -require('./myJS/cardB-OO.js') - -console.log("\n\nstore it as variables then run it <---\n") -oneGame = require('./myJS/cardB-OO.js'); -new oneGame(); - -console.log("\n\njust run it but now it is a FP<===\n") +console.log("\n\njust run it but now it is a FP<-----------===\n") require('./myJS/cardC-FP-0.js') - -console.log("\n\nstore it as variables then run it <---\n") -oneGame = require('./myJS/cardC-FP-0.js'); -oneGame(); - From 1c2c6369735336537da512d3f6c32bbbba7fbb47 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 13:58:57 +0000 Subject: [PATCH 08/26] amed some minor mistakes --- index.js | 10 +++++----- myJS/cardA-impertive.js | 8 ++++---- myJS/cardB-OO.js | 6 +++--- myJS/cardC-FP-0.js | 11 ++++++----- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/index.js b/index.js index 6523d3b..5f120be 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,8 @@ // https://evdokimovm.github.io/javascript/nodejs/2016/06/13/NodeJS-How-to-Use-Functions-from-Another-File-using-module-exports.html -console.log("\n\njust run it but now it is ALL<===\n") -var ALLGame = require('./index-runALLGame.js') -ALLGame(); +//console.log("\n\njust run it but now it is ALL<===\n") +//var ALLGame = require('./index-runALLGame.js') +//ALLGame(); // <-- note the different syntax of the OO or new class thing -console.log("\n\njust run it but now it is a FP<-----------===\n") -require('./myJS/cardC-FP-0.js') +console.log("\n\njust run it but now it is a FP<-----------===\n"); +require('./myJS/cardC-FP-0.js'); diff --git a/myJS/cardA-impertive.js b/myJS/cardA-impertive.js index f4ff979..63bead3 100644 --- a/myJS/cardA-impertive.js +++ b/myJS/cardA-impertive.js @@ -10,7 +10,7 @@ function runGame() { while (bountyCards.length > 0) { const bountyCard = popRandom(bountyCards); - console.log(`Turn ${turn}: Bound: ${bountyCard}`); + console.log(`Turn ${turn}: Bounty: ${bountyCard}`); const card0 = playRandomStrategy(playerCards[0], bountyCard); const card1 = playEqualStrategy(playerCards[1], bountyCard); turn +=1; @@ -20,9 +20,9 @@ function runGame() { } else if (card1 > card0){ playerScores[1] += bountyCard; } else { - console.log(`\ncard0 is ${card0}`); - console.log(`card1 is ${card1}`); - console.log("ERROR - not cover equal case??!!\n") + //console.log(`\ncard0 is ${card0}`); + //console.log(`card1 is ${card1}`); + console.log("the competition card is discarded!!") } } diff --git a/myJS/cardB-OO.js b/myJS/cardB-OO.js index 095d3a0..cdef55e 100644 --- a/myJS/cardB-OO.js +++ b/myJS/cardB-OO.js @@ -72,9 +72,9 @@ class Game { } else if (card1 > card0){ this.players[1].scorePoint(scoreCard) } else { - console.log(`\ncard0 is ${card0}`); - console.log(`card1 is ${card1}`); - console.log("NOT SURE - not cover equal case??!!\n") + //console.log(`\ncard0 is ${card0}`); + //console.log(`card1 is ${card1}`); + console.log("the competition card is discarded") } this.turn += 1; diff --git a/myJS/cardC-FP-0.js b/myJS/cardC-FP-0.js index 42b3f62..d9aa945 100644 --- a/myJS/cardC-FP-0.js +++ b/myJS/cardC-FP-0.js @@ -1,4 +1,5 @@ -// node card0-impertive.js +// from node card0-impertive.js +// refactoring by stages function runGame() { let turn = 0; @@ -10,7 +11,7 @@ function runGame() { while (bountyCards.length > 0) { const bountyCard = popRandom(bountyCards); - console.log(`Turn ${turn}: Bound: ${bountyCard}`); + console.log(`Turn ${turn}: Bounty: ${bountyCard}`); const card0 = playRandomStrategy(playerCards[0], bountyCard); const card1 = playEqualStrategy(playerCards[1], bountyCard); turn +=1; @@ -20,9 +21,9 @@ function runGame() { } else if (card1 > card0){ playerScores[1] += bountyCard; } else { - console.log(`\ncard0 is ${card0}`); - console.log(`card1 is ${card1}`); - console.log("ERROR - not cover equal case??!!\n") + //console.log(`\ncard0 is ${card0}`); + //console.log(`card1 is ${card1}`); + console.log("the competition card is discarded") } } From e635ee3c3d144a588cb65e4a52879ced7eddf7fc Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 14:59:36 +0000 Subject: [PATCH 09/26] stage a and b --- myJS/cardC-FP-0.js | 2 ++ myJS/cardC-FP-1.js | 78 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 myJS/cardC-FP-1.js diff --git a/myJS/cardC-FP-0.js b/myJS/cardC-FP-0.js index d9aa945..e6f831f 100644 --- a/myJS/cardC-FP-0.js +++ b/myJS/cardC-FP-0.js @@ -1,6 +1,8 @@ // from node card0-impertive.js // refactoring by stages +// adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel + function runGame() { let turn = 0; let bountyCards = [1, 2, 3, 4, 5, 6, 7, 8]; diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js new file mode 100644 index 0000000..d2018db --- /dev/null +++ b/myJS/cardC-FP-1.js @@ -0,0 +1,78 @@ +// from node card0-impertive.js +// refactoring by stages +// - stage a : just move logging so no mutation in the fuction +// - stage b : avoid play Random using in place mutation array splice + +// adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel + +function runGame() { + let turn = 0; + let bountyCards = [1, 2, 3, 4, 5, 6, 7, 8]; + let playerCards = [[1, 2, 3, 4, 5, 6, 7, 8], + [1, 2, 3, 4, 5, 6, 7, 8]]; + let playerScores = [0, 0]; + + while (bountyCards.length > 0) { + + const bountyCard = selectRandom(bountyCards); // stage b - popRandom(bountyCards); + bountyCards = without(bountyCards, bountyCard) // stage b - + + console.log(`Turn ${turn}: Bounty: ${bountyCard}`); + const card0 = playRandomStrategy(playerCards[0], bountyCard); + const card1 = playEqualStrategy(playerCards[1], bountyCard); + palyCards[0] = without(playCards, card0); // stage b + turn +=1; + + console.log(`\tPlayer 0 plays: ${card0}`); // stage-a + console.log(`\tPlayer 1 plays: ${card1}`); // stage-a + // ; see wiki best strategy against random play + + if (card0 > card1) { + playerScores[0] += bountyCard; + } else if (card1 > card0){ + playerScores[1] += bountyCard; + } else { + //console.log(`\ncard0 is ${card0}`); + //console.log(`card1 is ${card1}`); + console.log("the competition card is discarded") + } + } + + console.log(`Scores: ${playerScores[0]} v ${playerScores[1]}`); + + if (playerScores[0] == playerScores[1]) { + console.log("PLayer Tie.") + } else if (playerScores[0] > playerScores[1]) { + console.log("PLayer 0 Wins!") + } else { + console.log("PLayer 1 Wins!") + } +} + +runGame(); + +function popRandom(arr){ + const index = Math.floor(Math.random() * arr.length); + const value = arr[index]; + arr.splice(index, 1); + return value; +} + +function playRandomStrategy(playerCards, bountyCard){ + const card = popRandom(playerCards); + // stage a- console.log(`\tPlayer 0 plays: ${card}`); + return card; +} + +function playEqualStrategy(playerCards, bountyCard){ + playerCards.splice(playerCards.indexOf(bountyCard),1); + // stage a- console.log(`\tPlayer 1 plays: ${bountyCard}`); + return bountyCard; +} + +function without(arr, value){ //stage b + const index = arr.indexOf(value); //stage b + return [...arr.slice(0, index), ...arr.slice(index+1)]; //stage b +} + +module.exports = runGame; \ No newline at end of file From b19a09ff55d4bcfc40e67cd6338cb13de86d0de7 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 15:34:09 +0000 Subject: [PATCH 10/26] need to fix some error during stage b --- index.js | 2 +- myJS/cardC-FP-1.js | 29 +++++++++++++++++------------ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/index.js b/index.js index 5f120be..8959dd8 100644 --- a/index.js +++ b/index.js @@ -5,4 +5,4 @@ //ALLGame(); // <-- note the different syntax of the OO or new class thing console.log("\n\njust run it but now it is a FP<-----------===\n"); -require('./myJS/cardC-FP-0.js'); +require('./myJS/cardC-FP-1.js'); diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index d2018db..4455fff 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -1,7 +1,8 @@ // from node card0-impertive.js // refactoring by stages -// - stage a : just move logging so no mutation in the fuction -// - stage b : avoid play Random using in place mutation array splice +// - stage a : (try to remove mutation) just move logging so no mutation in the fuction +// - stage b : (make popRandom () pure) avoid play Random using in place mutation array splice +// - stage c : (make payEqual () pure) // adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel @@ -20,11 +21,12 @@ function runGame() { console.log(`Turn ${turn}: Bounty: ${bountyCard}`); const card0 = playRandomStrategy(playerCards[0], bountyCard); const card1 = playEqualStrategy(playerCards[1], bountyCard); - palyCards[0] = without(playCards, card0); // stage b + playerCards[0] = without(playerCards[0], card0); // stage b + turn +=1; - console.log(`\tPlayer 0 plays: ${card0}`); // stage-a - console.log(`\tPlayer 1 plays: ${card1}`); // stage-a + console.log(`\tPlayer 0 plays: ${card0}`); // stage - a + console.log(`\tPlayer 1 plays: ${card1}`); // stage - a // ; see wiki best strategy against random play if (card0 > card1) { @@ -51,27 +53,30 @@ function runGame() { runGame(); -function popRandom(arr){ +function selectRandom(arr){ // stage b - popRandom(arr){ const index = Math.floor(Math.random() * arr.length); - const value = arr[index]; - arr.splice(index, 1); - return value; + return arr[index]; + // stage b - const value = arr[index]; + // stage b - arr.splice(index, 1); + // stage b - return value; } function playRandomStrategy(playerCards, bountyCard){ - const card = popRandom(playerCards); - // stage a- console.log(`\tPlayer 0 plays: ${card}`); + const card = selectRandom(playerCards); // stage b - popRandom(playerCards); + // stage a - console.log(`\tPlayer 0 plays: ${card}`); return card; } function playEqualStrategy(playerCards, bountyCard){ playerCards.splice(playerCards.indexOf(bountyCard),1); - // stage a- console.log(`\tPlayer 1 plays: ${bountyCard}`); + // stage a - console.log(`\tPlayer 1 plays: ${bountyCard}`); return bountyCard; } function without(arr, value){ //stage b const index = arr.indexOf(value); //stage b + // debug during stage b : x = + // debug during stage b : console.log(` ===> not sure what is this: ${x} `) return [...arr.slice(0, index), ...arr.slice(index+1)]; //stage b } From 74312b61aecec0e21f60d2d81ecd4b83f1da2cb7 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 15:34:38 +0000 Subject: [PATCH 11/26] stage a-b --- myJS/cardC-FP-1.js | 1 - 1 file changed, 1 deletion(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index 4455fff..8094bb7 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -2,7 +2,6 @@ // refactoring by stages // - stage a : (try to remove mutation) just move logging so no mutation in the fuction // - stage b : (make popRandom () pure) avoid play Random using in place mutation array splice -// - stage c : (make payEqual () pure) // adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel From d8d12140f361fb2223320f4fa4fcb3b77e72003e Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 15:37:46 +0000 Subject: [PATCH 12/26] stage c --- myJS/cardC-FP-1.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index 8094bb7..685a69d 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -2,6 +2,7 @@ // refactoring by stages // - stage a : (try to remove mutation) just move logging so no mutation in the fuction // - stage b : (make popRandom () pure) avoid play Random using in place mutation array splice +// - stage c : (make payEqual () pure) // adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel @@ -21,6 +22,7 @@ function runGame() { const card0 = playRandomStrategy(playerCards[0], bountyCard); const card1 = playEqualStrategy(playerCards[1], bountyCard); playerCards[0] = without(playerCards[0], card0); // stage b + playerCards[1] = without(playerCards[1], card1); // stage c turn +=1; @@ -67,7 +69,7 @@ function playRandomStrategy(playerCards, bountyCard){ } function playEqualStrategy(playerCards, bountyCard){ - playerCards.splice(playerCards.indexOf(bountyCard),1); + // stage c - playerCards.splice(playerCards.indexOf(bountyCard),1); // stage a - console.log(`\tPlayer 1 plays: ${bountyCard}`); return bountyCard; } From fbcade01f15aad7d15c48bf9fa50428fa6dfc606 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 15:44:09 +0000 Subject: [PATCH 13/26] stage d --- myJS/cardC-FP-1.js | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index 685a69d..be36579 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -3,6 +3,7 @@ // - stage a : (try to remove mutation) just move logging so no mutation in the fuction // - stage b : (make popRandom () pure) avoid play Random using in place mutation array splice // - stage c : (make payEqual () pure) +// - stage d : (extract winMessage) try to avoid logic in display message // adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel @@ -43,17 +44,29 @@ function runGame() { console.log(`Scores: ${playerScores[0]} v ${playerScores[1]}`); + console.log(winMessage(playerScores)); + + // stage d - if (playerScores[0] == playerScores[1]) { + // stage d - console.log("PLayer Tie.") + // stage d - } else if (playerScores[0] > playerScores[1]) { + // stage d - console.log("PLayer 0 Wins!") + // stage d - } else { + // stage d - console.log("PLayer 1 Wins!") + // stage d - } +} + +runGame(); + +function winMessage(playerScores) { if (playerScores[0] == playerScores[1]) { - console.log("PLayer Tie.") + return "PLayer Tie."; } else if (playerScores[0] > playerScores[1]) { - console.log("PLayer 0 Wins!") + return "PLayer 0 Wins!"; } else { - console.log("PLayer 1 Wins!") + return "PLayer 1 Wins!"; } } -runGame(); - function selectRandom(arr){ // stage b - popRandom(arr){ const index = Math.floor(Math.random() * arr.length); return arr[index]; From 9d11d329f3f931a8a65098ab47539f5381a62931 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 15:50:37 +0000 Subject: [PATCH 14/26] stage e --- myJS/cardC-FP-1.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index be36579..a8a7869 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -4,6 +4,7 @@ // - stage b : (make popRandom () pure) avoid play Random using in place mutation array splice // - stage c : (make payEqual () pure) // - stage d : (extract winMessage) try to avoid logic in display message +// - stage e : (combine end message) // adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel @@ -42,9 +43,11 @@ function runGame() { } } - console.log(`Scores: ${playerScores[0]} v ${playerScores[1]}`); + // stage e - console.log(`Scores: ${playerScores[0]} v ${playerScores[1]}`); - console.log(winMessage(playerScores)); + // stage e = console.log(winMessage(playerScores)); + + console.log(endMessage(playerScores)); // stage d - if (playerScores[0] == playerScores[1]) { // stage d - console.log("PLayer Tie.") @@ -57,6 +60,16 @@ function runGame() { runGame(); + +function scoreMessage(playerScores){ + return `Scores: ${playerScores[0]} v ${playerScores[1]}`; +} + +function endMessage(playerScores){ + return scoreMessage(playerScores) + "\n" + + winMessage(playerScores); +} + function winMessage(playerScores) { if (playerScores[0] == playerScores[1]) { return "PLayer Tie."; From cec84eadbadc145f0c52b338027be9860caf298a Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 15:56:10 +0000 Subject: [PATCH 15/26] stage f --- myJS/cardC-FP-1.js | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index a8a7869..2582476 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -5,37 +5,38 @@ // - stage c : (make payEqual () pure) // - stage d : (extract winMessage) try to avoid logic in display message // - stage e : (combine end message) +// - stage f : (combine sate vars into one) // adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel function runGame() { - let turn = 0; - let bountyCards = [1, 2, 3, 4, 5, 6, 7, 8]; - let playerCards = [[1, 2, 3, 4, 5, 6, 7, 8], - [1, 2, 3, 4, 5, 6, 7, 8]]; - let playerScores = [0, 0]; + let state = { turn : 0, + bountyCards : [1, 2, 3, 4, 5, 6, 7, 8], + playerCards : [[1, 2, 3, 4, 5, 6, 7, 8], + [1, 2, 3, 4, 5, 6, 7, 8]], + playerScores : [0, 0]} // stage f and many below to use state. !!! - while (bountyCards.length > 0) { + while (state.bountyCards.length > 0) { - const bountyCard = selectRandom(bountyCards); // stage b - popRandom(bountyCards); - bountyCards = without(bountyCards, bountyCard) // stage b - + const bountyCard = selectRandom(state.bountyCards); // stage b - popRandom(bountyCards); + state.bountyCards = without(state.bountyCards, bountyCard) // stage b - - console.log(`Turn ${turn}: Bounty: ${bountyCard}`); - const card0 = playRandomStrategy(playerCards[0], bountyCard); - const card1 = playEqualStrategy(playerCards[1], bountyCard); - playerCards[0] = without(playerCards[0], card0); // stage b - playerCards[1] = without(playerCards[1], card1); // stage c + console.log(`Turn ${state.turn}: Bounty: ${bountyCard}`); + const card0 = playRandomStrategy(state.playerCards[0], bountyCard); + const card1 = playEqualStrategy(state.playerCards[1], bountyCard); + state.playerCards[0] = without(state.playerCards[0], card0); // stage b + state.playerCards[1] = without(state.playerCards[1], card1); // stage c - turn +=1; + state.turn +=1; console.log(`\tPlayer 0 plays: ${card0}`); // stage - a console.log(`\tPlayer 1 plays: ${card1}`); // stage - a // ; see wiki best strategy against random play if (card0 > card1) { - playerScores[0] += bountyCard; + state.playerScores[0] += bountyCard; } else if (card1 > card0){ - playerScores[1] += bountyCard; + state.playerScores[1] += bountyCard; } else { //console.log(`\ncard0 is ${card0}`); //console.log(`card1 is ${card1}`); @@ -47,7 +48,7 @@ function runGame() { // stage e = console.log(winMessage(playerScores)); - console.log(endMessage(playerScores)); + console.log(endMessage(state.playerScores)); // stage d - if (playerScores[0] == playerScores[1]) { // stage d - console.log("PLayer Tie.") From c130b45560a35c12ac448cc2f0e5bbb159dc2348 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 16:50:29 +0000 Subject: [PATCH 16/26] stage g find some bugs and need full state plus the equal card play --- myJS/cardC-FP-1.js | 109 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 90 insertions(+), 19 deletions(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index 2582476..df2f571 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -6,6 +6,7 @@ // - stage d : (extract winMessage) try to avoid logic in display message // - stage e : (combine end message) // - stage f : (combine sate vars into one) +// - stage g : (creat a nextState()) basically it is generalisd to nextState( current state) // adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel @@ -14,34 +15,53 @@ function runGame() { bountyCards : [1, 2, 3, 4, 5, 6, 7, 8], playerCards : [[1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7, 8]], + lastBountyCard: 0, + lastPlayingCards : [0, 0], // need this to avoid cannot logging in stage g playerScores : [0, 0]} // stage f and many below to use state. !!! while (state.bountyCards.length > 0) { - const bountyCard = selectRandom(state.bountyCards); // stage b - popRandom(bountyCards); - state.bountyCards = without(state.bountyCards, bountyCard) // stage b - + console.log(`-------------------------------\n`+ + `Before Turn: ${state.turn}:`+ + `\n\tbountyCards: ${state.bountyCards}, ` + + `\n\tplayerCards: ${state.playerCards}, ` + + `\n\tlastBountyCards: ${state.lastBountyCard}, ` + + `\n\tlastPlayingCards: ${state.lastPlayingCards}, ` + + `\n\tplayerScores: ${state.playerScores}, `); - console.log(`Turn ${state.turn}: Bounty: ${bountyCard}`); - const card0 = playRandomStrategy(state.playerCards[0], bountyCard); - const card1 = playEqualStrategy(state.playerCards[1], bountyCard); - state.playerCards[0] = without(state.playerCards[0], card0); // stage b - state.playerCards[1] = without(state.playerCards[1], card1); // stage c + state = nextState(state); + + // stage g - const bountyCard = selectRandom(state.bountyCards); // stage b - popRandom(bountyCards); + // stage g - state.bountyCards = without(state.bountyCards, bountyCard) // stage b - + + console.log(`After Turn: ${state.turn}:`+ + `\n\tbountyCards: ${state.bountyCards}, ` + + `\n\tplayerCards: ${state.playerCards}, ` + + `\n\tlastBountyCards: ${state.lastBountyCard}, ` + + `\n\tlastPlayingCards: ${state.lastPlayingCards}, ` + + `\n\tplayerScores: ${state.playerScores}, `+ + `\n======================================`); + + // stage g - const card0 = playRandomStrategy(state.playerCards[0], bountyCard); + // stage g - const card1 = playEqualStrategy(state.playerCards[1], bountyCard); + // stage g - state.playerCards[0] = without(state.playerCards[0], card0); // stage b + // stage g - state.playerCards[1] = without(state.playerCards[1], card1); // stage c - state.turn +=1; + // stage g - state.turn +=1; - console.log(`\tPlayer 0 plays: ${card0}`); // stage - a - console.log(`\tPlayer 1 plays: ${card1}`); // stage - a + console.log(`\tPlayer 0 plays: ${state.lastPlayingCards[0]}`)// card0}`); // stage - a + console.log(`\tPlayer 1 plays: ${state.lastPlayingCards[1]}`)// card1}`); // stage - a // ; see wiki best strategy against random play - if (card0 > card1) { - state.playerScores[0] += bountyCard; - } else if (card1 > card0){ - state.playerScores[1] += bountyCard; - } else { - //console.log(`\ncard0 is ${card0}`); - //console.log(`card1 is ${card1}`); - console.log("the competition card is discarded") - } + // stage g - if (card0 > card1) { + // stage g - state.playerScores[0] += bountyCard; + // stage g - } else if (card1 > card0){ + // stage g - state.playerScores[1] += bountyCard; + // stage g - } else { + // stage g - //console.log(`\ncard0 is ${card0}`); + // stage g - //console.log(`card1 is ${card1}`); + // stage g - console.log("the competition card is discarded") + // stage g - } } // stage e - console.log(`Scores: ${playerScores[0]} v ${playerScores[1]}`); @@ -61,6 +81,57 @@ function runGame() { runGame(); +function nextState(state) { + + const bountyCard = selectRandom(state.bountyCards); // stage b - popRandom(bountyCards); + // no need just return : state.bountyCards = without(state.bountyCards, bountyCard) // stage b - + + // remain in the main logic : console.log(`Turn ${state.turn}: Bounty: ${bountyCard}`); + const card0 = playRandomStrategy(state.playerCards[0], bountyCard); + const card1 = playEqualStrategy(state.playerCards[1], bountyCard); + // no need just return : state.playerCards[0] = without(state.playerCards[0], card0); // stage b + // no need just return : state.playerCards[1] = without(state.playerCards[1], card1); // stage c + + // no need just return : state.turn +=1; + + // remain in the main logic : console.log(`\tPlayer 0 plays: ${card0}`); // stage - a + // remain in the main logic : console.log(`\tPlayer 1 plays: ${card1}`); // stage - a + // ; see wiki best strategy against random play + + // use a new function - if (card0 > card1) { + // use a new function - state.playerScores[0] += bountyCard; + // use a new function - } else if (card1 > card0){ + // use a new function - state.playerScores[1] += bountyCard; + // use a new function - } else { + // use a new function - //console.log(`\ncard0 is ${card0}`); + // use a new function - //console.log(`card1 is ${card1}`); + // use a new function - console.log("the competition card is discarded") + // use a new function - } + + return {turn: state.turn + 1, + bountyCards: without(state.bountyCards, bountyCard), + playerCards: [without(state.playerCards[0], card0), // source has a bugs without card0 + without(state.playerCards[1], card1)], // source has a bugs without card1 + lastBountyCard: bountyCard, + lastPlayingCards : [card0, card1], + playerScores: newScore(state.playerScores, + [card0, card1], + bountyCard) // source has a bugs without bountyCard1 + } +} + +function newScore(playerScores, playerCards, bountyCard){ + if (playerCards[0] > playerCards[1]) { + return [playerScores[0]+bountyCard, playerScores[1]]; // source has a bugs not + 1 + } else if (playerCards[0] < playerCards[1]){ + return [playerScores[0] , playerScores[1]+bountyCard]; // source has a bugs not + + } else { + // no need //console.log(`\ncard0 is ${card0}`); + // no need //console.log(`card1 is ${card1}`); + // no need console.log("the competition card is discarded") + return [playerScores[0] , playerScores[1]] // actually need this as still need to return + } +} function scoreMessage(playerScores){ return `Scores: ${playerScores[0]} v ${playerScores[1]}`; From 87bf0bf0397e9c33a92ae7ee737b3f10c17d8b59 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 17:06:12 +0000 Subject: [PATCH 17/26] stage h --- myJS/cardC-FP-1.js | 49 ++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index df2f571..6ef6409 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -7,6 +7,7 @@ // - stage e : (combine end message) // - stage f : (combine sate vars into one) // - stage g : (creat a nextState()) basically it is generalisd to nextState( current state) +// - stage h : (create a turn message) // adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel @@ -21,26 +22,15 @@ function runGame() { while (state.bountyCards.length > 0) { - console.log(`-------------------------------\n`+ - `Before Turn: ${state.turn}:`+ - `\n\tbountyCards: ${state.bountyCards}, ` + - `\n\tplayerCards: ${state.playerCards}, ` + - `\n\tlastBountyCards: ${state.lastBountyCard}, ` + - `\n\tlastPlayingCards: ${state.lastPlayingCards}, ` + - `\n\tplayerScores: ${state.playerScores}, `); + console.log(turnMessage("before", state)); state = nextState(state); // stage g - const bountyCard = selectRandom(state.bountyCards); // stage b - popRandom(bountyCards); // stage g - state.bountyCards = without(state.bountyCards, bountyCard) // stage b - - console.log(`After Turn: ${state.turn}:`+ - `\n\tbountyCards: ${state.bountyCards}, ` + - `\n\tplayerCards: ${state.playerCards}, ` + - `\n\tlastBountyCards: ${state.lastBountyCard}, ` + - `\n\tlastPlayingCards: ${state.lastPlayingCards}, ` + - `\n\tplayerScores: ${state.playerScores}, `+ - `\n======================================`); + console.log(turnMessage("after", state)); + // stage g - const card0 = playRandomStrategy(state.playerCards[0], bountyCard); // stage g - const card1 = playEqualStrategy(state.playerCards[1], bountyCard); @@ -49,8 +39,8 @@ function runGame() { // stage g - state.turn +=1; - console.log(`\tPlayer 0 plays: ${state.lastPlayingCards[0]}`)// card0}`); // stage - a - console.log(`\tPlayer 1 plays: ${state.lastPlayingCards[1]}`)// card1}`); // stage - a + //console.log(`\tPlayer 0 plays: ${state.lastPlayingCards[0]}`)// card0}`); // stage - a + //console.log(`\tPlayer 1 plays: ${state.lastPlayingCards[1]}`)// card1}`); // stage - a // ; see wiki best strategy against random play // stage g - if (card0 > card1) { @@ -81,6 +71,27 @@ function runGame() { runGame(); +function turnMessage(status, state){ + if (status == 'before') { + return `-------------------------------\n`+ + status +` Turn ${state.turn}:`+ + `\n\t bountyCards: ${state.bountyCards}, ` + + `\n\t playerCards: ${state.playerCards}, ` + + `\n\t lastBountyCards: ${state.lastBountyCard}, ` + + `\n\t lastPlayingCards: ${state.lastPlayingCards}, ` + + `\n\t playerScores: ${state.playerScores}. ` + } else { + return `|||||||||||||||||||||||||||||||\n`+ + status +` Turn ${state.turn}:`+ + `\n\t bountyCards: ${state.bountyCards}, ` + + `\n\t playerCards: ${state.playerCards}, ` + + `\n\t lastBountyCards: ${state.lastBountyCard}, ` + + `\n\t lastPlayingCards: ${state.lastPlayingCards}, ` + + `\n\t playerScores: ${state.playerScores}. ` + + `\n===============================\n` + } +} + function nextState(state) { const bountyCard = selectRandom(state.bountyCards); // stage b - popRandom(bountyCards); @@ -144,11 +155,11 @@ function endMessage(playerScores){ function winMessage(playerScores) { if (playerScores[0] == playerScores[1]) { - return "PLayer Tie."; + return "PLayer Tie.\n"; } else if (playerScores[0] > playerScores[1]) { - return "PLayer 0 Wins!"; + return "PLayer 0 Wins!\n"; } else { - return "PLayer 1 Wins!"; + return "PLayer 1 Wins!\n"; } } From f14ca2f89de3a5702663b2ed69e7f659aad2e5ec Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 17:20:23 +0000 Subject: [PATCH 18/26] stage i --- myJS/cardC-FP-1.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index 6ef6409..000d41a 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -8,28 +8,30 @@ // - stage f : (combine sate vars into one) // - stage g : (creat a nextState()) basically it is generalisd to nextState( current state) // - stage h : (create a turn message) +// - stage i : (store states in an array) // adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel function runGame() { - let state = { turn : 0, + let states = [{ turn : 0, bountyCards : [1, 2, 3, 4, 5, 6, 7, 8], playerCards : [[1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7, 8]], lastBountyCard: 0, lastPlayingCards : [0, 0], // need this to avoid cannot logging in stage g - playerScores : [0, 0]} // stage f and many below to use state. !!! + playerScores : [0, 0]}] // stage f and many below to use state. !!! - while (state.bountyCards.length > 0) { + while (last(states).bountyCards.length > 0) { // some minor bugs and concat is from end - console.log(turnMessage("before", state)); - state = nextState(state); + console.log(turnMessage("before", last(states))); + + states = states.concat(nextState(last(states))) // some minor bugs and concat is from end // stage g - const bountyCard = selectRandom(state.bountyCards); // stage b - popRandom(bountyCards); // stage g - state.bountyCards = without(state.bountyCards, bountyCard) // stage b - - console.log(turnMessage("after", state)); + console.log(turnMessage("after", last(states))); // stage g - const card0 = playRandomStrategy(state.playerCards[0], bountyCard); @@ -58,7 +60,7 @@ function runGame() { // stage e = console.log(winMessage(playerScores)); - console.log(endMessage(state.playerScores)); + console.log(endMessage(last(states).playerScores)); // stage d - if (playerScores[0] == playerScores[1]) { // stage d - console.log("PLayer Tie.") @@ -71,6 +73,10 @@ function runGame() { runGame(); +function last(arr){ + return arr[arr.length - 1]; +} + function turnMessage(status, state){ if (status == 'before') { return `-------------------------------\n`+ From 375e7e79e0549f88a6810e4f57175573a267ddb7 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 17:38:52 +0000 Subject: [PATCH 19/26] tidy up a bit only --- myJS/cardC-FP-1.js | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index 000d41a..e548b57 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -79,22 +79,24 @@ function last(arr){ function turnMessage(status, state){ if (status == 'before') { - return `-------------------------------\n`+ + return `--------------------------------\n`+ status +` Turn ${state.turn}:`+ - `\n\t bountyCards: ${state.bountyCards}, ` + - `\n\t playerCards: ${state.playerCards}, ` + - `\n\t lastBountyCards: ${state.lastBountyCard}, ` + - `\n\t lastPlayingCards: ${state.lastPlayingCards}, ` + - `\n\t playerScores: ${state.playerScores}. ` + `\n\t (-- last Bounty Cards : ${state.lastBountyCard},) ` + + `\n\t (-- last Playing Cards : ${state.lastPlayingCards[0]} and ${state.lastPlayingCards[1]},) ` + + `\n\t current player Scores : ${state.playerScores[0]} and ${state.playerScores[1]}, ` + + `\n\t remaining bounty Cards : ${state.bountyCards}, ` + + `\n\t on hand player Cards : ${state.playerCards[0]} and ${state.playerCards[1]}. ` + } else { - return `|||||||||||||||||||||||||||||||\n`+ + return `||||||||||||||||||||||||||||||||\n`+ status +` Turn ${state.turn}:`+ - `\n\t bountyCards: ${state.bountyCards}, ` + - `\n\t playerCards: ${state.playerCards}, ` + - `\n\t lastBountyCards: ${state.lastBountyCard}, ` + - `\n\t lastPlayingCards: ${state.lastPlayingCards}, ` + - `\n\t playerScores: ${state.playerScores}. ` + - `\n===============================\n` + `\n\t see Bounty Cards : ${state.lastBountyCard}, ` + + `\n\t just Played Cards : ${state.lastPlayingCards[0]} and ${state.lastPlayingCards[1]}, ` + + `\n\t player Scores : ${state.playerScores[0]} and ${state.playerScores[1]}, ` + + `\n\t next round bounty Cards : ${state.bountyCards}, ` + + `\n\t next round player Cards : ${state.playerCards[0]} and ${state.playerCards[1]}. ` + + + `\n=================================\n` } } From 27c79b910a23c836e93e022b12b2db39c4fff7b5 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 17:58:23 +0000 Subject: [PATCH 20/26] stage j less info but ok --- myJS/cardC-FP-1.js | 48 +++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index e548b57..7d4f4f7 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -9,6 +9,7 @@ // - stage g : (creat a nextState()) basically it is generalisd to nextState( current state) // - stage h : (create a turn message) // - stage i : (store states in an array) +// - stage j : (split into runGame() and report()) // adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel @@ -24,14 +25,14 @@ function runGame() { while (last(states).bountyCards.length > 0) { // some minor bugs and concat is from end - console.log(turnMessage("before", last(states))); + // console.log(turnMessage("before", last(states))); states = states.concat(nextState(last(states))) // some minor bugs and concat is from end // stage g - const bountyCard = selectRandom(state.bountyCards); // stage b - popRandom(bountyCards); // stage g - state.bountyCards = without(state.bountyCards, bountyCard) // stage b - - console.log(turnMessage("after", last(states))); + // console.log(turnMessage("after", last(states))); // stage g - const card0 = playRandomStrategy(state.playerCards[0], bountyCard); @@ -60,7 +61,7 @@ function runGame() { // stage e = console.log(winMessage(playerScores)); - console.log(endMessage(last(states).playerScores)); + // console.log(endMessage(last(states).playerScores)); // stage d - if (playerScores[0] == playerScores[1]) { // stage d - console.log("PLayer Tie.") @@ -69,35 +70,46 @@ function runGame() { // stage d - } else { // stage d - console.log("PLayer 1 Wins!") // stage d - } + + return states; } -runGame(); +// runGame(); + +function report(states, onTurn, onEnd){ + return states.map(onTurn).join("\n")+"\n"+ + onEnd(last(states).playerScores) // once again minor bugs +} + +console.log(report(runGame(), turnMessage, endMessage)); + function last(arr){ return arr[arr.length - 1]; } -function turnMessage(status, state){ - if (status == 'before') { +function turnMessage(state){ //{status, state){ + // if (status == 'before') { return `--------------------------------\n`+ - status +` Turn ${state.turn}:`+ + // status + + ` Turn ${state.turn}:`+ `\n\t (-- last Bounty Cards : ${state.lastBountyCard},) ` + `\n\t (-- last Playing Cards : ${state.lastPlayingCards[0]} and ${state.lastPlayingCards[1]},) ` + `\n\t current player Scores : ${state.playerScores[0]} and ${state.playerScores[1]}, ` + `\n\t remaining bounty Cards : ${state.bountyCards}, ` + `\n\t on hand player Cards : ${state.playerCards[0]} and ${state.playerCards[1]}. ` - } else { - return `||||||||||||||||||||||||||||||||\n`+ - status +` Turn ${state.turn}:`+ - `\n\t see Bounty Cards : ${state.lastBountyCard}, ` + - `\n\t just Played Cards : ${state.lastPlayingCards[0]} and ${state.lastPlayingCards[1]}, ` + - `\n\t player Scores : ${state.playerScores[0]} and ${state.playerScores[1]}, ` + - `\n\t next round bounty Cards : ${state.bountyCards}, ` + - `\n\t next round player Cards : ${state.playerCards[0]} and ${state.playerCards[1]}. ` + - - `\n=================================\n` - } + //} // else { + // return `||||||||||||||||||||||||||||||||\n`+ + // status +` Turn ${state.turn}:`+ + // `\n\t see Bounty Cards : ${state.lastBountyCard}, ` + + // `\n\t just Played Cards : ${state.lastPlayingCards[0]} and ${state.lastPlayingCards[1]}, ` + + // `\n\t player Scores : ${state.playerScores[0]} and ${state.playerScores[1]}, ` + + // `\n\t next round bounty Cards : ${state.bountyCards}, ` + + // `\n\t next round player Cards : ${state.playerCards[0]} and ${state.playerCards[1]}. ` + + // + // `\n=================================\n` + // } } function nextState(state) { From a5711e45eafa233d237d040aa07467af01db4bca Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 18:27:57 +0000 Subject: [PATCH 21/26] stage k --- myJS/cardC-FP-1.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index 7d4f4f7..cbc6503 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -10,6 +10,7 @@ // - stage h : (create a turn message) // - stage i : (store states in an array) // - stage j : (split into runGame() and report()) +// - stage k : (using recursion instead of loop) // adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel @@ -22,12 +23,17 @@ function runGame() { lastPlayingCards : [0, 0], // need this to avoid cannot logging in stage g playerScores : [0, 0]}] // stage f and many below to use state. !!! - while (last(states).bountyCards.length > 0) { // some minor bugs and concat is from end + return recur(states, nextState, function(state){ + console.log(`state is ${state} and ${state.bountyCards}`); + return state.bountyCards.length == 0; // not > 0 + }); + + //while (last(states).bountyCards.length > 0) { // some minor bugs and concat is from end // console.log(turnMessage("before", last(states))); - states = states.concat(nextState(last(states))) // some minor bugs and concat is from end + //states = states.concat(nextState(last(states))) // some minor bugs and concat is from end // stage g - const bountyCard = selectRandom(state.bountyCards); // stage b - popRandom(bountyCards); // stage g - state.bountyCards = without(state.bountyCards, bountyCard) // stage b - @@ -55,7 +61,7 @@ function runGame() { // stage g - //console.log(`card1 is ${card1}`); // stage g - console.log("the competition card is discarded") // stage g - } - } + //} // stage e - console.log(`Scores: ${playerScores[0]} v ${playerScores[1]}`); @@ -71,11 +77,19 @@ function runGame() { // stage d - console.log("PLayer 1 Wins!") // stage d - } - return states; + // return states; } // runGame(); +function recur(states, stateChange, endCondition){ + if(endCondition(last(states))){ // missing one ) in the code + return states; + } else { + return recur(states.concat(stateChange(last(states))),stateChange, endCondition); // lastState should be last(states) and the function recur need 3 parameters + } +} + function report(states, onTurn, onEnd){ return states.map(onTurn).join("\n")+"\n"+ onEnd(last(states).playerScores) // once again minor bugs From afff98878fbbfb60e545df82e892eaac4171c684 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 19:05:19 +0000 Subject: [PATCH 22/26] tidy it up --- index-runALLGame.js | 2 - index.js | 2 - index.js.log.txt | 70 ++++++++++++++++++++++ myJS/cardC-FP-1.js | 138 +++++++------------------------------------- 4 files changed, 91 insertions(+), 121 deletions(-) create mode 100644 index.js.log.txt diff --git a/index-runALLGame.js b/index-runALLGame.js index d09c415..bab83dc 100644 --- a/index-runALLGame.js +++ b/index-runALLGame.js @@ -1,5 +1,3 @@ -// https://evdokimovm.github.io/javascript/nodejs/2016/06/13/NodeJS-How-to-Use-Functions-from-Another-File-using-module-exports.html - function runALLGame() { console.log("\n\njust run it <===\n") diff --git a/index.js b/index.js index 8959dd8..f1176fd 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,3 @@ -// https://evdokimovm.github.io/javascript/nodejs/2016/06/13/NodeJS-How-to-Use-Functions-from-Another-File-using-module-exports.html - //console.log("\n\njust run it but now it is ALL<===\n") //var ALLGame = require('./index-runALLGame.js') //ALLGame(); // <-- note the different syntax of the OO or new class thing diff --git a/index.js.log.txt b/index.js.log.txt new file mode 100644 index 0000000..132857a --- /dev/null +++ b/index.js.log.txt @@ -0,0 +1,70 @@ +node index.js + + +just run it but now it is a FP<-----------=== + +-------------------------------- + Turn 0: + (-- last Bounty Cards : 0,) + (-- last Playing Cards : 0 and 0,) + current player Scores : 0 and 0, + remaining bounty Cards : 1,2,3,4,5,6,7,8, + on hand player Cards : 1,2,3,4,5,6,7,8 and 1,2,3,4,5,6,7,8. +-------------------------------- + Turn 1: + (-- last Bounty Cards : 5,) + (-- last Playing Cards : 3 and 5,) + current player Scores : 0 and 5, + remaining bounty Cards : 1,2,3,4,6,7,8, + on hand player Cards : 1,2,4,5,6,7,8 and 1,2,3,4,6,7,8. +-------------------------------- + Turn 2: + (-- last Bounty Cards : 4,) + (-- last Playing Cards : 5 and 4,) + current player Scores : 4 and 5, + remaining bounty Cards : 1,2,3,6,7,8, + on hand player Cards : 1,2,4,6,7,8 and 1,2,3,6,7,8. +-------------------------------- + Turn 3: + (-- last Bounty Cards : 7,) + (-- last Playing Cards : 1 and 7,) + current player Scores : 4 and 12, + remaining bounty Cards : 1,2,3,6,8, + on hand player Cards : 2,4,6,7,8 and 1,2,3,6,8. +-------------------------------- + Turn 4: + (-- last Bounty Cards : 6,) + (-- last Playing Cards : 2 and 6,) + current player Scores : 4 and 18, + remaining bounty Cards : 1,2,3,8, + on hand player Cards : 4,6,7,8 and 1,2,3,8. +-------------------------------- + Turn 5: + (-- last Bounty Cards : 2,) + (-- last Playing Cards : 4 and 2,) + current player Scores : 6 and 18, + remaining bounty Cards : 1,3,8, + on hand player Cards : 6,7,8 and 1,3,8. +-------------------------------- + Turn 6: + (-- last Bounty Cards : 8,) + (-- last Playing Cards : 7 and 8,) + current player Scores : 6 and 26, + remaining bounty Cards : 1,3, + on hand player Cards : 6,8 and 1,3. +-------------------------------- + Turn 7: + (-- last Bounty Cards : 1,) + (-- last Playing Cards : 6 and 1,) + current player Scores : 7 and 26, + remaining bounty Cards : 3, + on hand player Cards : 8 and 3. +-------------------------------- + Turn 8: + (-- last Bounty Cards : 3,) + (-- last Playing Cards : 8 and 3,) + current player Scores : 10 and 26, + remaining bounty Cards : , + on hand player Cards : and . +Scores: 10 v 26 +PLayer 1 Wins! \ No newline at end of file diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index cbc6503..35bbacc 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -12,87 +12,35 @@ // - stage j : (split into runGame() and report()) // - stage k : (using recursion instead of loop) -// adopt the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel +// the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel function runGame() { let states = [{ turn : 0, bountyCards : [1, 2, 3, 4, 5, 6, 7, 8], playerCards : [[1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7, 8]], - lastBountyCard: 0, - lastPlayingCards : [0, 0], // need this to avoid cannot logging in stage g - playerScores : [0, 0]}] // stage f and many below to use state. !!! + lastBountyCard: 0, // need this to help logging + lastPlayingCards : [0, 0], // need this to help logging + playerScores : [0, 0]}] return recur(states, nextState, function(state){ - console.log(`state is ${state} and ${state.bountyCards}`); return state.bountyCards.length == 0; // not > 0 }); - //while (last(states).bountyCards.length > 0) { // some minor bugs and concat is from end - - - // console.log(turnMessage("before", last(states))); - - //states = states.concat(nextState(last(states))) // some minor bugs and concat is from end - - // stage g - const bountyCard = selectRandom(state.bountyCards); // stage b - popRandom(bountyCards); - // stage g - state.bountyCards = without(state.bountyCards, bountyCard) // stage b - - - // console.log(turnMessage("after", last(states))); - - - // stage g - const card0 = playRandomStrategy(state.playerCards[0], bountyCard); - // stage g - const card1 = playEqualStrategy(state.playerCards[1], bountyCard); - // stage g - state.playerCards[0] = without(state.playerCards[0], card0); // stage b - // stage g - state.playerCards[1] = without(state.playerCards[1], card1); // stage c - - // stage g - state.turn +=1; - - //console.log(`\tPlayer 0 plays: ${state.lastPlayingCards[0]}`)// card0}`); // stage - a - //console.log(`\tPlayer 1 plays: ${state.lastPlayingCards[1]}`)// card1}`); // stage - a - // ; see wiki best strategy against random play - - // stage g - if (card0 > card1) { - // stage g - state.playerScores[0] += bountyCard; - // stage g - } else if (card1 > card0){ - // stage g - state.playerScores[1] += bountyCard; - // stage g - } else { - // stage g - //console.log(`\ncard0 is ${card0}`); - // stage g - //console.log(`card1 is ${card1}`); - // stage g - console.log("the competition card is discarded") - // stage g - } - //} - - // stage e - console.log(`Scores: ${playerScores[0]} v ${playerScores[1]}`); - - // stage e = console.log(winMessage(playerScores)); - - // console.log(endMessage(last(states).playerScores)); - - // stage d - if (playerScores[0] == playerScores[1]) { - // stage d - console.log("PLayer Tie.") - // stage d - } else if (playerScores[0] > playerScores[1]) { - // stage d - console.log("PLayer 0 Wins!") - // stage d - } else { - // stage d - console.log("PLayer 1 Wins!") - // stage d - } - - // return states; } -// runGame(); function recur(states, stateChange, endCondition){ if(endCondition(last(states))){ // missing one ) in the code return states; } else { - return recur(states.concat(stateChange(last(states))),stateChange, endCondition); // lastState should be last(states) and the function recur need 3 parameters + return recur(states.concat(stateChange(last(states))),stateChange, endCondition); // lastState should be last(states) and the function recur need 3 parameters not 1 parameter } } function report(states, onTurn, onEnd){ return states.map(onTurn).join("\n")+"\n"+ - onEnd(last(states).playerScores) // once again minor bugs + onEnd(last(states).playerScores) // last(states) not lastState } console.log(report(runGame(), turnMessage, endMessage)); @@ -102,8 +50,7 @@ function last(arr){ return arr[arr.length - 1]; } -function turnMessage(state){ //{status, state){ - // if (status == 'before') { +function turnMessage(state){ return `--------------------------------\n`+ // status + ` Turn ${state.turn}:`+ @@ -112,69 +59,34 @@ function turnMessage(state){ //{status, state){ `\n\t current player Scores : ${state.playerScores[0]} and ${state.playerScores[1]}, ` + `\n\t remaining bounty Cards : ${state.bountyCards}, ` + `\n\t on hand player Cards : ${state.playerCards[0]} and ${state.playerCards[1]}. ` - - //} // else { - // return `||||||||||||||||||||||||||||||||\n`+ - // status +` Turn ${state.turn}:`+ - // `\n\t see Bounty Cards : ${state.lastBountyCard}, ` + - // `\n\t just Played Cards : ${state.lastPlayingCards[0]} and ${state.lastPlayingCards[1]}, ` + - // `\n\t player Scores : ${state.playerScores[0]} and ${state.playerScores[1]}, ` + - // `\n\t next round bounty Cards : ${state.bountyCards}, ` + - // `\n\t next round player Cards : ${state.playerCards[0]} and ${state.playerCards[1]}. ` + - // - // `\n=================================\n` - // } } function nextState(state) { - const bountyCard = selectRandom(state.bountyCards); // stage b - popRandom(bountyCards); - // no need just return : state.bountyCards = without(state.bountyCards, bountyCard) // stage b - - - // remain in the main logic : console.log(`Turn ${state.turn}: Bounty: ${bountyCard}`); + const bountyCard = selectRandom(state.bountyCards); + const card0 = playRandomStrategy(state.playerCards[0], bountyCard); const card1 = playEqualStrategy(state.playerCards[1], bountyCard); - // no need just return : state.playerCards[0] = without(state.playerCards[0], card0); // stage b - // no need just return : state.playerCards[1] = without(state.playerCards[1], card1); // stage c - - // no need just return : state.turn +=1; - - // remain in the main logic : console.log(`\tPlayer 0 plays: ${card0}`); // stage - a - // remain in the main logic : console.log(`\tPlayer 1 plays: ${card1}`); // stage - a - // ; see wiki best strategy against random play - - // use a new function - if (card0 > card1) { - // use a new function - state.playerScores[0] += bountyCard; - // use a new function - } else if (card1 > card0){ - // use a new function - state.playerScores[1] += bountyCard; - // use a new function - } else { - // use a new function - //console.log(`\ncard0 is ${card0}`); - // use a new function - //console.log(`card1 is ${card1}`); - // use a new function - console.log("the competition card is discarded") - // use a new function - } return {turn: state.turn + 1, bountyCards: without(state.bountyCards, bountyCard), - playerCards: [without(state.playerCards[0], card0), // source has a bugs without card0 - without(state.playerCards[1], card1)], // source has a bugs without card1 + playerCards: [without(state.playerCards[0], card0), // need card0 + without(state.playerCards[1], card1)], // need card1 lastBountyCard: bountyCard, lastPlayingCards : [card0, card1], playerScores: newScore(state.playerScores, [card0, card1], - bountyCard) // source has a bugs without bountyCard1 + bountyCard) // need bountyCard1 } } function newScore(playerScores, playerCards, bountyCard){ if (playerCards[0] > playerCards[1]) { - return [playerScores[0]+bountyCard, playerScores[1]]; // source has a bugs not + 1 + return [playerScores[0]+bountyCard, playerScores[1]]; // not + 1 } else if (playerCards[0] < playerCards[1]){ - return [playerScores[0] , playerScores[1]+bountyCard]; // source has a bugs not + + return [playerScores[0] , playerScores[1]+bountyCard]; // not + 1 } else { - // no need //console.log(`\ncard0 is ${card0}`); - // no need //console.log(`card1 is ${card1}`); - // no need console.log("the competition card is discarded") - return [playerScores[0] , playerScores[1]] // actually need this as still need to return + return [playerScores[0] , playerScores[1]] // need this to return otherwise no state when card is equal (not needed under OO and imperative) } } @@ -197,31 +109,23 @@ function winMessage(playerScores) { } } -function selectRandom(arr){ // stage b - popRandom(arr){ +function selectRandom(arr){ const index = Math.floor(Math.random() * arr.length); return arr[index]; - // stage b - const value = arr[index]; - // stage b - arr.splice(index, 1); - // stage b - return value; } function playRandomStrategy(playerCards, bountyCard){ - const card = selectRandom(playerCards); // stage b - popRandom(playerCards); - // stage a - console.log(`\tPlayer 0 plays: ${card}`); + const card = selectRandom(playerCards); return card; } function playEqualStrategy(playerCards, bountyCard){ - // stage c - playerCards.splice(playerCards.indexOf(bountyCard),1); - // stage a - console.log(`\tPlayer 1 plays: ${bountyCard}`); return bountyCard; } -function without(arr, value){ //stage b - const index = arr.indexOf(value); //stage b - // debug during stage b : x = - // debug during stage b : console.log(` ===> not sure what is this: ${x} `) - return [...arr.slice(0, index), ...arr.slice(index+1)]; //stage b +function without(arr, value){ + const index = arr.indexOf(value); + return [...arr.slice(0, index), ...arr.slice(index+1)]; } -module.exports = runGame; \ No newline at end of file +module.exports = runGame; // for running under external call \ No newline at end of file From ba6fcf63904f519bede7021f0bbdbeb358f539d3 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 22:07:00 +0000 Subject: [PATCH 23/26] align the fun with clojure --- myJS/cardC-FP-1.js | 113 ++++++++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 52 deletions(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index 35bbacc..dcb6d17 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -14,42 +14,32 @@ // the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel -function runGame() { - let states = [{ turn : 0, - bountyCards : [1, 2, 3, 4, 5, 6, 7, 8], - playerCards : [[1, 2, 3, 4, 5, 6, 7, 8], - [1, 2, 3, 4, 5, 6, 7, 8]], - lastBountyCard: 0, // need this to help logging - lastPlayingCards : [0, 0], // need this to help logging - playerScores : [0, 0]}] - - return recur(states, nextState, function(state){ - return state.bountyCards.length == 0; // not > 0 - }); - +function without(arr, value){ + const index = arr.indexOf(value); + return [...arr.slice(0, index), ...arr.slice(index+1)]; } - -function recur(states, stateChange, endCondition){ - if(endCondition(last(states))){ // missing one ) in the code - return states; +function winMessage(playerScores) { + if (playerScores[0] == playerScores[1]) { + return "PLayer Tie.\n"; + } else if (playerScores[0] > playerScores[1]) { + return "PLayer 0 Wins!\n"; } else { - return recur(states.concat(stateChange(last(states))),stateChange, endCondition); // lastState should be last(states) and the function recur need 3 parameters not 1 parameter + return "PLayer 1 Wins!\n"; } } -function report(states, onTurn, onEnd){ - return states.map(onTurn).join("\n")+"\n"+ - onEnd(last(states).playerScores) // last(states) not lastState -} - -console.log(report(runGame(), turnMessage, endMessage)); +function scoreMessage(playerScores){ + return `Scores: ${playerScores[0]} v ${playerScores[1]}`; +} -function last(arr){ - return arr[arr.length - 1]; +function endMessage(playerScores){ + return scoreMessage(playerScores) + "\n" + + winMessage(playerScores); } + function turnMessage(state){ return `--------------------------------\n`+ // status + @@ -61,6 +51,23 @@ function turnMessage(state){ `\n\t on hand player Cards : ${state.playerCards[0]} and ${state.playerCards[1]}. ` } + +function report(states, onTurn, onEnd){ + return states.map(onTurn).join("\n")+"\n"+ + onEnd(last(states).playerScores) // last(states) not lastState +} + + +function newScore(playerScores, playerCards, bountyCard){ + if (playerCards[0] > playerCards[1]) { + return [playerScores[0]+bountyCard, playerScores[1]]; // not + 1 + } else if (playerCards[0] < playerCards[1]){ + return [playerScores[0] , playerScores[1]+bountyCard]; // not + 1 + } else { + return [playerScores[0] , playerScores[1]] // need this to return otherwise no state when card is equal (not needed under OO and imperative) + } +} + function nextState(state) { const bountyCard = selectRandom(state.bountyCards); @@ -80,35 +87,41 @@ function nextState(state) { } } -function newScore(playerScores, playerCards, bountyCard){ - if (playerCards[0] > playerCards[1]) { - return [playerScores[0]+bountyCard, playerScores[1]]; // not + 1 - } else if (playerCards[0] < playerCards[1]){ - return [playerScores[0] , playerScores[1]+bountyCard]; // not + 1 - } else { - return [playerScores[0] , playerScores[1]] // need this to return otherwise no state when card is equal (not needed under OO and imperative) - } -} -function scoreMessage(playerScores){ - return `Scores: ${playerScores[0]} v ${playerScores[1]}`; +function recur(states, stateChange, endCondition){ + if(endCondition(last(states))){ // missing one ) in the code + return states; + } else { + return recur(states.concat(stateChange(last(states))),stateChange, endCondition); // lastState should be last(states) and the function recur need 3 parameters not 1 parameter + } } -function endMessage(playerScores){ - return scoreMessage(playerScores) + "\n" + - winMessage(playerScores); + +function runGame() { + let states = [{ turn : 0, + bountyCards : [1, 2, 3, 4, 5, 6, 7, 8], + playerCards : [[1, 2, 3, 4, 5, 6, 7, 8], + [1, 2, 3, 4, 5, 6, 7, 8]], + lastBountyCard: 0, // need this to help logging + lastPlayingCards : [0, 0], // need this to help logging + playerScores : [0, 0]}] + + return recur(states, nextState, function(state){ + return state.bountyCards.length == 0; // not > 0 + }); + } -function winMessage(playerScores) { - if (playerScores[0] == playerScores[1]) { - return "PLayer Tie.\n"; - } else if (playerScores[0] > playerScores[1]) { - return "PLayer 0 Wins!\n"; - } else { - return "PLayer 1 Wins!\n"; - } + + +console.log(report(runGame(), turnMessage, endMessage)); + + +function last(arr){ + return arr[arr.length - 1]; } + function selectRandom(arr){ const index = Math.floor(Math.random() * arr.length); return arr[index]; @@ -123,9 +136,5 @@ function playEqualStrategy(playerCards, bountyCard){ return bountyCard; } -function without(arr, value){ - const index = arr.indexOf(value); - return [...arr.slice(0, index), ...arr.slice(index+1)]; -} module.exports = runGame; // for running under external call \ No newline at end of file From 0698244fa1961ac6141cfbcbeff1f91bfa0adae1 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sat, 28 Dec 2019 22:10:07 +0000 Subject: [PATCH 24/26] further tidy-up --- myJS/cardC-FP-1.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1.js index dcb6d17..fe803d9 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1.js @@ -29,7 +29,6 @@ function winMessage(playerScores) { } } - function scoreMessage(playerScores){ return `Scores: ${playerScores[0]} v ${playerScores[1]}`; } @@ -39,7 +38,6 @@ function endMessage(playerScores){ winMessage(playerScores); } - function turnMessage(state){ return `--------------------------------\n`+ // status + @@ -51,13 +49,11 @@ function turnMessage(state){ `\n\t on hand player Cards : ${state.playerCards[0]} and ${state.playerCards[1]}. ` } - function report(states, onTurn, onEnd){ return states.map(onTurn).join("\n")+"\n"+ onEnd(last(states).playerScores) // last(states) not lastState } - function newScore(playerScores, playerCards, bountyCard){ if (playerCards[0] > playerCards[1]) { return [playerScores[0]+bountyCard, playerScores[1]]; // not + 1 @@ -87,7 +83,6 @@ function nextState(state) { } } - function recur(states, stateChange, endCondition){ if(endCondition(last(states))){ // missing one ) in the code return states; @@ -96,7 +91,6 @@ function recur(states, stateChange, endCondition){ } } - function runGame() { let states = [{ turn : 0, bountyCards : [1, 2, 3, 4, 5, 6, 7, 8], @@ -113,7 +107,6 @@ function runGame() { } - console.log(report(runGame(), turnMessage, endMessage)); @@ -121,7 +114,6 @@ function last(arr){ return arr[arr.length - 1]; } - function selectRandom(arr){ const index = Math.floor(Math.random() * arr.length); return arr[index]; From b661f68fae8b1524dd4871a83d3610ac8e624526 Mon Sep 17 00:00:00 2001 From: kwccoin Date: Sun, 29 Dec 2019 12:21:31 +0000 Subject: [PATCH 25/26] tidy up --- .DS_Store | Bin 10244 -> 10244 bytes index.js | 7 +- myJS/cardC-FP-1-13cards.js | 133 +++++++++++++++++++ myJS/{cardC-FP-1.js => cardC-FP-1-8cards.js} | 1 + project.clj | 9 +- src/cards/core.clj | 12 +- 6 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 myJS/cardC-FP-1-13cards.js rename myJS/{cardC-FP-1.js => cardC-FP-1-8cards.js} (98%) diff --git a/.DS_Store b/.DS_Store index 77372015fd60c0e6774a1e3154c514b859b5d6fe..63e20484d46b3eb09ac24e95a1b80e55765c571c 100644 GIT binary patch delta 39 vcmZn(XbG6$&uF|cU^hRb@n#-@EN;%Ul;Y&1{QMlo%{kH?ESuRC{;~rA1xpP1 delta 32 ocmZn(XbG6$&uFwUU^hRb(PkcjEbh&n(se8o3xqebEBs{#0JXdd$N&HU diff --git a/index.js b/index.js index f1176fd..add8def 100644 --- a/index.js +++ b/index.js @@ -2,5 +2,8 @@ //var ALLGame = require('./index-runALLGame.js') //ALLGame(); // <-- note the different syntax of the OO or new class thing -console.log("\n\njust run it but now it is a FP<-----------===\n"); -require('./myJS/cardC-FP-1.js'); +//console.log("\n\njust run it but now it is a FP<-----------===\n"); +//require('./myJS/cardC-FP-1-8cards.js'); + +console.log("\n\njust run it but now it is a FP with 13 cards still 2 players<-----------===\n"); +require('./myJS/cardC-FP-1-13cards.js'); diff --git a/myJS/cardC-FP-1-13cards.js b/myJS/cardC-FP-1-13cards.js new file mode 100644 index 0000000..7b74516 --- /dev/null +++ b/myJS/cardC-FP-1-13cards.js @@ -0,0 +1,133 @@ +// from node card0-impertive.js +// refactoring by stages +// - stage a : (try to remove mutation) just move logging so no mutation in the fuction +// - stage b : (make popRandom () pure) avoid play Random using in place mutation array splice +// - stage c : (make payEqual () pure) +// - stage d : (extract winMessage) try to avoid logic in display message +// - stage e : (combine end message) +// - stage f : (combine sate vars into one) +// - stage g : (creat a nextState()) basically it is generalisd to nextState( current state) +// - stage h : (create a turn message) +// - stage i : (store states in an array) +// - stage j : (split into runGame() and report()) +// - stage k : (using recursion instead of loop) + +// the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel +// total score can be less if there are equal card and the value was droped + +function without(arr, value){ + const index = arr.indexOf(value); + return [...arr.slice(0, index), ...arr.slice(index+1)]; +} + +function winMessage(playerScores) { + if (playerScores[0] == playerScores[1]) { + return "PLayer Tie.\n"; + } else if (playerScores[0] > playerScores[1]) { + return "PLayer 0 Wins!\n"; + } else { + return "PLayer 1 Wins!\n"; + } +} + +function scoreMessage(playerScores){ + return `Scores: ${playerScores[0]} v ${playerScores[1]}`; +} + +function endMessage(playerScores){ + return scoreMessage(playerScores) + "\n" + + winMessage(playerScores); +} + +function turnMessage(state){ + return `--------------------------------\n`+ + // status + + ` Turn ${state.turn}:`+ + `\n\t (-- last Bounty Cards : ${state.lastBountyCard},) ` + + `\n\t (-- last Playing Cards : ${state.lastPlayingCards[0]} and ${state.lastPlayingCards[1]},) ` + + `\n\t current player Scores : ${state.playerScores[0]} and ${state.playerScores[1]}, ` + + `\n\t remaining bounty Cards : ${state.bountyCards}, ` + + `\n\t on hand player Cards : ${state.playerCards[0]} and ${state.playerCards[1]}. ` +} + +function report(states, onTurn, onEnd){ + return states.map(onTurn).join("\n")+"\n"+ + onEnd(last(states).playerScores) // last(states) not lastState +} + +function newScore(playerScores, playerCards, bountyCard){ + if (playerCards[0] > playerCards[1]) { + return [playerScores[0]+bountyCard, playerScores[1]]; // not + 1 + } else if (playerCards[0] < playerCards[1]){ + return [playerScores[0] , playerScores[1]+bountyCard]; // not + 1 + } else { + return [playerScores[0] , playerScores[1]] // need this to return otherwise no state when card is equal (not needed under OO and imperative) + } +} + +function nextState(state) { + + const bountyCard = selectRandom(state.bountyCards); + + const card0 = playRandomStrategy(state.playerCards[0], bountyCard); + const card1 = playEqualStrategy(state.playerCards[1], bountyCard); + + return {turn: state.turn + 1, + bountyCards: without(state.bountyCards, bountyCard), + playerCards: [without(state.playerCards[0], card0), // need card0 + without(state.playerCards[1], card1)], // need card1 + lastBountyCard: bountyCard, + lastPlayingCards : [card0, card1], + playerScores: newScore(state.playerScores, + [card0, card1], + bountyCard) // need bountyCard1 + } +} + +function recur(states, stateChange, endCondition){ + if(endCondition(last(states))){ // missing one ) in the code + return states; + } else { + return recur(states.concat(stateChange(last(states))),stateChange, endCondition); // lastState should be last(states) and the function recur need 3 parameters not 1 parameter + } +} + +function runGame() { + let states = [{ turn : 0, + bountyCards : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], + playerCards : [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]], + lastBountyCard: 0, // need this to help logging + lastPlayingCards : [0, 0], // need this to help logging + playerScores : [0, 0]}] + + return recur(states, nextState, function(state){ + return state.bountyCards.length == 0; // not > 0 + }); + +} + + +console.log(report(runGame(), turnMessage, endMessage)); + + +function last(arr){ + return arr[arr.length - 1]; +} + +function selectRandom(arr){ + const index = Math.floor(Math.random() * arr.length); + return arr[index]; +} + +function playRandomStrategy(playerCards, bountyCard){ + const card = selectRandom(playerCards); + return card; +} + +function playEqualStrategy(playerCards, bountyCard){ + return bountyCard; +} + + +module.exports = runGame; // for running under external call \ No newline at end of file diff --git a/myJS/cardC-FP-1.js b/myJS/cardC-FP-1-8cards.js similarity index 98% rename from myJS/cardC-FP-1.js rename to myJS/cardC-FP-1-8cards.js index fe803d9..992337a 100644 --- a/myJS/cardC-FP-1.js +++ b/myJS/cardC-FP-1-8cards.js @@ -13,6 +13,7 @@ // - stage k : (using recursion instead of loop) // the competition card is discarded as in wiki: https://en.wikipedia.org/wiki/Goofspiel +// total score can be less if there are equal card and the value was droped function without(arr, value){ const index = arr.indexOf(value); diff --git a/project.clj b/project.clj index 9d78560..83e27c5 100644 --- a/project.clj +++ b/project.clj @@ -6,4 +6,11 @@ :dependencies [[org.clojure/clojure "1.10.0"]] :main ^:skip-aot cards.core :target-path "target/%s" - :profiles {:uberjar {:aot :all}}) + :profiles {:uberjar {:aot :all} + :dev {:exclusions [org.clojure/tools.trace] + :dependencies [[cider/cider-nrepl "0.22.2"]] + :repl-options {:host "0.0.0.0" + :port 4500 + :nrepl-middleware + [cider.nrepl.middleware.out/wrap-out]}}} + ) diff --git a/src/cards/core.clj b/src/cards/core.clj index caf0e73..5038266 100644 --- a/src/cards/core.clj +++ b/src/cards/core.clj @@ -56,4 +56,14 @@ :player2 0}}]] (game-loop state))) -(print (report (run-game) turn-message end-message)) \ No newline at end of file +(print (report (run-game) turn-message end-message)) + +;;(print "\n") + +;;(print (+ 1 2)) + +;;(print "\n-----\n") + +(defn -main [& args] + (println "Working!")) +;; (print (report (run-game) turn-message end-message))) From 74cd7034fea6ede5b040735ac23ed81bf53065f0 Mon Sep 17 00:00:00 2001 From: "Kowloon walled city (coin)" Date: Sun, 29 Dec 2019 12:30:27 +0000 Subject: [PATCH 26/26] Set theme jekyll-theme-leap-day --- _config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 _config.yml diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..b849713 --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-leap-day \ No newline at end of file