Balanced ternary: Difference between revisions

m
Automated syntax highlighting fixup (second round - minor fixes)
m (syntax highlighting fixup automation)
m (Automated syntax highlighting fixup (second round - minor fixes))
Line 29:
{{trans|Python}}
 
<syntaxhighlight lang="11l">F py_idiv(a, b)
I a >= 0
R a I/ b
Line 131:
=={{header|Ada}}==
Specifications (bt.ads):
<syntaxhighlight lang=Ada"ada">with Ada.Finalization;
 
package BT is
Line 180:
 
Implementation (bt.adb):
<syntaxhighlight lang=Ada"ada">with Ada.Unchecked_Deallocation;
 
package body BT is
Line 363:
 
Test task requirements (testbt.adb):
<syntaxhighlight lang=Ada"ada">with Ada.Text_Io; use Ada.Text_Io;
with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;
with BT; use BT;
Line 399:
To demonstrate the possibility, the ''integerFromBT'' and ''negateBT'' handlers here work by being tricksy with the characters' Unicode numbers. It's a more efficient way to deal with the characters. But I'm not sure how this'll be taken ''vis-à-vis'' not converting to native integers first, so the remaining handlers use a strictly if-then string comparison approach. Applescript's quite happy to convert automatically between integers, reals, numeric strings, and single-item lists containing numbers, so ''BTFromInteger'' accepts any of these forms, but the numbers represented must be whole-number values and must be small enough not to error AppleScript's ''as integer'' coercion. This coercion is error free for numbers in the range -(2 ^ 31) to 2 ^ 31 - 1, although actual integer class objects can only represent numbers in the range -(2 ^ 29) to 2 ^ 29 - 1. ''IntegerFromBT'' doesn't currently impose any integer-class size limit on its output.
 
<syntaxhighlight lang="applescript">-- Build a balanced ternary, as text, from an integer value or acceptable AppleScript substitute.
on BTFromInteger(n)
try
Line 569:
 
{{output}}
<syntaxhighlight lang="applescript">"a = 523
b = -436
c = 65
Line 575:
 
