Data update
This commit is contained in:
parent
8e4e15fa56
commit
72eb4943cb
1853 changed files with 35514 additions and 9441 deletions
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
393
Task/Pancake-numbers/ARM-Assembly/pancake-numbers.arm
Normal file
393
Task/Pancake-numbers/ARM-Assembly/pancake-numbers.arm
Normal 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"
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
29
Task/Pancake-numbers/Scala/pancake-numbers-2.scala
Normal file
29
Task/Pancake-numbers/Scala/pancake-numbers-2.scala
Normal 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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue