Periodic table: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
(Added 11l)
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(23 intermediate revisions by 9 users not shown)
Line 342:
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|Chipmunk Basic}}===
{{works with|Chipmunk Basic|3.6.4}}
{{works with|BASICA}}
{{works with|GW-BASIC}}
{{works with|QBasic}}
<syntaxhighlight lang="qbasic">10 REM Periodic table
20 CLS
30 DIM a(7),b(7)
40 GOSUB 100
50 FOR j = 0 TO 9
60 READ anum : GOSUB 140
70 NEXT j
80 END
90 REM Set arrays A, B.
100 FOR i = 0 TO 7 : READ a(i) : NEXT i
110 FOR i = 0 TO 7 : READ b(i) : NEXT i
120 RETURN
130 REM Show row AND column FOR element
140 i = 7
150 WHILE a(i) > anum
160 i = i-1
170 WEND
180 m = anum+b(i)
190 r = INT(m/18)+1
200 c = m MOD 18+1
210 PRINT anum "-> " r c
220 RETURN
230 REM DATA
240 REM Arrays A, B.
250 DATA 1,2,5,13,57,72,89,104
260 DATA -1,15,25,35,72,21,58,7
270 REM Example elements (atomic numbers).
280 DATA 1,2,29,42,57,58,72,89,90,103</syntaxhighlight>
{{out}}
<pre>Same as GW-BASIC entry.</pre>
 
==={{header|Craft Basic}}===
<syntaxhighlight lang="basic">gosubdim fillarraysa[1, 2, 5, 13, 57, 72, 89, 104]
dim b[-1, 15, 25, 35, 72, 21, 58, 7]
gosub setupwindow
 
title "Periodic Table Search"
resize 0, 0, 220, 140
center
 
formid 1
formtext "Search"
buttonform 55, 40, 100, 20
 
formid 2
formtext ""
staticform 1, 1, 220, 20
 
do
 
if (forms) = 1 then
 
gosub searchtable
Line 362 ⟶ 410:
 
end
 
sub fillarrays
 
dim a[1, 2, 5, 13, 57, 72, 89, 104]
dim b[-1, 15, 25, 35, 72, 21, 58, 7]
 
return
 
sub setupwindow
 
title "Periodic Table Search"
 
resize 0, 0, 220,130
center
 
formid 1
formtext "Search"
buttonform 55, 40, 100, 20
 
formid 2
formtext ""
staticform 1, 1, 220, 20
 
return
 
sub searchtable
Line 400 ⟶ 424:
 
let m = e + b[i]
let r = int(m / 18) + 1
let rc = int:(m r% 18) + 1
let c = m % 18
let c = int: c + 1
 
formid 2
formtext "Period: ", r , comma, " Group: ", c
updateform
 
Line 693 ⟶ 715:
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|Quite BASIC}}===
{{trans|Minimal BASIC}}
<syntaxhighlight lang="qbasic">10 REM Periodic table
20 GOSUB 200
30 FOR J = 0 TO 9
40 READ N
50 GOSUB 400
60 NEXT J
70 END
190 REM Set arrays A, B.
200 ARRAY A
210 LET A[0] = 1
215 LET A[1] = 2
220 LET A[2] = 5
225 LET A[3] = 13
230 LET A[4] = 57
235 LET A[5] = 72
240 LET A[6] = 89
245 LET A[7] = 104
246 ARRAY B
250 LET B[0] = -1
255 LET B[1] = 15
260 LET B[2] = 25
265 LET B[3] = 35
270 LET B[4] = 72
275 LET B[5] = 21
280 LET B[6] = 58
285 LET B[7] = 7
290 RETURN
390 REM Show row and column for element
400 LET I = 7
410 IF A(I) <= N THEN 440
420 LET I = I-1
430 GOTO 410
440 LET M = N+B(I)
450 LET R = INT(M/18)+1
460 LET C = M-INT(M/18)*18+1
470 PRINT N; " -> "; R; " "; C
480 RETURN
1030 REM Example elements (atomic numbers).
1040 DATA 1, 2, 29, 42, 57, 58, 72, 89, 90, 103</syntaxhighlight>
 
==={{header|Run BASIC}}===
Line 800 ⟶ 864:
{{out}}
<pre>Similar to FreeBASIC entry.</pre>
 
