ã¯ããã«
ãã®è¨äºã«ã¤ãã¦
以ä¸ã®è¨äºã«è§¦çºããã¦èªåã§ãæ¸ãã¦ã¿ã¾ããã
ããã°ã©ãã³ã°è¨èªã好ããªã®ã§ãæ°ã«ãªã£ããã®ãè¦ã¤ããã¨è§¦ãããã«ãã¦ãããã§ãããã»ã¨ãã©ã¯æ°ããªçºè¦ãé©ããããªä¾¿å©ãªæ©è½ããã£ã¦ãæ¯åæå¿ããããã¾ããä»äºã§ã¯ãªããªãããããããã¨ããããã«ãããªãã®ãæ®å¿µã§ã¯ããã¾ãããå人ã§ä½¿ãã¢ããªã±ã¼ã·ã§ã³ãä½¿ãæ¨ã¦ã®ããã°ã©ã ãæ¸ãã¨ãã«ã¯ããªãã¹ãããããªè¨èªã§æ¸ãããã«ãã¦ãã¾ãã
ä»äºã¨è¶£å³ãåããã¦20以ä¸ã®è¨èªã«è§¦ãã¦ãã¾ãããããããã®ãªãã§ãã¨ãã«è¡æçã ã£ãè¨èªãããã¤ãé¸ã³ã¾ããã
ããã¾ã§è§¦ã£ã¦ããè¨èª
ã ãããæç³»åé ã§ãããä¼¼ããã®ã¯è¿ãã«å¯ãã¦ããããã®ã§ãé ä¸åã§ãã
è¶£å³
BASIC (MS BASIC), Smalltalk, Nim, Scala, Clojure, Haskell, Kotlin, R, F#, Rust, Gleam
ä»äº
C, C++, Java, PHP, Perl, JavaScript, TypeScript, SQL, Visual Basic, VBScript, C#, Object Pascal (Delphi), Ruby, Python, Elixir
è¡æãåããããã°ã©ãã³ã°è¨èª5ã¤
1. C++
åãã¦æ¸ããã®ã¯ BASIC ã§ãããï¼ä¸å¦çï¼ãä»äºã§æåã«è¦ããã®ã¯ C ã§ãããæåã®1,2å¹´ C ã§ããã«ã¦ã§ã¢ãããã¤ã¹ãã©ã¤ããæ¸ãã¦ãã¦ããã®å¾ãC++ã«ã·ãããã¦ããã¾ãããæã®è¨æ¶ãã»ã¼ãªãã®ã§ï¼è¨æ¶åã壿» çã«æªãããï¼ããªãã¨ãªãã®æè¦ã§ããæãåºããªããã§ããããã¡ããããã¤ãè¡æã ã£ããã¤ã³ããæ¸ãã¦ããã¾ãã
è¡æãã¤ã³ã
- ã¯ã©ã¹
- ãªã¼ãã¼ãã¼ã
- ãã³ãã¬ã¼ã
C++ ã¨ã®åºä¼ãã¯ãªãã¸ã§ã¯ãæåè¨èªã¨ã®åºä¼ãã§ãããã®ã§ãå¤åã«ãªãã¸ã§ã¯ãæåã®ç¹å¾´ãå ¥ã£ã¦ãããã§ãããã¨ãã«è¡æã ã£ãã®ã¯ãMicrosoft ã® MFC(Microsoft Foundation Class) ã§ãããWin32 API ã¨ãã C ãã¼ã¹ã® API ã¨æ¯è¼ãã㨠MFC ã¯æ ¼æ®µã«ä½¿ããããæããã®ãè¦ãã¦ãã¾ããã©ã¤ãã©ãªã®è¨è¨ã®è¯ãæªãããã£ããã ããã¨æãã¾ãããC++ ã£ã¦ä¾¿å©ã ãªãã¨æã£ãã®ã¯ç¢ºãã§ãã
ãã®å¾ãLinus Torvalds ããã C++ ã¯â¯ã½ã¿ãããªãã¨ãè¨ã£ã¦ãã®ãèªãã§ããããâ¦ã¨æã£ãã®ãäºå®ã§ãããæè»æ§ã¨å ç¢æ§ã®ãã¬ã¼ããªããªã®ããªã¨ãæãã¾ãã
ãã¨ãããã¯ããããåéãæ¸ãã¦ããä¸ã§å¤ãã£ãç¹ã ã¨æããã¾ãããBASIC ã C ãã³ã³ãã¥ã¼ã¿ã¼ã«å½ä»¤ãéãããã®æã¨ããæèã ã£ãã®ããC++ ã«åºä¼ã£ã¦è¡¨ç¾ãæèããããã«ãªãã¾ãããã¯ã©ã¹ããã³ãã¬ã¼ãã¨ããæ¦å¿µãå ¥ã£ã¦ãã¦æ ¼æ®µã«è¨è¨ãé£ãããªã£ãã¨ãããã表ç¾ã®å¹ ãåºãã£ãæãããã¾ããï¼ãã®ã¶ã楽ããã£ãã§ããï¼ã
2. PHP
Perl 㨠PHP ã©ã¡ããå ã ã£ããå¿ãã¾ããããPerl ã«è¡æãåããè¨æ¶ããªãã®ã§ãã¶ã PHP ãå ãªãã ã¨æãã¾ãããã¼ã¸ã§ã³ 4 ãåºãã°ããã§ã3 ãæåã«èªã¿æ¸ãããè¨æ¶ããã£ããããã¾ããã¦ã§ã黿æã« Perl ã§ CGI ãæ¸ããããPHP ã§ç°¡åãªã¦ã§ããã¼ã¸ãä½ã£ãããã¦éãã§ããããä»äºã§ã使ãããã«ãªãã¾ãããèªåã«ã¨ã£ã¦ãã£ã¨ãé·ãå¤ãæ¸ãã¦ããè¨èªã§ãã
C++ ããªãã¸ã§ã¯ãæåè¨èªã¨ã®åãã¦ã®åºä¼ãã§ãPHP ã¯ã¤ã³ã¿ããªã¿è¨èªã¨ã®åãã¦ã®åºä¼ãã§ããã
è¡æãã¤ã³ã
- æ¸ãã°ããåã
- åçåä»ã
- ãã³ãã¬ã¼ãæ§æï¼HTMLã«åãè¾¼ããã¤ï¼
C++ ã®ãã¨ã¯ Java ã使ãããã«ãªãã¾ããããããããã³ã³ãã¤ã«åã§ãã³ã³ãã¤ã«ãã¦ããéã¯å¾ ã¤ã®ãå½ããåã§ããããPHP ã¯ã¤ã³ã¿ããªã¿åãªã®ã§ãæ¸ãããããåãã¨ããã®ãè¡æã§ããã
C ã§ CGI ãæ¸ããã¨ãã Java ã® JSP + Servlet ã使ã£ã¦ããã¨ãã«æ¯ã¹ã¦ãæ ¼æ®µã«æ¥½ã«ãªã£ãã¨æããè¨æ¶ãããã¾ãã䏿¹ã§ãHTML ã«ãã¸ãã¯ãå ¥ãè¾¼ãããããã¯éã«ãã¸ãã¯ã« HTML ãå ¥ãè¾¼ããã¨ã§ãã²ã©ãè¤éã«ãªã£ã¦ããããã¸ã§ã¯ããçµé¨ããã®ã§ããã¾ãä»äººãæ¸ãã PHP ã³ã¼ãã®ã¡ã³ããã³ã¹ãããããã¾ããã§ããï¼æã¯èªåãã¹ããæ¸ãæåãã»ã¼ãªãã£ãã§ããï¼ã
3. Nim
䏿æãè³é«ã®ããã°ã©ãã³ã°è¨èªãã¨ãã¦ä¸é¨çéã§ä¸ç¬ã®è¼ããè¦ãã NimãPython é¢¨ã®æ§æãæã¤éçåä»ãè¨èªã§ãC ã JS ã«ãã©ã³ã¹ã³ã³ãã¤ã«å¯è½ãªããã«ããã©ãã¤ã ãªæ±ç¨è¨èªã§ãã
ã¤ã³ãã³ããããã¯ã¯å¥½ã¿ãåãããã¨ããã ã¨ã¯æãã¾ãããç§ã¯å¥½ãã§ãã
è¡æãã¤ã³ã
- ã¨ã«ããéã
- ã¡ã½ããå¼ã³åºãæ§æ
- template æ§æ
ã¨ãã«è¡æã ã£ãã®ã¯ãã¡ã½ããå¼ã³åºãæ§æã§ãããNim ã§ã¯é常 ããã·ã¼ã¸ã£å(弿°1, 弿°2) ã®æ§æã§ããã·ã¼ã¸ã£ãå®è¡ãã¾ããã 弿°1.ããã·ã¼ã¸ã£å(弿°2) ã®ããã«ããªãã¸ã§ã¯ãæåè¨èªã®ã¡ã½ããã®ããã«å¼ã³åºããã¨ãã§ãã¾ãããã®ãã©ã£ã¡ã§ããããã£ã¦ãã仿§ã¨ãããææ³ã¯ä»ã®è¨èªã§ã¯è¦ããã¨ããªãã£ãã®ã§ããã£ããè¡æã§ããã
from std/strformat import fmt type Person = object name: string proc greetTo(person: Person, greeting: string = "hello") = echo fmt"{greeting}, {person.name}!" let person = Person(name: "John") # ä¸ã®æ¸ãæ¹ãã¡ã½ããå¼ã³åºãæ§æ # greetTo(person) => hello, John! person.greetTo("goodby") # => goodby, John! # ããªããã£ãåã«å¯¾ãã¦ãã§ãã # succ(10) => 11 10.succ()
å·éã«èããã¨ãè¤æ°ã®æ¸ãæ¹ãããã¨ããããæ··ãã£ã¦ãã¾ã£ã¦ããã¼ã éçºã ã¨æ··ä¹±ããããªã¨ãæããã§ãããã¡ã½ãããã§ã¼ã³ããããã¨ãã ãã«éå®ãããªã©ãã«ã¼ã«ãããã°æ´»ç¨ã§ããããªã¨ãæãã¾ãã
maxIndex(items.map(item => item.x)) # ãã£ã¡ã®ã»ããèªã¿ããã items.map(item => item.x).maxIndex()
ãªãã¸ã§ã¯ãæåçã«ä½¿ãã±ã¼ã¹ã§ãã¡ã½ããå¼ã³åºãæ§æã使ãããã«ãã¦ãããããããã¾ãããmethod ãã¼ã¯ã¼ãã使ãã¨ããªãã¸ã§ã¯ãæåè¨èªã®ãããªå¤ç¸æ§ãæããããã¾ãã
type Person = ref object of RootObj name: string age: int type Student = ref object of Person id: string method toString(person: Person): string {.base.} = person.name method toString(student: Student): string = fmt"{student.name}({student.id})" let person = Person(name: "Taro", age: 20) let student = Student(name: "Jiro", age: 17, id: "00000002") let people = [person, student] for p in people: echo p.show() # Taro # Jiro(00000002)
template æ§æããã¤ã³ãé«ãã§ãããã¯ãã®ä¸ç¨®ãªãã§ããï¼macro æ§æãå¥ã«åå¨ãã¦ãã¾ãï¼ãAST ãæ±ããªãã¦æ¸ãããã«è¨è¨ããã¦ãã¾ããããã¾ã§ãã¾ããã¯ãã使ããè¨èªã使ã£ã¦ããªãã£ãã®ã§ãC ã®ãã¯ãã¨ã®æ¯è¼ã«ãªã£ã¦ãã¾ãã¾ãããããæ®éã®é¢æ°ã£ã½ãæ¸ãæ¹ãã§ãã¾ãï¼æè¿ã 㨠Rust ã®ãã¯ããããã¨ç¹æ®ãªæ¸ãæ¹ããªãã¨ãããªãæãã§ãï¼ã
template withFile(f, fn, mode, actions: untyped): untyped = var f: File if open(f, fn, mode): try: actions finally: close(f) else: quit("cannot open: " & fn) withFile(txt, "ttempl3.txt", fmWrite): txt.writeLine("line 1") txt.writeLine("line 2")
ä¸ã®ã³ã¼ãã¯å ¬å¼ããã¥ã¡ã³ãï¼https://nim-lang.org/docs/manual.html#templatesï¼ããã®å¼ç¨ã§ãããã³ã¼ããããã¯ã弿°ã¨ãã¦åãåããã®ã§ãã³ãã¬ã¼ãã®ä¸ãå¼ã³åºãå´ãã¨ã¦ãããããããã§ãã
ãã®ä»çµã¿ãèãã人ã¯å¤©æã ãªãã¨æãã¾ããã
ã¨ã¯ãããtemplate ã®å©ç¹ã¯ãããã®ã®ããã¦ãã®ã±ã¼ã¹ã§ã¯é¢æ°ï¼Nim ã§ã¯ããã·ã¼ã¸ã£ï¼ã§äºè¶³ãã¾ããããã¯ãã¯ä½¿ããããã¨ä¿å®æ§ãä¸ããã®ã§ãå®éã«ã¯ã»ã¨ãã©ä½¿ã£ã¦ãã¾ããããä»ã®è¨èªã使ã£ã¦ããã¨ããããã¯ãã»ãããã¨æããã¨ããã¾ã«ããã®ã§ãNim ã®ãã³ãã¬ã¼ãã¯ãã¾ã®ã¨ããçæ³å½¢ã®ä¸ã¤ã§ã¯ããã¾ãã
4. Clojure
Clojure 㯠JVM ä¸ã§åä½ãã Lisp ã®ä¸ç¨®ã§ããLisp ã«é¢ãã¦ã¯ã䏿æ Emacs ã使ã£ã¦ãããã¨ããããå¤å°ã®èªã¿æ¸ãã¯ã§ãããã®ã®ãLisp ä¿¡è ã«ãªã£ãã®ã¯ Clojure ã®ãããã§ãã
ç§ã¯ãããã°ã©ãã³ã°è¨èªã¯éå ·ãã¨æã£ã¦ããã®ã§ãã¾ãç¹å¥ãªæãå ¥ãã¯æããªãã§ãããClojure ã ãã¯å¥ã¨ããããèªãã¨æãã®ä¸ã溢ãã¦ãããããªæ°ããã¾ãã
è¡æãã¤ã³ãããããããããã§ãããã¨ãã«ä»ã®è¨èªã§ã¯ãã¾ãå³ãããªã3ç¹ã«çµã£ã¦åæãã¾ãã
è¡æãã¤ã³ã
- Så¼ã®ç¾ãã
- ã¹ã¬ãã£ã³ã°ãã¯ã
- ã±ããã±ã¼ã¹
Lispï¼Så¼ï¼ã®ç¾ããã«ã¤ãã¦ã¯ãå¤ãã®äººãè¨åãã¦ããã®ã§ããªã«ããã¾ããã¨ããæãããã¾ãããªããªãã§ããããããã®å¸å¼åããã¡ãããã©ããç¾ããã®ãã¾ã£ããããããã¨ããæ¹ãããã¨ã¯æãã®ã§ãä¸é¨ã®äººã«å¼·çãªå¥½å°è±¡ãæ±ãããè¬ã®é åã¿ãããªã®ããããã ã¨æãã¾ãã
(map inc (filter even? (take 10 (range)))) ;; => (1 3 5 7 9)
Emacs Lisp ã§åã㦠Lisp ã«åºä¼ã£ãããã§ããããã®ã¨ãã®ç¬¬ä¸å°è±¡ã¯ãããããªãã ãããã§ãããæ¬¡ç¬¬ã«æ £ãããã®ã®ããã¯ã Emacs ããããããã«ä»æ¹ãªãæ¸ããã¨ããæèã ã£ãããããç¾ããã¨ã¯ã¾ã£ããæãã¾ããã§ããã
ããããã®ã¡ã« Clojure ãç¥ããè¶£å³ã§ãã¾ã«ããã°ã©ã ãæ¸ãã«ã¤ããã¾ãã¾ã¨Så¼ã®é åã«ããã£ã¦ãã¾ã£ããã¨ããæ¬¡ç¬¬ã§ãã
䏿¹ã§ãã¹ã¬ãã£ã³ã°ãã¯ãã«ã¤ãã¦ã¯ããã®ä¾¿å©ãã¯å§åçã§ããã
æ°å¤ã®ãªã¹ãããããã0ï¸ã§åè©°ããã5æ¡ã®æååã«å¤æããã«ã³ãåºåãã§ä¸ã¤ã®æååã«ç¹ããã®ã¡ãã«ã³ããã¹ã©ãã·ã¥ã«ç½®ãæãã¦åºåãããã¨ããå¦çã§è¦ã¦ã¿ã¾ãï¼ã¡ãã£ã¨è¦ããã§ãããä¾ãªã®ã§ã容赦ãï¼ã
before
(println (replace (join "," (map #(format "%05d" %) [1 2 3])) #"," "/"))
after
(-> [1 2 3] (->> (map #(format "%05d" %)) (join ",")) (replace #"," "/") (println))
Lisp ã¯åç½®è¨æ³ãªã®ã§ãå¦çãé£ç¶ããã¨å¯èªæ§ãä½ä¸ãã¾ãããã¹ã¬ãã£ã³ã°ãã¯ããå©ç¨ãããã¨ã§å¦çã®é åºãæç¢ºã«ãªããå¯èªæ§ãä¸ããã¾ãã
ã¹ã¬ãããã¡ã¼ã¹ãï¼ -> ï¼ãã弿°ã1çªç®ã«ãããã¼ã¸ã§ã³ã§ãã¹ã¬ããã©ã¹ãï¼ ->> ï¼ãæå¾ã«ãããã¼ã¸ã§ã³ã§ãã
Clojure ã®ã¹ã¬ããã£ã³ã°ãã¯ãã«åºä¼ã£ãããã§ããããã¤ãã©ã¤ã³æ¼ç®åã®ãªãè¨èªã«ã¯æºè¶³ã§ããªã身ä½ã«ãªã£ã¦ãã¾ãã¾ããããããããããã¤ãã®ç´ æ´ãããè¨èªã«åºä¼ãã¾ãããããããè¶ ããè¡æã¯ã¾ã ãªãããããªãã§ããããã
ï¼ãããã«å ãã¦ã¾ã ->as, some->, cond-> ã¨ãè²ã
é¢ç½ãããªã¨ã¼ã·ã§ã³ããããã§ããâ¦ãã¾ãã¾ãããâ¦ï¼
æå¾ã¯ã±ããã±ã¼ã¹ãªãã§ãããããã¯ç´°ãããã©å°å³ã«å¹ããã¤ã§ããããã¦ãã®è¨èªã¯ã¹ãã¼ã¯ã±ã¼ã¹ã§ããã - 㨠_ ã ã¨Shiftãã¼ãæ¼ããã©ããã§å´åãéãã¾ããLisp ãªãã§ã¯ãªã®ã§ãä»ã§ã¯å³ãããªãé
åã§ãã
5. Gleam
Gleam ã¯ä»å¹´ï¼2024å¹´ï¼ã«ãã¼ã¸ã§ã³ 1.0 ã«ãªã£ãã°ããã®æ¯è¼çæ°ããè¨èªã§ããã©ãããçµç·¯ã§åºä¼ã£ããã¯å¿ãã¾ããããNim ã¨åæ§ã« Erlang 㨠JavaScript ã«ãã©ã³ã¹ãã¤ã«ã§ããéçåä»ã颿°åè¨èªãã¨ããã¨ããã«æ¹ããã¾ããã
BEAMï¼Erlang VMï¼ä¸ã§åä½ãã¾ãããErlang ã§æ¸ãããã¢ã¸ã¥ã¼ã«ã FFI ãããã¨ãå¯è½ã§ãï¼ã¿ã¼ã²ããã JavaScript ã®å ´å㯠JavaScript ã®ã¢ã¸ã¥ã¼ã«ã FFI ã§ãã¾ãï¼ã
ãªãã以åã®è¨äºã§ãè¨åãã¦ãã¾ãããæ°ããè¨èªã§ããããã·ã³ã¿ãã¯ã¹ãã¤ã©ã¤ãã«å¯¾å¿ãã¦ããªãã®ã§ Rust ã®ãåç¨ãã¾ãã
è¡æãã¤ã³ã
- åã·ã¹ãã
- if ããªã
- ãã¤ãã®ãã¬ã¼ã¹ãã«ãã¼
åå®ç¾©ã¯ãã¹ã¦ type ãã¼ã¯ã¼ãã使ãã¾ããåæåï¼enumï¼ããªããç´ååã以ä¸ã®ããã«è¡¨ç¾ãã¾ãã
type Message { Start End } fn send_message(message: Message) { case message { Start -> io.println("Starting...") End -> io.println("End") } } send_message(Start) send_message(End)
䏿¹ã§ãç´ç©åã¯ä»¥ä¸ã®ããæ¸ãã¾ãã
type Message { Message(from: String, to: String, body: String) } fn send_message(message: Message) { io.println("from: " <> message.from) io.println("to: " <> message.to) io.println("body: " <> message.body) } send_message(Message(from: "alice", to: "bob", body: "Hello"))
enum ãã¼ã¯ã¼ããæã¤è¨èªãããã¾ãããå人çã«ã¯ããã®ã·ã¹ãã ï¼ç´ååãç´ç©åãåãæ§æã§æ¸ãï¼ã¯ç®ããé±ã¨ããããç²ç¹ã§ããã
ç¶ãã¦ã¯ãif ããªãç¹ã§ããå³å¯ã«ã¯ if ãã¼ã¯ã¼ãèªä½ã¯ãããã§ãããããã¾ã§ã case å¼ã®ä¸ã ãã§ä½¿ãããã®ã§ãæ¡ä»¶åå²ã¯ãã¹ã¦ case å¼ã§è¡ãã¾ãã
颿°åè¨èªãªã®ã§ããã¹ã¦ãå¼ã§ãããfor/while æã¯ãªããã«ã¼ããå帰å¼ã³åºãã§å®è£ ãã¾ãããif/else ããªãã®ã¯é©ãã¾ããã
case å¼ã®åã¢ã¼ã ã¯åãåã§ããå¿ è¦ããããããè¤éãªæ¡ä»¶å¼ã«ãªãã¨ã¡ãã£ã¨å®è£ ã«è©°ã¾ã£ãããã¾ããããããæ¡ä»¶å¼ãã·ã³ãã«ã«ä¿ã¨ãã¨ããå§åããããã®ã§ãå人çã«ã¯æ°ã«å ¥ã£ã¦ãã¾ãã
fn double_if_event(n: Int) -> Int { case n % 2 == 0 { True -> n * 2 False -> n } } [1, 2, 3] |> list.map(double_if_event) |> io.debug // => [1, 4, 3]
æå¾ã«ããã¤ãã®ãã¬ã¼ã¹ãã«ãã¼ã§ããã弿°ã®é çªã«ãã£ã¦ã¯ãã¤ããç¹ããã®ãé£ããã±ã¼ã¹ãããã®ã§ãä½ç½®ãæå®ããæ§æã§ãã
Clojure ã®ã¹ã¬ãããã¡ã¼ã¹ã/ã¹ã¬ããã©ã¹ããããæè»ãªæ¹æ³ã§ãããã¤ãã©ã¤ã³ã«æ¸¡ã£ã¦ãã弿°ãå¿
ãå
é ã«ããã¨ã¯éããªãã®ã§ã _ ãç¨ãã¦ä½ç½®ãæå®ãã¾ãã
ã³ã¼ããè¦ãã»ããã¯ããã§ãã
// pipe ãªã string.append("hello", string.append(", ", "world!")) // pipe ãã ", " |> string.append("world!") |> string.append("hello", _) // hello, world!
ãã¤ãæ¼ç®åã®ããè¨èªã§ã¯ãå¤ãã®å¦çããã¤ãã©ã¤ã³ã§æ¸ããã¨ã«ãªãã®ã§ãããããç´°ãã使ãåæã®è¯ãã¯ç©ã¿éãªã£ã¦ãçµæçã«å¤§ããªãã®ã«ãªãã¾ãã
ãããã«
ããã¼ãããã°ã©ãã³ã°è¨èªã£ã¦æ¬å½ã«ãããã®ã§ããã
æå¾ã«åæãã¤ã¾ãã§ã¿ãããã°ã©ã ã Nim, Clojure, Gleam ã§æ¸ãã¦ã¿ãã®ã§ãèå³ã®ããæ¹ã¯æ¯è¼ãã¦ãè¦ã¦ã¿ã¦ãã ããã
Nim
from std/strformat import fmt from std/sequtils import map, maxIndex import std/sugar type Bento = object name: string count: int proc toString(bento: Bento): string = return fmt"(name: {bento.name}, count: {bento.count})" type Bentos = openArray[Bento] proc report(i: int, bentos: Bentos) = echo fmt"{i + 1}åç®" for i in 0..bentos.high: echo toString(bentos[i]) func findMaxIndex(bentos: Bentos): int = bentos.map(b => b.count).maxIndex() proc snitchOne(bentos: var Bentos) = let i = findMaxIndex(bentos) if bentos[i].count > 0: dec(bentos[i].count) proc run() = var bentos = [ Bento(name: "åæã", count: 10), Bento(name: "åæã", count: 8), Bento(name: "åæã", count: 6), ] const tryCount = 5 for i in 0..<tryCount: snitchOne(bentos) report(i, bentos) when isMainModule: run()
Clojure
(ns karaage.core (:gen-class)) (require '[clojure.string :refer [join]]) (defrecord Bento [name count]) (defn- format-bento [bento] (format "(name: %s, count: %d)" (get bento :name) (get bento :count))) (defn- report [bentos n] (println (str (+ n 1) "åç®" "\n" (join "\n" (map format-bento bentos))))) (defn- find-max-count [bentos] (->> bentos (map :count) (apply max))) (defn- find-max-index [bentos map-fn] (let [maxVal (find-max-count bentos)] (->> (keep-indexed vector bentos) (filter #(= (map-fn (second %)) maxVal)) (ffirst)))) (defn- dec-count-unless-zero [bento] (if (> (get bento :count) 0) (update bento :count dec) bento)) (defn- snitch-one [bentos] (update bentos (find-max-index bentos #(get % :count)) dec-count-unless-zero)) (defn- do-run-while [count bentos] (loop [bentos (snitch-one bentos) n 0] (when (< n count) (report bentos n) (recur (snitch-one bentos) (inc n))))) (defn run [] (let [try-count 5 bentos [ (->Bento "åæã" 10) (->Bento "åæã" 8) (->Bento "åæã" 6)]] (do-run-while try-count bentos))) (defn -main [] (run))
Gleam
import gleam/function import gleam/int import gleam/io import gleam/list import gleam/option.{type Option, None, Some} import gleam/result type Bento { Bento(name: String, count: Int) } fn to_string(bento: Bento) -> String { "(name: " <> bento.name <> ", count: " <> int.to_string(bento.count) <> ")" } fn max_loop(ns: List(Int), n: Int) -> Option(Int) { case ns { [] -> None [a] -> Some(int.max(a, n)) [a, ..rest] -> max_loop(rest, int.max(a, n)) } } fn max(ns: List(Int)) -> Option(Int) { max_loop(ns, 0) } fn find_max_index(bentos: List(Bento), max: Int) -> Int { bentos |> list.index_map(fn(v, i) { #(v.count, i) }) |> list.key_find(max) |> result.unwrap(0) } fn dec_count(bentos: List(Bento), index: Int) -> List(Bento) { let bentos_with_index = list.index_map(bentos, fn(v, i) { #(i, v) }) let assert Ok(bento) = list.find(bentos_with_index, fn(item) { item.0 == index }) |> result.map(fn(v) { v.1 }) list.key_set( bentos_with_index, index, Bento(..bento, count: int.max(bento.count - 1, 0)), ) |> list.map(fn(v) { v.1 }) } fn snitch_one(bentos: List(Bento)) -> List(Bento) { let max_count = list.map(bentos, fn(bento) { bento.count }) |> max case max_count { None -> bentos Some(count) -> count |> find_max_index(bentos, _) |> dec_count(bentos, _) } } fn show(bentos: List(Bento), n: Int) { io.println(int.to_string(n + 1) <> "åç®") bentos |> list.each(fn(bento) { bento |> to_string |> io.println }) } fn run_while_loop(bentos: List(Bento), from: Int, to: Int) { case from >= to { True -> Nil False -> bentos |> snitch_one |> function.tap(fn(bentos) { show(bentos, from) }) |> run_while_loop(from + 1, to) } } fn run_while(bentos: List(Bento), try_count: Int) { run_while_loop(bentos, 0, try_count) } fn run() { let bentos = [ Bento("åæã", 10), Bento("åæã", 8), Bento("åæã", 6), ] let try_count = 5 run_while(bentos, try_count) } pub fn main() { run() }
Clojure ããã¡ã°ãçãæ¸ããã¨æã£ã¦ããã©ãNim ãæãçãè¡æ°ã§ããï¼Nim: 39, Clojure: 51, Gleam: 89ï¼ãæå¤ã
