Codegolf – Не Могли Бы Вы Перестать Тасовать Колоду И Начать Играть?

  • Автор темы User_Sem
  • Обновлено
  • 22, Oct 2024
  • #1

Испытание:

Вход: Список различных положительных целых чисел в диапазоне \$[1, \text{list-size}]\$.

Выход: Целое число: сколько раз список перетасованный. Для списка это означает, что список разделен на две половины, и эти половины чередуются (т. е. перетасовываются в списке).

 Input                                                   Output

[1,2,3]                                                 0
[1,2,3,4,5]                                             0
[1,3,2]                                                 1
[1,6,2,7,3,8,4,9,5,10]                                  1
[1,3,5,7,2,4,6]                                         2
[1,8,6,4,2,9,7,5,3,10]                                  2
[1,9,8,7,6,5,4,3,2,10]                                  3
[1,5,9,4,8,3,7,2,6,10]                                  4
[1,3,5,7,9,2,4,6,8]                                     5
[1,6,11,5,10,4,9,3,8,2,7]                               6
[1,10,19,9,18,8,17,7,16,6,15,5,14,4,13,3,12,2,11,20]    10
[1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20]    17
[1,141,32,172,63,203,94,234,125,16,156,47,187,78,218,109,249,140,31,171,62,202,93,233,124,15,155,46,186,77,217,108,248,139,30,170,61,201,92,232,123,14,154,45,185,76,216,107,247,138,29,169,60,200,91,231,122,13,153,44,184,75,215,106,246,137,28,168,59,199,90,230,121,12,152,43,183,74,214,105,245,136,27,167,58,198,89,229,120,11,151,42,182,73,213,104,244,135,26,166,57,197,88,228,119,10,150,41,181,72,212,103,243,134,25,165,56,196,87,227,118,9,149,40,180,71,211,102,242,133,24,164,55,195,86,226,117,8,148,39,179,70,210,101,241,132,23,163,54,194,85,225,116,7,147,38,178,69,209,100,240,131,22,162,53,193,84,224,115,6,146,37,177,68,208,99,239,130,21,161,52,192,83,223,114,5,145,36,176,67,207,98,238,129,20,160,51,191,82,222,113,4,144,35,175,66,206,97,237,128,19,159,50,190,81,221,112,3,143,34,174,65,205,96,236,127,18,158,49,189,80,220,111,2,142,33,173,64,204,95,235,126,17,157,48,188,79,219,110,250]

45
 
once would result in 5 , поэтому для этой задачи входные данные [1,2,3,4,5,6,7,8,9] would result in [1,3,5,7,9,2,4,6,8] ).

Правила конкурса:

  • Вы можете предположить, что список будет содержать только положительные целые числа в диапазоне \$[1, \text{list-size}]\$ (или \$[0, \text{list-size}-1]\$, если вы выберете иметь 0-индексированные входные списки).
  • Вы можете предположить, что все входные списки будут либо действительным перетасованным списком, либо отсортированным списком, который не перетасовывается (в этом случае выходные данные будут [1,2,3,4,5,6,7,8,9] ).
  • Вы можете предположить, что список ввода будет содержать как минимум три значения.

Пошаговый пример:

Вход: [1,6,2,7,3,8,4,9,5]

Если однажды его перетасовать, то получится: [1,8,6,4,2,9,7,5,3] , because every even 0-indexed item comes first [1,9,8,7,6,5,4,3,2] , а затем все нечетные элементы с нулевым индексом после этого [ ,3, ,7, ,2, ,6, ] .
Список еще не упорядочен, поэтому продолжаем:

Повторное перетасовывание списка становится: [1, ,5, ,9, ,4, ,8]
Опять становится: [1,5,9,4,8,3,7,2,6]
Затем: [1,3,5,7,9,2,4,6,8]
И наконец: 0 , which is an ordered list, so we're done unshuffling.

Мы перетасовали оригинал 1 five times to get to [1,6,2,7,3,8,4,9,5,10] , поэтому вывод [1,6,2,7,3,8,4,9,5,10] in this case.

Общие правила:

  • Это , поэтому побеждает самый короткий ответ в байтах.
    Не позволяйте языкам код-гольфа отговаривать вас от публикации ответов на языках, не связанных с код-гольфом. Постарайтесь дать как можно более короткий ответ для «любого» языка программирования.
  • Применяются стандартные правила за ваш ответ с правила ввода-вывода по умолчанию, поэтому вам разрешено использовать STDIN/STDOUT, функции/методы с соответствующими параметрами и типом возвращаемого значения, полные программы. Ваш звонок.
  • Лазейки по умолчанию запрещены.
  • Если возможно, добавьте ссылку с тестом вашего кода (т. ТИО).
  • Кроме того, настоятельно рекомендуется добавить объяснение вашего ответа.

Тестовые случаи:

[1,2,3,4,5,6,7,8,9,10]

#код-гольф #код-гольф #число #массив #целое число

User_Sem


Рег
06 Dec, 2008

Тем
63

Постов
203

Баллов
558
  • 26, Oct 2024
  • #2

JavaScript (ES6), 44 байта

Более короткая версия, предложенная @nwellnhof

Ожидается, что на входе будет колода с картами с индексом 1.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 f=lambda x:x[1]-2and 1+f(x[::2]+x[1::2])  # 1-based
f=lambda x:x[1]-1and 1+f(x[::2]+x[1::2])  # 0-based
 

Попробуйте онлайн!

Учитывая колоду \$[c_0,\ldots,c_{L-1}]\$ длины \$L\$, мы определяем:

$$x_n=\begin{дела}

2^n\bmod L&\text{если }L\text{ нечетно}\\


2^n\bmod (L-1)&\text{если }L\text{ четно}\\

\end{cases}$$

ü≈:☻‼X?┌ùß♦▲▬á

И мы ищем \$n\$ такой, что \$c_{x_n}=2\$.

JavaScript (ES6), 57 52 50 байт

Ожидает на входе колоду с картами с индексом 0.

Попробуйте онлайн!

Как?

Поскольку в JS отсутствует встроенная поддержка извлечения фрагментов массива с настраиваемым шагом, имитация всей этой перетасовки, вероятно, будет довольно дорогостоящей (но, честно говоря, я даже не пытался). Однако решение можно найти и просто посмотрев на 2-ю карту и общее количество карт в колоде.

Учитывая колоду длиной \$L\$, этот код ищет \$n\$ такой, что:

$$c_2\equiv\left(\frac{k+1}{2}\right)^n\pmod k$$

где \$c_2\$ — вторая карта, а \$k\$ определяется как:$$k=\begin{дела}

ÅÎÍ©ÒßUñÏu :Implicit input of integer array U Å :Slice the first element off U Î :Get the first element Í :Subtract from 2 © :Logical AND with Ò : Negation of bitwise NOT of ß : A recursive call to the programme with input Uñ : U sorted Ï : By 0-based indices u : Modulo 2

L&\text{если }L\text{ нечетно}\\

L-1&\text{если }L\text{ четно}\\ \end{cases}$$.

 

Алё-на


Рег
12 Apr, 2012

Тем
90

Постов
187

Баллов
677
  • 26, Oct 2024
  • #4
Желе $j

байты

Попробуйте онлайн!

Как?

APL (Диалог Юникод)

$i

¹

байты

СБКСПопробуйте онлайн!

L?SIb0hys%L2>Bb1 L function y(b) ? if... SIb the Invariant b == sort(b) holds 0 return 0 h otherwise increment... y ...the return of a recursive call with: B the current argument "bifurcated", an array of: b - the original argument > 1 - same with the head popped off L map... % 2 ...take only every 2nd value in each array s and concat them back together

Спасибо Адаму за помощь, Эрику Аутгольфисту за -3 и ngn за -1.

Ссылка TIO содержит два тестовых примера. Q for 0.

Объяснение:

 

Tomaorgagma78


Рег
25 Oct, 2024

Тем
76

Постов
190

Баллов
600
  • 26, Oct 2024
  • #7

Java (JDK)

, 59 байт

Попробуйте онлайн!

Кредиты

-8 байт благодаряКевин Круйссен

. (Предыдущий алгоритм с использованием массива)

a

-5 байт благодаря

Арно

 

Perez.zhiv


Рег
29 Nov, 2019

Тем
68

Постов
222

Баллов
592
  • 26, Oct 2024
  • #8

Перл 6

c=0;While[Sort[a]!=a,a=a[[1;;-1;;2]]~Join~a[[2;;-1;;2]];c++];c ||answer||

, 36 34 32 байта-2 байта благодаря nwellnhof

map{push@{$_%2},$_}0..$#F;++$\,@F=@F[@0,@1]while"@F"ne"@{[1..@F]}"}{

Попробуйте онлайн!

Обратный рифф тасует путем сортировки по индексу по модулю 2 до тех пор, пока список не будет отсортирован, а затем возвращает длину последовательности.

-pa ||answer||

Забавно, обычно я не использую рекурсивный подход для Perl 6, но на этот раз он оказался короче оригинала.Объяснение:

05AB1E (устаревший)

function s(l),x=max(l);find(find(l==2)==1+mod(2.^(1:x),x-1))*(l(2)~=2)

, 9 байт

Попробуйте онлайн!

Объяснение

n=t;while 2~=n[2]do n={}for a=1,#t*2,2 do x=a-#t n[#n+1]=t[a]or t[x+x%2]end;t=n

Дж, 28 26 байт

-2 байта спасибо Ионе!

param($a)for(;$a[1]-2){$n++;$t=@{};$a|%{$t[$j++%2]+=,$_};$a=$t.0+$t.1;$j=0}+$n

Попробуйте онлайн!

Вдохновлен решением Вена APL.

Объяснение:К (нгн/к)

s=scan();u=sort(s);k=0;while(any(s[seq(u)]!=u)){k=k+1;s=as.vector(matrix(s,,2,T))};k

, 25 байт

Спасибо ngn за советы и за его K-интерпретатор!

Попробуйте онлайн!

matrix()

 

Ravenous


Рег
29 Jan, 2005

Тем
86

Постов
186

Баллов
636
  • 26, Oct 2024
  • #10

APL(NARS), символов 49, байтов 98

зачем использовать в самом глубоком цикле один алгоритм, который должен быть nlog(n), когда мы можем использовать один линейный n? всего на несколько байт больше?

[⍵≡⍵[⍋⍵] O(nlog n) и сопоставление каждого элемента для просмотра в порядке с использованием ∧/¯1↓⍵≤1⌽⍵ O(n)]test:Руби

t()

, 42 байта

Попробуйте онлайн!

Как:

Найдите номер 2 внутри массива: если он находится на второй позиции, колода не была перетасована, в противном случае проверьте позиции, в которые его поместили бы последовательные перетасовки.

 

Наталия2907


Рег
07 Jul, 2011

Тем
80

Постов
200

Баллов
610
  • 26, Oct 2024
  • #12
s=scan();u=sort(s);k=0;while(any(u[seq(s)]!=s)){k=k+1;u=as.vector(t(matrix(u,,2)))};k

C (GCC) 64 63 байта

-1 байт от nwellnhof

Это значительно более короткий ответ, основанный на ответах Арно и Оливье Грегуара. Я оставлю свое старое решение ниже, поскольку оно решает несколько более общую проблему колод с несоприкасающимися картами.

Попробуйте онлайн a[999],b[999],i,r,o; //pre-declare variables f(c,v)int*v;{ //argument list for(r=0;o=1;++r){ //major loop, reset o (ordered) to true at beginning, increment number of shuffles at end for(i=c;i--;(i&1?b:a)[i/2]=v[i]) //loop through v, split into halves a/b as we go o=(v[i]>v[i-1]|!i)&o; //if out of order set o (ordered) to false if(o) //if ordered return r; //return number of shuffles //note that i==-1 at this point for(i+=o=c+1;i--;)//set i=c and o=c+1, loop through v v[i]=i<o/2?a[i]:b[i-o/2];//set first half of v to a, second half to b } } we start with a sorted vector a[999],b[999],i,r,o;f(c,v)int*v;{for(r=0;o=1;++r){for(i=c;i--;(i&1?b:a)[i/2]=v[i])o=(v[i]>v[i-1]|!i)&o;if(o)return r;for(i+=o=c+1;i--;)v[i]=i<o/2?a[i]:b[i-o/2];}} C (GCC) 162 байта i,r;f(c,v)int*v;{for(i=r=1;v[i]>2;++r)i=i*2%(c-1|1);return~-r;} . This gives warnings (but shuffle counts are still correct) for odd lengths of input due to folding an odd-length vector into a 2-column matrix; in that case, in R, missing data point is filled by recycling of the first element of input.

Попробуйте онлайн

Р, 85 байт x=scan();i=0;while(any(x>sort(x))){x=c(x[y<-seq(x)%%2>0],x[!y]);i=i+1};i , however, ordering is f=->d,r=1{d[r]<3?0:1+f[d,r*2%(1|~-d.max)]} Попробуйте онлайн. f←{0{∧/¯1↓⍵≤1⌽⍵:⍺⋄(⍺+1)∇⍵[d],⍵[i∼d←↑¨i⊂⍨2∣i←⍳≢⍵]}⍵} f ,1 0 f 1 2 3 0 f 1,9,8,7,6,5,4,3,2,10 3 f 1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20 17 appears in {0{∧/¯1↓⍵≤1⌽⍵:⍺⋄(⍺+1)∇⍵[d],⍵[i∼d←↑¨i⊂⍨2∣i←⍳≢⍵]}⍵} .

ОбъяснениеГлупый метод (грубая сила), гораздо менее элегантный, чем использование карты №2.

L↑S≠ŀ¡ȯΣTC2

Вместо того, чтобы перетасовывать входные данные

что мы постепенно перетасовываем, пока он не станет идентичен

Цикл никогда не завершится, если мы предоставим вектор, который невозможно перетасовать.Приложение: вы экономите один байт, если вместо этого перетасовываете. В отличие от ответа выше, нет необходимости транспонировать с помощью

вот почему Р, 84 байта Попробуйте онлайн!.

 

Dyavol666


Рег
10 Jan, 2014

Тем
65

Постов
202

Баллов
557
  • 26, Oct 2024
  • #13
PowerShell.

{#1_{~2=x@1}{x@<2!!#x}\x}

, 116 114 108 84 78 байт

-24 байта благодаря

Эрик Аутгольфист's

^: ^:a: while (2<1{]) the 1-st (zero-indexed) element is greater than 2 ( ) do the following and keep the intermediate results i.@# make a list form 0 to len-1 2| find modulo 2 of each element /: sort the argument according the list of 0's and 1's 1 }. drop the first row of the result #@ and take the length (how many rows -> steps)

решение

-6 байт благодаря

сумасшедший

1#@}.(\:2|#\)^:(2<1{])^:a:

Попробуйте онлайн!

 

Sanjaysurarani


Рег
28 May, 2016

Тем
77

Постов
163

Баллов
558
  • 26, Oct 2024
  • #14

Луа (LuaJIT)

, 119 96 79 байт

  • Попробуйте онлайн! 2 7 3 8 4 9 5 10]
 

Cute


Рег
19 May, 2005

Тем
69

Постов
195

Баллов
570
  • 26, Oct 2024
  • #15
2 9 7 5 3 10]
  • МАТЛАБ, 70 байт 2 10]
  • объяснение: 2 6 10]
  • при каждом n-м перетасовке 2 будет перемещаться на n^2 индексов вниз от предыдущей позиции, завершаясь при достижении последней позиции. Это означает, что функция для index(n) равна

    Используя это, я нахожу индекс, где находится 2, и нахожу, какая степень 2 находится в массиве. Эта мощность соответствует количеству тасовок. Чтобы учесть 0 перетасовок, все это умножается на логическое значение l(2)~=2, чтобы гарантировать, что возвращается 0, когда 2 находится в правильном месте, что происходит только для неперетасованного массива.

     

    Serg_90


    Рег
    26 Feb, 2008

    Тем
    61

    Постов
    214

    Баллов
    539
    • 26, Oct 2024
    • #16

    Перл 5 [ # ] # loop until ā # the 1-indexed enumeration of the current list D Q # equals a copy of the current list ι˜ # while false, uninterleave the current list and flatten N # push the iteration index N as output , 77 68 bytes

    [DāQ#ι˜]N

    Попробуйте онлайн!

     

    Dovnar.1960


    Рег
    24 Nov, 2019

    Тем
    97

    Постов
    215

    Баллов
    740
    • 26, Oct 2024
    • #17

    Язык Wolfram (Математика), 62 байта

    $!={.[1]-2&&$!(.sort:{$++%2})+1} $!={ } # Assign the anonymous code block to $! .[1]-2&& # While the list is not sorted $!( ) # Recursively call the function on .sort:{$++%2} # It sorted by the parity of each index +1 # And return the number of shuffles

    Попробуйте онлайн!

    Объяснение

    Список ввода $!={.[1]-2&&$!(.sort:{$++%2})+1} . It is unriffled and compared with the sorted list until they match.

     

    Detectiarve


    Рег
    26 Sep, 2013

    Тем
    82

    Постов
    220

    Баллов
    660
    • 26, Oct 2024
    • #19

    Пиф, 18 байт

    a->{int c=0;for(;a[(1<<c)%(a.length-1|1)]>2;)c++;return c;}

    Попробуйте онлайн!

    -2 спасибо @Erik the Outgolfer.

    Скрипт состоит из двух строк: первая определяет функцию 2**n % k , the second line calls {(.[(2 X**^$_)X%$_-1+|1]...2)-1} с неявным FALSE (evaluated stdin) argument.

    a=scan();while(a[2]>2)a=matrix(a,,2,F<-F+1);F

    ¹

     

    Lyoka07


    Рег
    23 Jun, 2007

    Тем
    85

    Постов
    196

    Баллов
    631
    • 26, Oct 2024
    • #20

    PowerShell, 62 71 70 66 байт

    +9 байт при добавлении тестовых примеров с четным числом элементов.

    -1 байт со знаками.

    -4 байта: оберните выражение с помощью {⍵≡⍳≢⍵:0⋄1+∇⍵[⍒2|⍳⍴⍵]} {⍵≡⍳≢⍵:0⋄1+∇⍵[⍒2|⍳⍴⍵]} ⍝ function takes one argument: ⍵, the array ⍵≡⍳≢⍵ ⍝ if the array is sorted: ⍵≡⍳≢⍵ ⍝ array = 1..length(array) :0 ⍝ then return 0 ⋄ ⍝ otherwise 1+ ⍝ increment ∇ ⍝ the value of the recursive call with this argument: ⍵[ ] ⍝ index into the argument with these indexes: ⍳⍴⍵ ⍝ - generate a range from 1 up to the size of ⍵ 2| ⍝ - %2: generate a binary mask like [1 0 1 0 1 0] ⍒ ⍝ - grade (sorts but returns indexes instead of values), so we have the indexes of all the 1s first, then the 0s. , {⍵≡⍳≢⍵:0⋄1+∇⍵[⍒2|⍳⍴⍵]} в новую сферу.

    ŒœẎ$ƬiṢ’ - Link: list of integers A Ƭ - collect up until results are no longer unique... $ - last two links as a monad: Œœ - odds & evens i.e. [a,b,c,d,...] -> [[a,c,...],[b,d,...]] Ẏ - tighten -> [a,c,...,b,d,...] Ṣ - sort A i - first (1-indexed) index of sorted A in collected shuffles ’ - decrement

    Попробуйте онлайн!

     

    ELesejafpeaxyfqy


    Рег
    24 Jul, 2017

    Тем
    93

    Постов
    211

    Баллов
    686
    • 26, Oct 2024
    • #21

    Michael59rus


    Рег
    09 Jul, 2009

    Тем
    69

    Постов
    218

    Баллов
    583
    Тем
    403,760
    Комментарии
    400,028
    Опыт
    2,418,908

    Интересно