=={{header|ATS}}==
<syntaxhighlight lang=ATS"ats">
(*
** This one is
Line 799:
 
=={{header|AutoHotkey}}==
<syntaxhighlight lang=AutoHotkey"autohotkey">BalancedTernary(n){
k = 0
if abs(n)<2
Line 821:
return r
}</syntaxhighlight>
Examples:<syntaxhighlight lang=AutoHotkey"autohotkey">data =
(
523
Line 840:
=={{header|C}}==
{{trans|Perl}}
<syntaxhighlight lang="c">#include <stdio.h>
#include <string.h>
 
Line 1,049:
 
=={{header|C sharp|C#}}==
<syntaxhighlight lang="csharp">using System;
using System.Text;
using System.Collections.Generic;
Line 1,287:
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">#include <iostream>
#include <string>
#include <climits>
Line 1,511:
 
=={{header|Common Lisp}}==
<syntaxhighlight lang="lisp">;;; balanced ternary
;;; represented as a list of 0, 1 or -1s, with least significant digit first
Line 1,603:
(bt-integer b) (bt-string b)
(bt-integer c) (bt-string c)
(bt-integer d) (bt-string d)))</syntaxhighlight>output<syntaxhighlight lang="text">a 523 +-0++0+
b -436 -++-0--
c 65 +-++-
Line 1,610:
=={{header|D}}==
{{trans|Python}}
<syntaxhighlight lang="d">import std.stdio, std.bigint, std.range, std.algorithm;
 
struct BalancedTernary {
Line 1,762:
=={{header|Elixir}}==
{{trans|Erlang}}
<syntaxhighlight lang="elixir">defmodule Ternary do
def to_string(t), do: ( for x <- t, do: to_char(x) ) |> List.to_string
Line 1,846:
 
=={{header|Erlang}}==
<syntaxhighlight lang="erlang">
-module(ternary).
-compile(export_all).
Line 1,938:
</syntaxhighlight>
'''Output'''
<syntaxhighlight lang="erlang">
234> ternary:test().
A = +-0++0+ -> 523
Line 1,953:
{{trans|Common Lisp}}
{{works with|Factor|0.98}}
<syntaxhighlight lang="factor">USING: kernel combinators locals formatting lint literals
sequences assocs strings arrays
math math.functions math.order ;
Line 2,016:
"a*(b-c)" d bt>integer d bt>string "%s: %d, %s\n" printf
]</syntaxhighlight>
<syntaxhighlight lang="text">a: 523, +-0++0+
b: -436, -++-0--
c: 65, +-++-
Line 2,023:
=={{header|FreeBASIC}}==
{{trans|Liberty BASIC}}
<syntaxhighlight lang="freebasic">
#define MAX(a, b) iif((a) > (b), (a), (b))
Dim Shared As Integer pow, signo
Line 2,280:
</pre>
'''A crude English/Pidgin Algol translation of the above [[:Category:Glagol]] code.'''
<syntaxhighlight lang="algol68">PROGRAM Setun+;
USES
Parameter IS "...\Departments\Exchange\"
Line 2,395:
 
=={{header|Go}}==
<syntaxhighlight lang="go">package main
 
import (
Line 2,629:
=={{header|Groovy}}==
Solution:
<syntaxhighlight lang="groovy">enum T {
m('-', -1), z('0', 0), p('+', 1)
 
Line 2,791:
 
Test:
<syntaxhighlight lang="groovy">BalancedTernaryInteger a = new BalancedTernaryInteger('+-0++0+')
BalancedTernaryInteger b = new BalancedTernaryInteger(-436)
BalancedTernaryInteger c = new BalancedTernaryInteger(T.p, T.m, T.p, T.p, T.m)
Line 2,831:
=={{header|Haskell}}==
BTs are represented internally as lists of digits in integers from -1 to 1, but displayed as "+-0" strings.
<syntaxhighlight lang="haskell">data BalancedTernary = Bt [Int]
 
zeroTrim a = if null s then [0] else s where
Line 2,895:
 
Works in both languages:
<syntaxhighlight lang="unicon">procedure main()
a := "+-0++0+"
write("a = +-0++0+"," = ",cvtFromBT("+-0++0+"))
Line 3,000:
Implementation:
 
<syntaxhighlight lang="j">trigits=: 1+3 <.@^. 2 * 1&>.@|
trinOfN=: |.@((_1 + ] #: #.&1@] + [) #&3@trigits) :. nOfTrin
nOfTrin=: p.&3 :. trinOfN
Line 3,029:
Definitions for example:
 
<syntaxhighlight lang="j">a=: trinOfStr '+-0++0+'
b=: trinOfN -436
c=: trinOfStr '+-++-'</syntaxhighlight>
Line 3,035:
Required example:
 
<syntaxhighlight lang="j"> nOfTrin&> a;b;c
523 _436 65
 
Line 3,044:
 
=={{header|Java}}==
<syntaxhighlight lang="java">
/*
* Test case
Line 3,271:
{{trans|Python}}
 
<syntaxhighlight lang="julia">struct BalancedTernary <: Signed
digits::Vector{Int8}
end
Line 3,365:
=={{header|Kotlin}}==
This is based on the Java entry. However, I've added 'BigInteger' support as this is a current requirement of the task description even though it's not actually needed to process the test case:
<syntaxhighlight lang="scala">// version 1.1.3
 
import java.math.BigInteger
Line 3,519:
 
=={{header|Liberty BASIC}}==
<syntaxhighlight lang="lb">
global tt$
tt$="-0+" '-1 0 1; +2 -> 1 2 3, instr
Line 3,672:
=={{header|Lua}}==
{{trans|C}}
<syntaxhighlight lang="lua">function to_bt(n)
local d = { '0', '+', '-' }
local v = { 0, 1, -1 }
Line 3,825:
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">frombt = FromDigits[StringCases[#, {"+" -> 1, "-" -> -1, "0" -> 0}],
3] &;
tobt = If[Quotient[#, 3, -1] == 0,
Line 3,848:
"0", #0[#1, StringDrop[#2, -1]] <> "0"]] &;</syntaxhighlight>
Examples:
<syntaxhighlight lang="mathematica">frombt[a = "+-0++0+"]
b = tobt@-436
frombt[c = "+-++-"]
Line 3,863:
=={{header|МК-61/52}}==
{{trans|Glagol}}
<syntaxhighlight lang="mk-61">ЗН П2 Вx |x| П0 0 П3 П4 1 П5
ИП0 /-/ x<0 80
ИП0 ^ ^ 3 / [x] П0 3 * - П1
Line 3,879:
 
=={{header|Nim}}==
<syntaxhighlight lang=Nim"nim">import strformat
import tables
 
Line 4,074:
 
=={{header|OCaml}}==
<syntaxhighlight lang="ocaml">type btdigit = Pos | Zero | Neg
type btern = btdigit list
 
Line 4,133:
 
=={{header|Perl}}==
<syntaxhighlight lang="perl">use strict;
use warnings;
 
Line 4,218:
Using strings to represent balanced ternary. Note that as implemented dec2bt and bt2dec are limited to Phix integers (~+/-1,000,000,000),
but it would probably be pretty trivial (albeit quite a bit slower) to replace them with (say) ba2bt and bt2ba which use/yield bigatoms.
<!--<syntaxhighlight lang=Phix"phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">bt2dec</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">bt</span><span style="color: #0000FF;">)</span>
Line 4,323:
show it manages a 5000+digit multiplication and subtraction in about 0.2s, which I say is "reasonable", given that I didn't try very hard,
as evidenced by that daft addition lookup table!
<!--<syntaxhighlight lang=Phix"phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">t0</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()</span>
Line 4,349:
 
=={{header|PicoLisp}}==
<syntaxhighlight lang=PicoLisp"picolisp">(seed (in "/dev/urandom" (rd 8)))
 
(setq *G '((0 -1) (1 -1) (-1 0) (0 0) (1 0) (-1 1) (0 1)))
Line 4,477:
'''The conversion.'''<br>
Library '''clpfd''' is used so that '''bt_convert''' works in both ways Decimal => Ternary and Ternary ==> Decimal.
<syntaxhighlight lang=Prolog"prolog">:- module('bt_convert.pl', [bt_convert/2,
op(950, xfx, btconv),
btconv/2]).
Line 4,547:
'''The addition.''' <br>
The same predicate is used for addition and substraction.
<syntaxhighlight lang=Prolog"prolog">:- module('bt_add.pl', [bt_add/3,
bt_add1/3,
op(900, xfx, btplus),
Line 4,674:
We give a predicate '''euclide(?A, +B, ?Q, ?R)''' which computes both the multiplication and the division, but it is very inefficient.<br>
The predicates '''multiplication(+B, +Q, -A)''' and '''division(+A, +B, -Q, -R)''' are much more efficient.
<syntaxhighlight lang=Prolog"prolog">:- module('bt_mult.pl', [op(850, xfx, btmult),
btmult/2,
multiplication/3
Line 4,864:
=={{header|Python}}==
{{trans|Common Lisp}}
<syntaxhighlight lang="python">class BalancedTernary:
# Represented as a list of 0, 1 or -1s, with least significant digit first.
 
Line 4,966:
 
=={{header|Racket}}==
<syntaxhighlight lang="racket">#lang racket
 
;; Represent a balanced-ternary number as a list of 0's, 1's and -1's.
Line 5,054:
(formerly Perl 6)
{{Works with|rakudo|2017.01}}
<syntaxhighlight lang="raku" linesline>class BT {
has @.coeff;
 
Line 5,125:
=={{header|REXX}}==
The REXX program could be optimized by using &nbsp; (procedure) with &nbsp; '''expose''' &nbsp; and having the &nbsp; <big>'''$.'''</big> &nbsp; and &nbsp; <big>'''@.'''</big> &nbsp; variables set only once.
<syntaxhighlight lang="rexx">/*REXX program converts decimal ◄───► balanced ternary; it also performs arithmetic. */
numeric digits 10000 /*be able to handle gihugic numbers. */
Ao = '+-0++0+' ; Abt = Ao /* [↓] 2 literals used by subroutine*/
Line 5,186:
 
=={{header|Ruby}}==
<syntaxhighlight lang="ruby">class BalancedTernary
include Comparable
def initialize(str = "")
Line 5,319:
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">use std::{
cmp::min,
convert::{TryFrom, TryInto},
Line 5,588:
=={{header|Scala}}==
This implementation represents ternaries as a reversed list of bits. Also, there are plenty of implicit convertors
<syntaxhighlight lang="scala">
object TernaryBit {
val P = TernaryBit(+1)
Line 5,678:
 
Then these classes can be used in the following way:
<syntaxhighlight lang="scala">
object Main {
 
Line 5,703:
 
Besides, we can easily check, that the code works for any input. This can be achieved with ScalaCheck:
<syntaxhighlight lang="scala">
object TernarySpecification extends Properties("Ternary") {
 
Line 5,729:
=={{header|Tcl}}==
This directly uses the printable representation of the balanced ternary numbers, as Tcl's string operations are reasonably efficient.
<syntaxhighlight lang="tcl">package require Tcl 8.5
 
proc bt-int b {
Line 5,787:
}</syntaxhighlight>
Demonstration code:
<syntaxhighlight lang="tcl">for {set i 0} {$i<=10} {incr i} {puts "$i = [int-bt $i]"}
puts "'+-+'+'+--' = [bt-add +-+ +--] = [bt-int [bt-add +-+ +--]]"
puts "'++'*'++' = [bt-mul ++ ++] = [bt-int [bt-mul ++ ++]]"
Line 5,818:
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<syntaxhighlight lang="vbnet">Imports System.Text
 
Module Module1
Line 6,016:
{{libheader|Wren-big}}
{{libheader|Wren-trait}}
<syntaxhighlight lang="ecmascript">import "/big" for BigInt
import "/trait" for Comparable
 
10,327

edits