==={{header|uBasic/4tH}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="uBasic/4tH">Dim @a(8)
Dim @b(8)
Dim @e(13)
 
Push 1, 2, 5, 13, 57, 72, 89, 104 ' load array A
For x = Used()-1 to 0 Step -1 : @a(x) = Pop() : Next
 
Push -1, 15, 25, 35, 72, 21, 58, 7 ' load array B
For x = Used()-1 to 0 Step -1 : @b(x) = Pop() : Next
' load array E
Push 1, 2, 29, 42, 57, 58, 59, 71, 72, 89, 90, 103, 113 : s = Used()-1
For x = s to 0 Step -1 : @e(x) = Pop() : Next
 
For x = 0 To s
Proc _MostarPos(@e(x))
Next
 
End
 
_MostarPos
Param (1)
Local (4)
 
c@ = 7
Do While @a(c@) > a@
c@ = c@ - 1
Loop
 
b@ = a@ + @b(c@)
d@ = (b@ / 18) + 1
e@ = (b@ % 18) + 1
Print Using "Atomic number __#"; a@; Using " -> _#"; d@; Using ", _#"; e@
Return</syntaxhighlight>
{{Out}}
<pre>Atomic number 1 -> 1, 1
Atomic number 2 -> 1, 18
Atomic number 29 -> 4, 11
Atomic number 42 -> 5, 6
Atomic number 57 -> 8, 4
Atomic number 58 -> 8, 5
Atomic number 59 -> 8, 6
Atomic number 71 -> 8, 18
Atomic number 72 -> 6, 4
Atomic number 89 -> 9, 4
Atomic number 90 -> 9, 5
Atomic number 103 -> 9, 18
Atomic number 113 -> 7, 13
 
0 OK, 0:468</pre>
 
==={{header|XBasic}}===
Line 1,246 ⟶ 1,362:
9,15,232,40,102,No,Nobelio,259,0,0,0,0,642.0,1.30,[Rn]5f¹⁴7s²,+3+2
</pre>
 
=={{header|C++}}==
<syntaxhighlight lang="c++">
#include <cstdint>
#include <iomanip>
#include <iostream>
#include <stdexcept>
#include <vector>
 
struct Group {
int32_t first;
int32_t last;
};
 
struct Position{
int32_t period;
int32_t group;
};
 
const std::vector<Group> GROUPS = { Group(3, 10), Group(11, 18),
Group(19, 36), Group(37, 54), Group(55, 86), Group(87, 118) };
 
Position periodic_table(const int32_t& atomic_number) {
if ( atomic_number < 1 || atomic_number > 118 ) {
throw std::invalid_argument("Atomic number is out of range:" + atomic_number);
}
 
if ( atomic_number == 1 ) { // Hydrogen
return Position(1, 1);
}
if ( atomic_number == 2 ) { // Helium
return Position(1, 18);
}
if ( atomic_number >= 57 && atomic_number <= 71 ) { // Lanthanides
return Position(8, atomic_number - 53);
}
if ( atomic_number >= 89 && atomic_number <= 103 ) { // Actinides
return Position(9, atomic_number - 85);
}
 
int32_t period = 0;
int32_t periodFirst = 0;
int32_t periodLast = 0;
for ( uint64_t i = 0; i < GROUPS.size() && period == 0; ++i ) {
Group group = GROUPS[i];
if ( atomic_number >= group.first && atomic_number <= group.last ) {
period = i + 2;
periodFirst = group.first;
periodLast = group.last;
}
}
 
if ( atomic_number < periodFirst + 2 || period == 4 || period == 5 ) {
return Position(period, atomic_number - periodFirst + 1);
}
return Position(period, atomic_number - periodLast + 18);
}
 
int main() {
for ( int32_t atomic_number : { 1, 2, 29, 42, 57, 58, 59, 71, 72, 89, 90, 103, 113 } ) {
Position position = periodic_table(atomic_number);
std::cout << "Atomic number " << std::left << std::setw(3) << atomic_number
<< " -> " << position.period << ", " << position.group << std::endl;
}
}
</syntaxhighlight>
{{ out }}
<pre>
Atomic number 1 -> 1, 1
Atomic number 2 -> 1, 18
Atomic number 29 -> 4, 11
Atomic number 42 -> 5, 6
Atomic number 57 -> 8, 4
Atomic number 58 -> 8, 5
Atomic number 59 -> 8, 6
Atomic number 71 -> 8, 18
Atomic number 72 -> 6, 4
Atomic number 89 -> 9, 4
Atomic number 90 -> 9, 5
Atomic number 103 -> 9, 18
Atomic number 113 -> 7, 13
</pre>
 
=={{header|EasyLang}}==
<syntaxhighlight>
proc mpos n . .
a[] = [ 1 2 5 13 57 72 89 104 ]
b[] = [ -1 15 25 35 72 21 58 7 ]
i = len a[]
while a[i] > n
i -= 1
.
m = n + b[i]
r = m div 18 + 1
c = m mod 18 + 1
print "Atomic number " & n & "-> " & r & ", " & c
.
elem[] = [ 1 2 29 42 57 58 59 71 72 89 90 103 113 ]
for e in elem[]
mpos e
.
</syntaxhighlight>
 
 
=={{header|FutureBasic}}==
Line 1,320 ⟶ 1,539:
{{output}}
[[File:Periodic Table FutureBasic.png]]
 
 
=={{header|Go}}==
Line 1,432 ⟶ 1,650:
9 4</syntaxhighlight>
 
=={{header|Java}}==
<syntaxhighlight lang="java">
import java.util.List;
 
public final class PeriodicTable {
 
public static void main(String[] aArgs) {
for ( int atomicNumber : List.of( 1, 2, 29, 42, 57, 58, 59, 71, 72, 89, 90, 103, 113 ) ) {
Position position = periodicTable(atomicNumber);
System.out.println(String.format("%s%-3d%s%d%s%d",
"Atomic number ", atomicNumber, " -> ", position.period, ", ", position.group));
}
}
private static Position periodicTable(int aAtomicNumber) {
if ( aAtomicNumber < 1 || aAtomicNumber > 118 ) {
throw new IllegalArgumentException("Atomic number is out of range:" + aAtomicNumber);
}
if ( aAtomicNumber == 1 ) { // Hydrogen
return new Position(1, 1);
}
if ( aAtomicNumber == 2 ) { // Helium
return new Position(1, 18);
}
if ( aAtomicNumber >= 57 && aAtomicNumber <= 71 ) { // Lanthanides
return new Position(8, aAtomicNumber - 53);
}
if ( aAtomicNumber >= 89 && aAtomicNumber <= 103 ) { // Actinides
return new Position(9, aAtomicNumber - 85);
}
int period = 0;
int periodFirst = 0;
int periodLast = 0;
for ( int i = 0; i < GROUPS.size() && period == 0; i++ ) {
Group group = GROUPS.get(i);
if ( aAtomicNumber >= group.first && aAtomicNumber <= group.last ) {
period = i + 2;
periodFirst = group.first;
periodLast = group.last;
}
}
if ( aAtomicNumber < periodFirst + 2 || period == 4 || period == 5 ) {
return new Position(period, aAtomicNumber - periodFirst + 1);
}
return new Position(period, aAtomicNumber - periodLast + 18);
}
private static record Group(int first, int last) {}
private static record Position(int period, int group) {}
private static final List<Group> GROUPS = List.of( new Group(3, 10), new Group(11, 18),
new Group(19, 36), new Group(37, 54), new Group(55, 86), new Group(87, 118) );
 
}
</syntaxhighlight>
{{ out }}
<pre>
Atomic number 1 -> 1, 1
Atomic number 2 -> 1, 18
Atomic number 29 -> 4, 11
Atomic number 42 -> 5, 6
Atomic number 57 -> 8, 4
Atomic number 58 -> 8, 5
Atomic number 59 -> 8, 6
Atomic number 71 -> 8, 18
Atomic number 72 -> 6, 4
Atomic number 89 -> 9, 4
Atomic number 90 -> 9, 5
Atomic number 103 -> 9, 18
Atomic number 113 -> 7, 13
</pre>
 
=={{header|jq}}==
{{trans|Wren}}
{{works with|jq}}
'''Also works with gojq, the Go implementation of jq'''
 
After making minor tweaks to two lines, the following program also works with jaq, the Rust implementation of jq.
 
See the disclaimer at [[#Wren|Wren]].
<syntaxhighlight lang=jq>
def limits: [[3,10], [11,18], [19,36], [37,54], [55,86], [87,118]];
 
def periodicTable(n):
if (n < 1 or n > 118) then "Atomic number is out of range." | error
elif n == 1 then [1, 1]
elif n == 2 then [1, 18]
elif (n >= 57 and n <= 71) then [8, n - 53]
elif (n >= 89 and n <= 103) then [9, n - 85]
else
first( range( 0; limits|length) as $i
| limits[$i] as $limit
| if (n >= $limit[0] and n <= $limit[1])
then {row: ($i + 2),
start: $limit[0],
end: $limit[1] }
else empty
end)
| if (n < .start + 2 or .row == 4 or .row == 5)
then [.row, n - .start + 1]
else [.row, n - .end + 18]
end
end;
 
def lpad($len): tostring | ($len - length) as $l | (" " * $l)[:$l] + .;
 
(1, 2, 29, 42, 57, 58, 59, 71, 72, 89, 90, 103, 113) as $n
| periodicTable($n) as [$r, $c]
| "Atomic number \($n|lpad(3)) -> \($r) \($c)"
 
</syntaxhighlight>
'''Invocation''': jq -nr -f periodic-table.jq
{{output}}
<pre>
Atomic number 1 -> 1 1
Atomic number 2 -> 1 18
Atomic number 29 -> 4 11
Atomic number 42 -> 5 6
Atomic number 57 -> 8 4
Atomic number 58 -> 8 5
Atomic number 59 -> 8 6
Atomic number 71 -> 8 18
Atomic number 72 -> 6 4
Atomic number 89 -> 9 4
Atomic number 90 -> 9 5
Atomic number 103 -> 9 18
Atomic number 113 -> 7 13
</pre>
 
=={{header|Julia}}==
Line 1,508 ⟶ 1,857:
 
[graphical representation of the periodic table positions]</pre>
 
=={{header|Nim}}==
{{trans|Wren}}
<syntaxhighlight lang="Nim">import std/strformat
 
const Limits = [3..10, 11..18, 19..36, 37..54, 55..86, 87..118]
 
func periodicTable(n: Positive): (int, int) =
doAssert n in 1..118, "Atomic number is out of range."
if n == 1: return (1, 1)
if n == 2: return (1, 18)
if n in 57..71: return (8, n - 53)
if n in 89..103: return (9, n - 85)
var row, start, stop = 0
for i, limit in Limits:
if n in limit:
row = i + 2
start = limit.a
stop = limit.b
break
if n < start + 2 or row == 4 or row == 5:
return (row, n - start + 1)
result = (row, n - stop + 18)
 
for n in [1, 2, 29, 42, 57, 58, 59, 71, 72, 89, 90, 103, 113]:
let (row, col) = periodicTable(n)
echo &"Atomic number {n:3} → {row}, {col}"
</syntaxhighlight>
 
{{out}}
<pre>Atomic number 1 → 1, 1
Atomic number 2 → 1, 18
Atomic number 29 → 4, 11
Atomic number 42 → 5, 6
Atomic number 57 → 8, 4
Atomic number 58 → 8, 5
Atomic number 59 → 8, 6
Atomic number 71 → 8, 18
Atomic number 72 → 6, 4
Atomic number 89 → 9, 4
Atomic number 90 → 9, 5
Atomic number 103 → 9, 18
Atomic number 113 → 7, 13
</pre>
 
=={{header|Perl}}==
Line 1,769 ⟶ 2,162:
 
</syntaxhighlight>
 
=={{header|Quackery}}==
 
A lookup table is precomputed at compile time from a representation of the periodic table.
 
<syntaxhighlight lang="Quackery"> [ dup 1 119 within not if
[ $ "Unknown element." fail ]
[ table 0
[ 118 times
[ i^ 1+
' [ 1 - - - - - - - - - - - - - - - - 2
3 4 - - - - - - - - - - 5 6 7 8 9 10
11 12 - - - - - - - - - - 13 14 15 16 17 18
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
55 56 - 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
87 88 - 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
- - - 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
- - - 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 ]
find 18 /mod 1+ dip 1+
join nested swap dip join ] ] now! ] ] is task ( n --> [ )
 
' [ 1 2 29 42 57 58 59 71 72 89 90 103 113 ]
witheach [ dup echo say " -> " task echo cr ]</syntaxhighlight>
 
{{out}}
 
<pre>1 -> [ 1 1 ]
2 -> [ 1 18 ]
29 -> [ 4 11 ]
42 -> [ 5 6 ]
57 -> [ 8 4 ]
58 -> [ 8 5 ]
59 -> [ 8 6 ]
71 -> [ 8 18 ]
72 -> [ 6 4 ]
89 -> [ 9 4 ]
90 -> [ 9 5 ]
103 -> [ 9 18 ]
113 -> [ 7 13 ]
</pre>
 
We can confirm that the lookup table was created during compilation by decompiling the word <code>task</code> with <code>' task copy unbuild echo$</code>.
 
{{out}}
 
<pre>[ dup 1 119 within not if [ [ ' [ 85 110 107 110 111 119 110 32 101 108 101 109 101 110 116 ] ] fail ] [ table 0 [ 1 1 ] [ 1 18 ] [ 2 1 ] [ 2 2 ] [ 2 13 ] [ 2 14 ] [ 2 15 ] [ 2 16 ] [ 2 17 ] [ 2 18 ] [ 3 1 ] [ 3 2 ] [ 3 13 ] [ 3 14 ] [ 3 15 ] [ 3 16 ] [ 3 17 ] [ 3 18 ] [ 4 1 ] [ 4 2 ] [ 4 3 ] [ 4 4 ] [ 4 5 ] [ 4 6 ] [ 4 7 ] [ 4 8 ] [ 4 9 ] [ 4 10 ] [ 4 11 ] [ 4 12 ] [ 4 13 ] [ 4 14 ] [ 4 15 ] [ 4 16 ] [ 4 17 ] [ 4 18 ] [ 5 1 ] [ 5 2 ] [ 5 3 ] [ 5 4 ] [ 5 5 ] [ 5 6 ] [ 5 7 ] [ 5 8 ] [ 5 9 ] [ 5 10 ] [ 5 11 ] [ 5 12 ] [ 5 13 ] [ 5 14 ] [ 5 15 ] [ 5 16 ] [ 5 17 ] [ 5 18 ] [ 6 1 ] [ 6 2 ] [ 8 4 ] [ 8 5 ] [ 8 6 ] [ 8 7 ] [ 8 8 ] [ 8 9 ] [ 8 10 ] [ 8 11 ] [ 8 12 ] [ 8 13 ] [ 8 14 ] [ 8 15 ] [ 8 16 ] [ 8 17 ] [ 8 18 ] [ 6 4 ] [ 6 5 ] [ 6 6 ] [ 6 7 ] [ 6 8 ] [ 6 9 ] [ 6 10 ] [ 6 11 ] [ 6 12 ] [ 6 13 ] [ 6 14 ] [ 6 15 ] [ 6 16 ] [ 6 17 ] [ 6 18 ] [ 7 1 ] [ 7 2 ] [ 9 4 ] [ 9 5 ] [ 9 6 ] [ 9 7 ] [ 9 8 ] [ 9 9 ] [ 9 10 ] [ 9 11 ] [ 9 12 ] [ 9 13 ] [ 9 14 ] [ 9 15 ] [ 9 16 ] [ 9 17 ] [ 9 18 ] [ 7 4 ] [ 7 5 ] [ 7 6 ] [ 7 7 ] [ 7 8 ] [ 7 9 ] [ 7 10 ] [ 7 11 ] [ 7 12 ] [ 7 13 ] [ 7 14 ] [ 7 15 ] [ 7 16 ] [ 7 17 ] [ 7 18 ] ] ]
 
</pre>
 
=={{header|Raku}}==
Line 1,850 ⟶ 2,292:
72 -> 6 4
89 -> 9 4</pre>
 
=={{header|V (Vlang)}}==
{{trans|Wren}}
<syntaxhighlight lang="Zig">
import log
 
const limits = [[3, 10], [11, 18], [19, 36], [37, 54], [55, 86], [87, 118]]
 
fn main() {
for n in [1, 2, 29, 42, 57, 58, 59, 71, 72, 89, 90, 103, 113] {
row, col := periodic_table(n)
println("Atomic number ${n} -> ${row}, ${col}")
}
}
 
fn periodic_table(n int) (int, int) {
mut logged := log.Log{}
mut limit := []int{}
mut row, mut start, mut end := 0, 0, 0
if n < 1 || n > 118 {logged.fatal("Atomic number is out of range.")}
if n == 1 {return 1, 1}
if n == 2 {return 1, 18}
if n >= 57 && n <= 71 {return 8, n - 53}
if n >= 89 && n <= 103 {return 9, n - 85}
for i := 0; i < limits.len; i++ {
limit = limits[i]
if n >= limit[0] && n <= limit[1] {
row, start, end = i + 2, limit[0], limit[1]
break
}
}
if n < start + 2 || row == 4 || row == 5 {return row, n - start + 1}
return row, n - end + 18
}
</syntaxhighlight>
 
{{out}}
<pre>
Atomic number 1 -> 1, 1
Atomic number 2 -> 1, 18
Atomic number 29 -> 4, 11
Atomic number 42 -> 5, 6
Atomic number 57 -> 8, 4
Atomic number 58 -> 8, 5
Atomic number 59 -> 8, 6
Atomic number 71 -> 8, 18
Atomic number 72 -> 6, 4
Atomic number 89 -> 9, 4
Atomic number 90 -> 9, 5
Atomic number 103 -> 9, 18
Atomic number 113 -> 7, 13
</pre>
 
=={{header|Wren}}==
{{libheader|Wren-fmt}}
There is a discrepancy between how the periodic table is arranged in the Wikipedia article and how it is arranged in the task description. I've used the latter in the following script.
<syntaxhighlight lang="ecmascriptwren">import "./fmt" for Fmt
 
var limits = [3..10, 11..18, 19..36, 37..54, 55..86, 87..118]
9,476

edits