Zéro une cellule arbitrairement grande à Brainf ***

28

Votre tâche consiste à écrire un morceau de code qui met à zéro la cellule actuelle dans la variante Brainfuck qui, chaque cellule peut contenir un entier signé de magnitude arbitrairement grande, au lieu du 0 à 255 normal.

Vous pouvez supposer qu'il y a 1 cellules à gauche et r cellules à droite de la cellule actuelle qui sont initialement nulles. Votre programme ne peut accéder qu'à ces cellules l + r +1. Une fois votre code terminé, il doit laisser les cellules supplémentaires l + r à zéro et le pointeur vers la cellule actuelle à la position d'origine.

Vous ne pouvez utiliser aucune entrée / sortie.

Le code avec le plus petit l + r gagne. S'il y a égalité, le code le plus court l'emporte. Il est recommandé d'indiquer également la complexité temporelle de votre programme pour référence, où n est la valeur absolue de l'entier d'origine dans la cellule actuelle.

Outils utiles

Vous pouvez tester un programme Brainfuck dans cette variante en utilisant cet interpréteur sur TIO par mbomb007 .

Vous pouvez également utiliser l'interpréteur dans cette réponse par boothby (d'autres réponses Python fonctionnent probablement aussi, mais je n'ai pas testé).

jimmy23013
la source
Je l'ai étiqueté code-golf parce que je pense que nous atteindrons rapidement le l + r optimal.
jimmy23013
2
Il semble que d'après votre commentaire, vous vouliez dire un entier de magnitude arbitrairement grande, qui peut être positif ou négatif. Il s'agit d'une différence dans le dialecte anglais pour certaines personnes, il pourrait donc être utile de préciser qu'il peut être très positif ou très négatif.
isaacg
4
@ jimmy23013 Avez-vous un interprète BF avec des cellules signées que nous pouvons utiliser pour cela?
mbomb007
@ mbomb007 codegolf.stackexchange.com/a/3085/25180 mais probablement trop golfique ...
jimmy23013
1
@Mego Pourquoi? Dans le "vrai" défi, vous devez également obtenir le l + r optimal, ce qui rendra probablement plus difficile la réduction de la taille du code.
jimmy23013

Réponses:

17

l + r = 0 + 2 = 2, 55 53 51 octets

[>+[-<+>>+<]<[>]>[+[-<+<->>]<[->+<]]>[-<+>]<<]>[-]<

l + r = 1 + 2 = 3, 46 44 octets

[[>+[-<+<+>>]<[<+[->->+<<]]>]>[>]<[-]<<[-]>]

Mon propre algorithme. Le pointeur doit commencer au nombre qui doit être mis à zéro. La complexité temporelle est O (n ^ 2).

Comment ça marche:

  • Nous commençons par le nombre n.
  • Nous incrémentons un, donc le nombre devient n+1.
  • Nous décrémentons deux, donc le nombre devient n+1-2 = n-1
  • Nous incrémentons trois, donc le nombre devient n-1+3 = n+2.
  • Nous décrémentons quatre, donc le nombre devient n+2-4 = n-2.

Nous répétons le processus, en augmentant l'incrémentation / décrémentation à chaque étape, jusqu'à ce que nous obtenions zéro.

JungHwan Min
la source
2
Exactement l'algorithme
auquel
9

l + r = 0 + 2 = 2; 58 octets

>+<[>[<->>+<-]>+<<[>]>[<<+>+>-]<[->+<]>[<]>+[-<+>]<<]>[-]<

La complexité est O (n ^ 2).

Ce qui suit est mon générateur de programme de test, vous pouvez donc voir que j'ai réellement essayé de le tester au cas où cela ne fonctionnerait pas ...

p='''
>+<
[
>
[<->>+<-]
>+<
<[>]>
[<<+>+>-]
<
[->+<]
>[<]>
+ [-<+>]
<<
]
> [-] <
'''

p = ''.join(p.split())

cpp = '''
#include <bits/stdc++.h>
using namespace std;
void test(int q) {
long long t[3] = {q, 0, 0};
int i = 0;
ZZZ
printf("q=%d %lld %lld %lld\\n", q, t[0], t[1], t[2]);
}
int main() {
while(true) {
    int q; cin >> q; test(q);
}
}
'''

d = {
'>': '++i; assert(i<3);',
'<': '--i; assert(i>=0);',
'+': '++t[i];',
'-': '--t[i];',
'[': 'while(t[i]){',
']': '}',
}

print cpp.replace('ZZZ', ''.join(d[c] for c in p))
feersum
la source
Vous pouvez le tester en utilisant l'interpréteur que je viens de faire. Voir commentaire
mbomb007
Il semble que cela fonctionne pour moi.
mbomb007
2
Cela doit être le l + r optimal. Preuve rapide que 1 est impossible: à chaque point où la cellule de rechange atteint zéro, vous ne pouvez stocker qu'une quantité finie de données en plus de la valeur de la cellule d'origine (dans la position de la tête de bande et le pointeur d'instructions), ce qui signifie que vous êtes limité dans la mesure où vous pouvez ajuster la cellule principale à partir de ce point dans au moins une direction.
@ ais523 Il pourrait y en avoir d'autres équivalents. Ce serait intéressant si quelqu'un crée l + r = 1 + 1.
mbomb007