Cubix, 238 234 217 151 110 100 octets
14 octets enregistrés grâce à ETHProductions
u'^.:s+.;;;\-?W?rsos\(rrOIO:ur>'=o;^u.;;.>$.vUo^'rsu1;;@!\q?s*su;;IOu*+qU../;(*\(s.;<..r:''uq....qu\
Étendu:
u ' ^ . :
s + . ; ;
; \ - ? W
? r s o s
\ ( r r O
I O : u r > ' = o ; ^ u . ; ; . > $ . v
U o ^ ' r s u 1 ; ; @ ! \ q ? s * s u ;
; I O u * + q U . . / ; ( * \ ( s . ; <
. . r : ' ' u q . . . . q u \ . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Essayez-le en ligne!
Essayez-le ici
Explication
Le code se compose de 8 étapes, avec deux boucles. Je vais passer en revue le code partie par partie.
Étape 1 (A ^ B)
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
I O : u . . . . . . . . . . . . . . . .
U o ^ ' . . . . . . . . . . . . . . . .
; I O u . . . . . . / ; ( * \ . . . . .
? ? r : . . . . . . ? . . . \ ? ? ? ? ?
. . . . ? . . . . . ? . . . . . . . . .
? ? ? ? ?
. . . . .
. . . . .
. . . . .
. . . . .
Il s'agit du cube dont les parties non pertinentes pour la première étape ont été supprimées. Le point d'interrogation indique les non-opérations que l'IP visitera, pour rendre son chemin plus clair.
IO:'^o;IO:r*(; # Explanation
I # Push the first input (A)
O # output that
: # duplicate it
'^ # Push the character "^"
o # output that
; # pop it from the stack
I # Push the second input (B)
O # output that
: # duplicate
r # rotate top 3 elements
* # Push the product of the top two elements
( # decrease it by one
; # pop it from the stack (making the last
# two operations useless, but doing it
# this way saves 10B)
Maintenant, la pile ressemble à ceci: A, B, A, B
Étape 2 (préparer la boucle d'impression)
La boucle d'impression prend 3 arguments (les 3 premiers éléments de la pile): P
, Q
et R
. P
est le nombre de répétitions, Q
le séparateur (code de caractère) et R
le nombre à répéter. Heureusement, la boucle prend également en charge l'exigence que la chaîne résultante se termine R
, non Q
.
Nous voulons répéter A*
exactement les B
temps, donc le séparateur est *
. Notez que la pile commence en tant que A, B, A, B
. Encore une fois, j'ai supprimé toutes les instructions non pertinentes. L'IP commence au S
nord pointé.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . * . . . . . . . . . . . . . . .
. . . . ' . . . . . . . . . . . . . . .
. . . . S . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
'*rr # Explanation
'* # Push * (Stack: A, B, A, B, *)
rr # Rotate top three elements twice
La pile est maintenant A, B, B, *, A
.
Étape 3/6/8 (la boucle d'impression)
Concept
E . . . . .
? r s o s u
\ ( r r O <
. . . . . S
L'IP entre dans la boucle S
, pointant vers le nord, et quitte la boucle vers E
, pointant à nouveau vers le nord. Pour cette explication, la pile est définie sur [..., A, B, C]
. Les instructions suivantes sont exécutées. Notez que l'IP ne peut pas quitter la boucle avant le point d'interrogation, donc les quatre premières instructions seront toujours exécutées.
Orr(?rsos # Explanation
O # Output `C`
rr # Rotate top three elements twice (Stack: [..., B, C, A])
( # Decrease A by one (Stack: [..., B, C, A-1])
? # If top of stack (A) > 0:
r # Rotate top of stack (Stack: [..., A-1, B, C])
s # Swap top elements (Stack: [..., A-1, C, B])
o # Output top of stack (B) as character code
s # Swap top elements (Stack: [..., A-1, B, C]
#
# ... and repeat ...
la mise en oeuvre
Voici à nouveau le cube, avec les parties non pertinentes supprimées. L'IP commence à S
, pointant vers l'est.
. . . . .
. . . . .
. . . . .
? r s o s
\ ( r r O
. . . . . S ' = o ; ^ u . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Comme vous pouvez le voir, l'IP passe par quatre instructions avant d'entrer dans la boucle. Puisque le code de caractère est à nouveau supprimé, nous atteignons la boucle avec la même pile exacte que celle que nous avons entrée dans cette partie.
'=o; # Explanation
'= # Push =
o # Output
; # Pop from stack
À l'intérieur de la boucle, l'explication ci-dessus est valable.
Étape 4 (différenciation des IP)
Étant donné que nous utilisons la boucle ci-dessus plusieurs fois et qu'elles provoquent toutes la fin de l'IP au même endroit, nous devons différencier plusieurs exécutions. Tout d'abord, nous pouvons distinguer le séparateur (la première exécution a un *
, tandis que les exécutions deux et trois ont un +
séparateur). Nous pouvons différencier les cycles 2 et 3 en vérifiant la valeur du nombre répété. Si tel est le cas, le programme doit se terminer.
Première comparaison
Voici à quoi cela ressemble sur le cube. L'IP commence à S et pointe vers le nord. La pile contient [..., * or +, A or 1, 0]
. Le numéro 1 indique où l'IP se terminera s'il s'agit de la première boucle (pointant vers le nord) et le numéro 2 indique où l'IP se terminera s'il s'agit de la deuxième (ou troisième) boucle (pointant vers l'est).
u ' . . .
s + . 1 .
; \ - ? 2
S . . . .
. . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
;s'+-? # Explanation
; # Delete top element (0)
s # Swap the top two elements (Stack: 1/A, */+)
'+ # Push the character code of +
- # Subtract the top two elements and push
# that to the stack (Stack: 1/A, */+, +, (*/+)-+)
? # Changes the direction based on the top
# item on the stack. If it's 0 (if (*/+) == +)
# the IP continues going right, otherwise, it
# turns and continues going north.
Si l'IP est maintenant à 1
, la pile l'est [A, *, +, -1]
. Sinon, la pile l'est [A or 1, +, +, 0]
. Comme vous pouvez le voir, il y a toujours un inconnu dans la pile du deuxième cas, nous devons donc faire une autre comparaison.
Deuxième comparaison
Parce que la propriété intellectuelle est passée à l' étape 5, les regards de la pile comme ceci: [A^(B-1) or nothing, A or 1, +, +, 0]
. Si le premier élément l'est nothing
, le deuxième l'est 1
, et l'inverse aussi. Le cube ressemble à ceci, avec l'IP commençant à S et pointant vers l'est. S'il s'agit de la deuxième boucle, l'IP finit par E
pointer vers l'ouest. Sinon, le programme frappe le @
et se termine.
. . . . .
. . . . ;
. . . S W
. . . . .
. . . . .
. . . . . . . . . . . . . ; . . . . . .
. . . . . . . . . E @ ! \ q . . . . . .
. . . . . . . . . . . . ( * . . . . . .
. . . . . . . . . . . . q u . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Les instructions exécutées qui ne font rien au flux de contrôle sont répertoriées ci-dessous.
;;q*q(!@
;; # Delete top two elements (Stack [A^(B-1)/null, A/1, +])
q # Send top element to the bottom (Stack [+, A^(B-1)/0, A/1])
* # Push product of top two elements
# (Stack [+, A^(B-1)/0, A/1, A^B/0])
q # Send top element to the bottom
# (Stack [A^B/0, +, A^(B-1)/0, A/1])
( # Decrease the top element by 1
# (Stack [A^B/0, +, A^(B-1)/0, (A-1)/0])
! # If (top element == 0):
@ # Stop program
La pile est maintenant [A^B, +, A^(B-1), A-1]
, à condition que le programme ne se soit pas terminé.
Étape 5 (préparation de "A +" (répétez A ^ (B-1)))
Malheureusement, Cubix n'a pas d'opérateur électrique, nous avons donc besoin d'une autre boucle. Cependant, nous devons d'abord nettoyer la pile, qui contient maintenant [B, A, *, +, -1]
.
Nettoyer
Voici à nouveau le cube. Comme d'habitude, l'IP commence à S (pointant vers le nord) et se termine à E, pointant vers l'ouest.
. . . ? .
. . . ; .
. . . S .
. . . . .
. . . . .
. . . . . . . . . . . . . . . . > $ . v
. . . . . . . . . . . . . . . . . . . ;
. . . . . . . . . . . . . . . . . . E <
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
;; # Explanation
;; # Remove top 2 elements (Stack: [B, A, *])
Calcul de A ^ (B-1)
Une autre boucle qui fonctionne à peu près comme la boucle d'impression, mais elle est un peu plus compacte. L'IP commence à S
, pointant vers l'ouest, avec la pile [B, A, *]
. L'IP sort en E
pointant vers le nord.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . . . . . E . . . . .
. . . . . . . . . . . . . . ? s * s u .
. . . . . . . . . . . . . . \ ( s . ; S
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Le corps de la boucle est le suivant.
;s(?s*s # Explanation
; # Pop top element.
s # Shift top elements.
( # Decrease top element by one
? # If not 0:
s # Shift top elements again
* # Multiply
s # Shift back
#
# ... and repeat ...
La pile résultante est [A, A^(B-1), 0]
.
Nettoyage de la pile (à nouveau)
Maintenant, nous devons revenir à la boucle d'impression, avec le haut de la pile contenant [..., A^(B-1), +, A]
. Pour ce faire, nous exécutons ce qui suit. Voici à nouveau le cube,
. . ^ ? :
. . . . .
. . . . .
. . . . .
E . . . .
. . . . . s . . . . . . . . ; . . $ . .
. . . . . + q U . . . . . . S . . s . .
. . . . . ' u q . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
. . ? . .
. . ? . .
. . ? . .
. . ? . .
. . ? . .
;:$sqq'+s # Explanation
; # Delete top element (Stack: [A, A^(B-1)])
: # Copy top element
$s # No-op
qq # Send top two elements to the bottom
# (Stack: [A^(B-1), A^(B-1), A])
'+ # Push +
# (Stack: [A^(B-1), A^(B-1), A, +])
s # Swap top two elements
# (Stack: [A^(B-1), A^(B-1), +, A])
Étape 7 (préparation de la dernière boucle)
La pile est maintenant [A^B, +, A^(B-1), A-1]
, l'IP commence à S
, va vers l'ouest et se termine à E
, va à droite.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . E . . . . . . . . . . . . . .
. . . . . . u 1 ; ; S . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Les instructions exécutées:
;;1 # Explanation
;; # Delete top two elements
1 # Push 1
La pile ressemble maintenant [A^B, +, 1]
, et l'IP est sur le point d'entrer dans la boucle d'impression, nous avons donc terminé.