Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Помогите перевести код с с++ на js (https://javascript.ru/forum/css-html/80309-pomogite-perevesti-kod-s-s-na-js.html)

Gaara_sand1 21.05.2020 04:21

Помогите перевести код с с++ на js
 
Здравствуйте есть код на c++ не знаю как перевести его в Javascript нужно чтобы N передавалось из html
Код:

#include <iostream>
using namespace std;
void swap(int *a, int i, int j)
{
  int s = a[i];
  a[i] = a[j];
  a[j] = s;
}
bool NextSet(int *a, int n)
{
  int j = n - 2;
  while (j != -1 && a[j] >= a[j + 1]) j--;
  if (j == -1)
    return false; // больше перестановок нет
  int k = n - 1;
  while (a[j] >= a[k]) k--;
  swap(a, j, k);
  int l = j + 1, r = n - 1; // сортируем оставшуюся часть последовательности
  while (l<r)
    swap(a, l++, r--);
  return true;
}
void Print(int *a, int n)  // вывод перестановки
{
  static int num = 1; // номер перестановки
  cout.width(3); // ширина поля вывода номера перестановки
  cout << num++ << ": ";
  for (int i = 0; i < n; i++)
    cout << a[i] << " ";
  cout << endl;
}
int main()
{
  int n, *a;
  cout << "N = ";
  cin >> n;
  a = new int[n];
  for (int i = 0; i < n; i++)
    a[i] = i + 1;
  Print(a, n);
  while (NextSet(a, n))
    Print(a, n);
  cin.get(); cin.get();
  return 0;
}

функция взята отсюда https://prog-cpp.ru/permutation/

Nexus 22.05.2020 16:36

Код - срань.

function swap(a, i, j) {
    var s = a[i];
    
    a[i] = a[j];
    a[j] = s;
}

function NextSet(a, n) {
    var j = n - 2;
    
    while (j != -1 && a[j] >= a[j + 1]) {
        j--;
    }
    
    if (j == -1) {
        return false;
    }
    
    var k = n - 1;
    while (a[j] >= a[k]) {
        k--;
    }
    
    swap(a, j, k);
    var l = j + 1, 
        r = n - 1; 
        
    // сортируем оставшуюся часть последовательности
    while (l < r) {
        swap(a, l++, r--);
    }
    
    return true;
}

// вывод перестановки
function Print() {
    var num = 1; // номер перестановки
    
    return function (a, n) {
        var message = num++ + ': ';
        for (var i = 0; i < n; i++) {
            message += a[i] + ' ';
        }
        
        console.log(message);
    };
}

var n = prompt('N = '),
    a = [];
    
for (var i = 0; i < n; i++) {
    a[i] = i + 1;
}

var log = Print();

log(a, n);
while (NextSet(a, n)) {
    log(a, n);
}

Результат смотрите в консоли.

Gaara_sand1 22.05.2020 18:40

Можете пожалуйста привязать работу данного скрипта к этому html документу?
<!DOCTYPE HTML>
<html>
<head>
	<meta charset="utf-8">
	<title>Перестановки.</title>
	<link rel="stylesheet" href="style.css" >
</head>
<body>
	<h1>Перестановки.</h1>
	<div>
		<input id="b1" name="input" type="button" value="Все перестановки из" onclick="">
		<input id="number" style="width: 15px;"  name="input" type="text"  maxlength="1"> элементов.
	</div>
	<div id="res" style="text-align: left"></div>

	<script></script>

	
</body>
</html>

Gaara_sand1 22.05.2020 19:05

можно узнать еще почему при вводе 0 начинается бесконечный цикл

рони 22.05.2020 19:32

перестановка
 
Gaara_sand1,
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <title>Перестановки.</title>
    <link rel="stylesheet" href="style.css" >
</head>
<body>
    <h1>Перестановки.</h1>
    <div>
        <input id="b1" name="input" type="button" value="Все перестановки из" >
        <input id="number" style="width: 15px;"  name="input" type="text"  maxlength="1" value="4"> элементов.
    </div>
    <div id="res" style="text-align: left"></div>

    <script>
function perms(xs){
    var r=[];
    for (var i=0;i<xs.length;i++){
        var xs_ = xs.slice(),
            x = xs_.splice(i, 1),
            ps = xs_.length ? perms(xs_) : [[]];
        r.push(...ps.map(p=>x.concat(p)));
    }
    return r;
}
b1.addEventListener("click" , function(event) {
var length = number.value = +number.value||0;
var arr = Array.from({length}, (_, i) => ++i);
arr = perms(arr);
res.innerHTML =  `${arr.join("<br>")}<br>Всего: ${arr.length}`
});
    </script>
</body>
</html>

Gaara_sand1 23.05.2020 05:17

рони,
можете пожалуйста объяснить как работает данная функция и можно ли сделать чтобы при введении нуля выдавало просто "Всего:0"

рони 23.05.2020 08:43

Цитата:

Сообщение от Gaara_sand1
можно ли сделать чтобы при введении нуля выдавало просто "Всего:0"

добавлено, смотрите код выше.
Цитата:

Сообщение от Gaara_sand1
можете пожалуйста объяснить как работает данная функция

мне сложно это сделать, возможно кто-то другой даст правильное обьяснение.

рони 24.05.2020 11:09

Gaara_sand1,
было [1, 2, 3]
извлекли 1 "умножили" на все комбинации [2, 3]
было [2, 3] извлекли 2 "умножили" на все комбинации [3] и т.д.
function perms(xs){
    var r=[];
    for (var i=0;i<xs.length;i++){//[1, 2, 3]
        var xs_ = xs.slice(),//[2, 3]
            x = xs_.splice(i, 1),//1
            ps = xs_.length ? perms(xs_) : [[]];//все комбинации
        r.push(...ps.map(p=>x.concat(p)));// "умножили"
    }
    return r;
}


как то так...


Часовой пояс GMT +3, время: 14:14.