Data update

This commit is contained in:
Ingy döt Net 2025-02-27 18:35:13 -05:00
parent 8e4e15fa56
commit 72eb4943cb
1853 changed files with 35514 additions and 9441 deletions

View file

@ -13,4 +13,3 @@ Few people know p(20), generously I shall award an extra credit for anyone doing
# [https://web.archive.org/web/20240525075316/https://www.bbvaopenmind.com/en/science/mathematics/bill-gates-and-the-pancake-problem/ Bill Gates and the pancake problem]
# [https://oeis.org/A058986 A058986]
<br><br>

View file

@ -0,0 +1,393 @@
/* ARM assembly Raspberry PI */
/* program pancake number */
/* */
/* REMARK 1 : this program use routines in a include file
see task Include a file language arm assembly
for the routine affichageMess conversion10
see at end of this program the instruction include */
/* for constantes see task include a file in arm assembly */
/************************************/
/* Constantes */
/************************************/
.include "../constantes.inc"
.equ NBPANCAKEMAX, 30
.equ NBQUEUEITEM, 5000000
.equ NBVALUEMAX, 15
.equ NUMPAN, 10
/************************************/
/* Macros */
/************************************/
//.include "../../ficmacros32.inc" @ use for developper debugging
/*******************************************/
/* Structures */
/********************************************/
/* structure pancake flip*/
.struct 0
Pan_left: @ next element left
.struct Pan_left + 4
Pan_right: @ next element right
.struct Pan_right + 4
Pan_value: @
.struct Pan_value + NBVALUEMAX
Pan_flips:
.struct Pan_flips + 1 @ flips counter
Pan_end:
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessStart: .asciz "Program 32 bits start.\n"
szMessFinOK: .asciz "Program normal end. \n"
szMessError: .asciz "ERROR array flips too small.\n"
szMessErrnotFind: .asciz "Address not find in area.\n"
szCarriageReturn: .asciz "\n"
szMessResHead: .asciz "Pancake : @ "
szMessResLib: .asciz "Flips : @ example : "
sMessResult: .asciz " @,"
.align 4
QueuePancake: .skip 4 * NBQUEUEITEM
EndQueuePancake:
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
sZoneConv: .skip 24
iCptMax: .skip 4
iAdddressMax: .skip 4
Pancakes: .skip 4 * NBPANCAKEMAX
arrayFlips: .skip Pan_end * NBQUEUEITEM
iQueueStart: .skip 4 @ queue start pointer
iQueueEnd: .skip 4 @ queue end pointer
areaFlipTemp: .skip 4+NBVALUEMAX
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: @ entry of program
ldr r0,iAdrszMessStart
bl affichageMess
mov r4,#2 @ pancake number
1:
mov r0,r4
bl pancakesNum
add r4,r4,#1
cmp r4,#NUMPAN
ble 1b
ldr r0,iAdrszMessFinOK
bl affichageMess
100: @ standard end of the program
mov r0, #0 @ return code
mov r7, #EXIT @ request to exit program
svc #0 @ perform the system call
iAdrszCarriageReturn: .int szCarriageReturn
iAdrsMessResult: .int sMessResult
iAdrszMessStart: .int szMessStart
iAdrszMessFinOK: .int szMessFinOK
/******************************************************************/
/* pancake Number */
/******************************************************************/
/* r0 contains pancake number */
pancakesNum: @ INFO: pancakesNum
push {r2-r4,lr}
mov r4,r0
mov r1,#1
ldr r2,iAdriCptMax
str r1,[r2]
mov r10,#1 @ max flips counter
ldr r0,iAdrQueuePancake
ldr r1,iAdriQueueStart
str r0,[r1]
ldr r1,iAdriQueueEnd
str r0,[r1]
ldr r11,iAdrarrayFlips @ flips array item 0
ldr r0,iAdriAdddressMax
str r11,[r0] @ init with flips array item 0
mov r3,#0 @ init pointer
str r3,[r11,#Pan_left]
str r3,[r11,#Pan_right]
strb r3,[r11,#Pan_flips] @ init counter flips
add r6,r11,#Pan_value
mov r1,#1
1: @ init flips area with first combinaison
str r1,[r6,r3]
add r3,r3,#1
add r1,r1,#1
cmp r1,r4
ble 1b
@ init queue
ldr r0,iAdrQueuePancake
str r11,[r0] @ init with first item
add r0,r0,#4
ldr r1,iAdriQueueEnd
str r0,[r1]
mov r12,#1 @ indice flip area
2:
ldr r1,iAdriQueueEnd
ldr r1,[r1] @ load end queue pointer
ldr r2,iAdriQueueStart
ldr r0,[r2] @ load start queue pointer
cmp r1,r0 @ end queue ?
beq 20f
ldr r5,[r0] @ load value to start pointer
add r0,r0,#4 @ new start queue pointer
str r0,[r2] @ and store
add r0,r5,#Pan_flips
ldrb r9,[r0]
add r9,r9,#1 @ flip + 1
mov r8,#1 @ poste 1
5: @ start loop
mov r0,r5 @ address pancake area
mov r1,#0
mov r2,r4
mov r3,r8
bl flip
cmp r0,#-1
beq 99f
mov r7,r0 @ flipped
mov r1,r11 @ area pancake address
mov r2,r4
mov r3,r12
bl searchArea
cmp r0,#-1
beq 10f @ find -> next loop
mov r3,#Pan_end
mul r6,r3,r12
add r6,r6,r11
cmp r0,#0
streq r6,[r1,#Pan_left]
strne r6,[r1,#Pan_right]
strb r9,[r6,#Pan_flips]
add r3,r6,#Pan_value
ldr r2,iAdrareaFlipTemp
add r2,r2,#Pan_value
mov r0,#0
str r0,[r6,#Pan_left]
str r0,[r6,#Pan_right]
6:
ldrb r1,[r2,r0]
strb r1,[r3,r0]
add r0,r0,#1
cmp r0,r4
blt 6b
add r12,r12,#1 @
ldr r0,iMaxItem
cmp r12,r0
bge 99f
ldr r0,iAdriQueueEnd
ldr r1,[r0] @ load end queue pointer
str r6,[r1] @ add fliped in queue
add r1,r1,#4
ldr r2,iAdrEndQueuePancake
ldr r2,[r2]
cmp r1,r2 @ maxi ?
bge 99f
str r1,[r0] @ store next end queue pointer
cmp r9,r10
ble 10f
mov r10,r9
ldr r0,iAdriAdddressMax
str r7,[r0]
10: @ loops
add r8,r8,#1
cmp r8,r4
blt 5b
b 2b
20:
mov r0,r4
ldr r1,iAdrsZoneConv
bl conversion10 @ décimal conversion
add r1,r1,r0
mov r0,#0
strb r0,[r1]
ldr r0,iAdrszMessResHead
ldr r1,iAdrsZoneConv @ insert conversion
bl strInsertAtCharInc
bl affichageMess
mov r0,r10
ldr r1,iAdrsZoneConv
bl conversion10 @ décimal conversion
add r1,r1,r0
mov r0,#0
strb r0,[r1]
ldr r0,iAdrszMessResLib
ldr r1,iAdrsZoneConv @ insert conversion
bl strInsertAtCharInc
bl affichageMess
ldr r1,iAdriAdddressMax
ldr r0,[r1]
mov r1,r4
bl displayTable
b 100f
98:
affregtit erreur
ldr r0,iAdrszMessErrnotFind
bl affichageMess
mov r0,#-1
99:
ldr r0,iAdrszMessError
bl affichageMess
mov r0,#-1
100:
pop {r2-r4,pc}
iAdrPancakes: .int Pancakes
iAdrQueuePancake: .int QueuePancake
iAdriQueueStart: .int iQueueStart
iAdriQueueEnd: .int iQueueEnd
iAdrEndQueuePancake: .int EndQueuePancake
iAdrarrayFlips: .int arrayFlips
iAdrszMessError: .int szMessError
iAdriCptMax: .int iCptMax
iAdriAdddressMax: .int iAdddressMax
iAdrszMessErrnotFind: .int szMessErrnotFind
iAdrszMessResHead: .int szMessResHead
iAdrszMessResLib: .int szMessResLib
iMaxItem: .int NBQUEUEITEM
/******************************************************************/
/* flip */
/******************************************************************/
/* r0 contains the address of table */
/* r1 contains first start index
/* r2 contains the number of elements */
/* r3 contains the position of flip */
flip: @ INFO: flip
push {r1-r8,lr} @ save registers
mov r5,r0
ldr r8,iAdrareaFlipTemp
mov r4,#Pan_value
mov r0,#0
add r7,r8,#Pan_value
add r4,r4,r5
1: @ copy area loop
ldrb r6,[r4,r0]
strb r6,[r7,r0]
add r0,r0,#1
cmp r0,r2
blt 1b @ loop
mov r0,r7
cmp r3,r2
subge r3,r2,#1 @ last index if position >= size
2:
cmp r1,r3
bge 3f
ldrb r5,[r0,r1] @ load value first index
ldrb r6,[r0,r3] @ load value position index
strb r6,[r0,r1] @ inversion
strb r5,[r0,r3] @
sub r3,r3,#1
add r1,r1,#1
b 2b
3:
mov r0,r8 @ return flip area temp
100:
pop {r1-r8,pc}
iAdrareaFlipTemp: .int areaFlipTemp
/******************************************************************/
/* search area in table area */
/******************************************************************/
/* r0 contains the address area to search */
/* r1 contains address area address
/* r2 nombre elements */
/* r3 nombre address area */
/* r0 return -1 if find, 0 if pointer left, 1 if pointer right */
/* r1 return address item */
searchArea :
push {r4-r11,lr} @ save registers
mov r7,#0
mov r9,#Pan_end
add r10,r0,#Pan_value
mov r6,r1
1: @ loop begin
mov r8,#0 @ indice value array
add r5,r6,#Pan_value @ load value address
2:
ldrb r4,[r10,r8] @ load one value to search
ldrb r11,[r5,r8] @ load one value to tree
add r8,r8,#1
cmp r4,r11 @ compare value
blt 3f @ smaller
bgt 4f @ highter
cmp r8,r2 @ end value ?
blt 2b @ no -> loop
mov r0,#-1 @ equal return -1
b 100f
3: @ smaller
ldr r4,[r6,#Pan_left] @ load left pointer
cmp r4,#0 @ end ?
movne r6,r4
bne 1b @ loop
mov r1,r6 @ last pointer address
mov r0,#0 @ not find pointer left
b 100f
4: @ highter
ldr r4,[r6,#Pan_right] @ load right pointer
cmp r4,#0
movne r6,r4
bne 1b
mov r1,r6 @ last pointer address
mov r0,#1 @ not find pointer right
100:
pop {r4-r11,pc}
/******************************************************************/
/* Display table elements */
/******************************************************************/
/* r0 contains the address of table */
/* r1 contains elements number */
displayTable: @ INFO: displayTable
push {r0-r3,lr} @ save registers
mov r4,r1
add r2,r0,#Pan_value
mov r3,#0
1: @ loop display table
ldrb r0,[r2,r3]
ldr r1,iAdrsZoneConv
bl conversion10 @ décimal conversion
add r1,r1,r0
mov r0,#0
strb r0,[r1]
ldr r0,iAdrsMessResult
ldr r1,iAdrsZoneConv @ insert conversion
bl strInsertAtCharInc
bl affichageMess @ display message
add r3,#1
cmp r3,r4
blt 1b
ldr r0,iAdrszCarriageReturn
bl affichageMess
mov r0,r2
100:
pop {r0-r3,lr}
bx lr
iAdrsZoneConv: .int sZoneConv
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
.include "../affichage.inc"

View file

@ -1,52 +1,49 @@
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <numeric>
#include <cstdint>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <vector>
std::vector<int32_t> flip_stack(std::vector<int32_t>& stack, const int32_t index) {
reverse(stack.begin(), stack.begin() + index);
std::vector<uint32_t> flip_stack(std::vector<uint32_t> stack, const uint32_t& index) {
std::reverse(stack.begin(), stack.begin() + index);
return stack;
}
std::pair<std::vector<int32_t>, int32_t> pancake(const int32_t number) {
std::vector<int32_t> initial_stack(number);
std::pair<std::vector<uint32_t>, uint32_t> pancake(const uint32_t& number) {
std::vector<uint32_t> initial_stack(number);
std::iota(initial_stack.begin(), initial_stack.end(), 1);
std::map<std::vector<int32_t>, int32_t> stack_flips = { std::make_pair(initial_stack, 1) };
std::queue<std::vector<int32_t>> queue;
std::map<std::vector<uint32_t>, uint32_t> stack_flips = { std::make_pair(initial_stack, 0) };
std::queue<std::vector<uint32_t>> queue;
queue.push(initial_stack);
while ( ! queue.empty() ) {
std::vector<int32_t> stack = queue.front();
std::vector<uint32_t> stack = queue.front();
queue.pop();
const int32_t flips = stack_flips[stack] + 1;
for ( int i = 2; i <= number; ++i ) {
std::vector<int32_t> flipped = flip_stack(stack, i);
if ( stack_flips.find(flipped) == stack_flips.end() ) {
const uint32_t flips = stack_flips[stack] + 1;
for ( uint32_t i = 2; i <= number; ++i ) {
std::vector<uint32_t> flipped = flip_stack(stack, i);
if ( ! stack_flips.contains(flipped) ) {
stack_flips[flipped] = flips;
queue.push(flipped);
}
}
}
auto ptr = std::max_element(
stack_flips.begin(), stack_flips.end(),
[] ( const auto & pair1, const auto & pair2 ) {
return pair1.second < pair2.second;
}
);
const auto ptr = std::max_element(stack_flips.begin(), stack_flips.end(),
[](const auto& pair1, const auto& pair2){ return pair1.second < pair2.second; });
return std::make_pair(ptr->first, ptr->second);
}
int main() {
for ( int32_t n = 1; n <= 9; ++n ) {
std::pair<std::vector<int32_t>, int32_t> result = pancake(n);
for ( uint32_t n = 1; n <= 9; ++n ) {
std::pair<std::vector<uint32_t>, uint32_t> result = pancake(n);
std::cout << "pancake(" << n << ") = " << std::setw(2) << result.second << ". Example [";
for ( uint64_t i = 0; i < result.first.size() - 1; ++i ) {
for ( uint32_t i = 0; i < result.first.size() - 1; ++i ) {
std::cout << result.first[i] << ", ";
}
std::cout << result.first.back() << "]" << std::endl;

View file

@ -1,23 +1,37 @@
Dim As Integer num_pancakes = 20
Dim As Integer i, j, c = 0, n
Function pancake(n As Integer) As Integer
Dim As Integer gap = 2, sum = 2, adj = -1
While sum < n
Dim As Integer gap, pg, gapsum, adj, temp
gap = 2
pg = 1
gapsum = gap
adj = -1
While gapsum < n
adj += 1
gap = (gap * 2) - 1
sum += gap
temp = gap
gap += pg
pg = temp
gapsum += gap
Wend
Return n + adj
End Function
For i = 0 To 3
For j = 1 To 5
n = (i * 5) + j
c += 1
Print Using "p(##) = ## "; n; pancake(n);
If c Mod 5 = 0 Then Print
Next j
' Main program
Dim As Integer numbers(1 To 20), results(1 To 20)
Dim As Integer i, row, col, idx
' Generate sequence 1 to 20
For i = 1 To 20
numbers(i) = i
results(i) = pancake(i)
Next i
For row = 0 To 3
For col = 1 To 5
idx = row * 5 + col
Print Using "p(##) = ## "; numbers(idx); results(idx);
Next col
Print
Next row
Sleep

View file

@ -1,27 +1,43 @@
Public numbers[20] As Integer
Public results[20] As Integer
Public Sub Main()
Dim i As Integer, j As Integer, c As Integer = 0, n As Integer
Dim i As Integer, row As Integer, col As Integer, idx As Integer
For i = 0 To 3
For j = 1 To 5
n = (i * 5) + j
c += 1
Print "p("; Format$(n, "##"); ") = "; Format$(pancake(n), "##"); " ";
If c Mod 5 = 0 Then Print
' Generate sequence 1 to 20
For i = 0 To 19
numbers[i] = i + 1
results[i] = pancake(i + 1)
Next
For row = 0 To 3
For col = 0 To
idx = row * 5 + col
Print "p("; Format$(numbers[idx], "##"); ") = "; Format$(results[idx], "##"); " ";
Next
Print
Next
End
Function pancake(n As Integer) As Integer
Dim gap As Integer = 2, sum As Integer = 2, adj As Integer = -1
Dim gap As Integer, pg As Integer, gapsum As Integer, adj As Integer, tmp As Integer
While sum < n
gap = 2
pg = 1
gapsum = gap
adj = -1
While gapsum < n
adj += 1
gap = (gap * 2) - 1
sum += gap
tmp = gap
gap += pg
pg = tmp
gapsum += gap
Wend
Return n + adj
End Function

View file

@ -1,23 +1,31 @@
public class Pancake {
private static int pancake(int n) {
int gap = 2;
int sum = 2;
int adj = -1;
while (sum < n) {
adj++;
gap = 2 * gap - 1;
sum += gap;
}
return n + adj;
}
public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
for (int j = 1; j < 6; j++) {
int n = 5 * i + j;
System.out.printf("p(%2d) = %2d ", n, pancake(n));
public final class PancakeNumbersApproximation {
public static void main(String[] args) {
for ( int i = 0; i < 4; i++ ) {
for ( int j = 1; j < 6; j++ ) {
final int n = 5 * i + j;
System.out.print(String.format("%s%2d%s%d%s", "p(", n, ") = ", pancake(n), "\t"));
}
System.out.println();
}
}
private static int pancake(int number) {
int gap = 2;
int previousGap = 1;
int sumGaps = gap;
int adjustment = -1;
while ( sumGaps < number ) {
adjustment += 1;
final int previousGapCopy = previousGap;
previousGap = gap;
gap += previousGapCopy;
sumGaps += gap;
}
number += adjustment;
return number;
}
}

View file

@ -1,47 +1,53 @@
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.toList;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public final class PancakeNumbers {
public class Pancake {
public static void main(String[] args) {
for ( int n = 1; n <= 9; n++ ) {
PancakeInfo result = pancake(n);
System.out.println(String.format("%s%2d%s", "Pancake(", result.index, "). Example " + result.pancake));
}
}
private static PancakeInfo pancake(int number) {
List<Integer> initialStack = IntStream.rangeClosed(1, number).boxed().collect(Collectors.toList());
Map<List<Integer>, Integer> stackFlips = new HashMap<List<Integer>, Integer>();
stackFlips.put(initialStack, 0);
Queue<List<Integer>> queue = new ArrayDeque<List<Integer>>();
queue.add(initialStack);
while ( ! queue.isEmpty() ) {
List<Integer> stack = queue.remove();
private static List<Integer> flipStack(List<Integer> stack, int spatula) {
List<Integer> copy = new ArrayList<>(stack);
Collections.reverse(copy.subList(0, spatula));
final int flipCount = stackFlips.get(stack) + 1;
for ( int i = 2; i <= number; i++ ) {
List<Integer> flipped = flipStack(stack, i);
if ( stackFlips.putIfAbsent(flipped, flipCount) == null ) {
queue.add(flipped);
}
}
}
Map.Entry<List<Integer>, Integer> entry =
stackFlips.entrySet().stream().max(Comparator.comparing( e -> e.getValue() )).get();
return new PancakeInfo(entry.getKey(), entry.getValue());
}
private static List<Integer> flipStack(List<Integer> stack, int index) {
List<Integer> copy = new ArrayList<Integer>(stack);
Collections.reverse(copy.subList(0, index));
return copy;
}
private static record PancakeInfo(List<Integer> pancake, int index) {}
private static Map.Entry<List<Integer>, Integer> pancake(int n) {
List<Integer> initialStack = IntStream.rangeClosed(1, n).boxed().collect(toList());
Map<List<Integer>, Integer> stackFlips = new HashMap<>();
stackFlips.put(initialStack, 1);
Queue<List<Integer>> queue = new ArrayDeque<>();
queue.add(initialStack);
while (!queue.isEmpty()) {
List<Integer> stack = queue.remove();
int flips = stackFlips.get(stack) + 1;
for (int i = 2; i <= n; ++i) {
List<Integer> flipped = flipStack(stack, i);
if (stackFlips.putIfAbsent(flipped, flips) == null) {
queue.add(flipped);
}
}
}
return stackFlips.entrySet().stream().max(comparing(e -> e.getValue())).get();
}
public static void main(String[] args) {
for (int i = 1; i <= 10; ++i) {
Map.Entry<List<Integer>, Integer> result = pancake(i);
System.out.printf("pancake(%s) = %s. Example: %s\n", i, result.getValue(), result.getKey());
}
}
}

View file

@ -0,0 +1,29 @@
object PancakeNumbers extends App:
private def pancake(n: Int): Int =
var gap = 2
var sum = 2
var adj = -1
while (sum < n) {
adj += 1
gap = gap * 2 - 1
sum += gap
}
n + adj
private def formatPancakeNumbers(maxN: Int, perRow: Int): List[String] =
(1 to maxN).toList
.grouped(perRow)
.map { group =>
group.map(n => f"p($n%2d) = ${pancake(n)}%2d").mkString(" ")
}
.toList
private def runPancakeNumbers(): Unit =
val maxN = 20
val formattedOutput = formatPancakeNumbers(maxN, perRow = 5)
formattedOutput.foreach(println)
runPancakeNumbers()