Черепахи всю дорогу вниз

74

Напишите программу или функцию, которая принимает положительное целое число и печатает или возвращает стопку из этого множества черепах в стиле ASCII , где каждая черепаха больше, чем та, что над ней.

В частности, если входные данные 1, выходные данные должны быть:

 __
/,,\o

Если ввод 2:

  __
o/,,\
 ____
/,__,\o

Если ввод 3:

   __
  /,,\o
  ____
o/,__,\
 ______
/,____,\o

Если ввод 4:

    __
  o/,,\
   ____
  /,__,\o
  ______
o/,____,\
 ________
/,______,\o

Если ввод 5:

     __
    /,,\o
    ____
  o/,__,\
   ______
  /,____,\o
  ________
o/,______,\
 __________
/,________,\o

И так далее по той же схеме для больших входов.

Обратите внимание, что:

  • Голова oнижней черепахи всегда справа. Головы черепах выше чередуются взад и вперед.
  • Никакие строки не могут иметь завершающие пробелы.
  • Лишние пробелы не допускаются. (то есть задняя часть нижней черепахи должна быть в начале линии.)
  • Допускается один дополнительный завершающий перевод строки.

Самый короткий код в байтах побеждает.

Кальвин Хобби
источник
11
Трихоплакс, я ожидаю ответ, который использует рекурсию.
El'endia Starman
15
,________,Когда кто-то говорит что-то бессмысленное.
Р. Кап
8
Перевернуть стороны, чтобы убедиться, что каждая черепаха, смотрящая вверх или вниз, видит задницу?
Основное
15
Я рад, что вы указали ASCII черепах. В противном случае я собирался, наконец, отправить ответ с логотипом, где мне не нужно было тратить 3 байта, чтобы спрятать черепаху.
GuitarPicker
4
Мне нравятся черепахи!
Scotty.NET

Ответы:

31

Пакетный, 256 байт

@set i=echo 
@%i%off
set u=
for /l %%j in (2,2,%1)do call set i=%%i%%  
set/af=%1^&1
if %f%==1 %i% __&%i%/,,\o&set u=__
for /l %%j in (2,2,%1)do call:l
exit/b
:l
set i=%i:~0,-2%
%i%  _%u%_
%i%o/,%u%,\
%i% __%u%__
%i%/,_%u%_,\o
set u=__%u%__

Обратите внимание, что в строке 1 есть завершающий пробел, а в строке 4 два пробела. iпоэтому содержит echoкоманду с соответствующим количеством отступов для каждой черепахи. Между тем uсодержит количество подчеркиваний в альтернативных черепах. Ведущая нечетная черепаха имеет специальный корпус, а затем остальные черепахи выводятся парами.

Нил
источник
25
+1 для того, чтобы быть точно 256 байтов. Не играйте в гольф, если вы не можете точно половину его длины!
Рохан Джхунджхунвала
Первоначально я пропустил заметку о конечных пробелах, большинство моих редакторов настроены отбирать их, и я не мог понять, почему это не работает! Всегда рад видеть Batch на PPCG. :)
Капитан Мэн
24

C, 131 байт

i,j;f(n){char _[3*n];memset(_,95,3*n);for(i=n;i--;printf("%*.*s\n%*s/,%.*s,\\%s\n",j+n+1,j+j,_,i,"o"+1-i%2,j+j-2,_,"o"+i%2))j=n-i;}

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

Определяет функцию, которая печатает черепах.

Значительно злоупотребляет спецификаторами ширины и точности printf, чтобы получить интервал и повторение подчеркивания. Каждая черепаха печатается с использованием одного printfвызова:

printf("%*.*s\n%*s/,%.*s,\\%s\n",j+n+1,j+j,_,i,"o"+1-i%2,j+j-2,_,"o"+i%2)

У меня также есть другая версия размером 144 байта с удаленными пробелами:

c,i;f(n){for(i=n;i--;){
    char*p=" _\n o/,_,\\o\n";
    int C[]={i+1,c=n+n-i-i,1,i&~1,i%2,1,1,c-2,1,1,1-i%2,1};
    for(c=0;p[c];)C[c]--?putchar(p[c]):++c;
}}
orlp
источник
Блин, я собирался добавить C ++
4
+1 за наличие ,_,в вашем коде.
Р. Кап
14

Рубин, 100 байт

Рекурсивное решение. Попробуйте онлайн!

f=->n,i=1{f[n-1,i+1]if n>1;puts' '*i+?_*n*2,"%#{i-1}s/,#{?_*2*~-n},\\"%(i<2?'':'o '[i%2])+' o'[i%2]}
Значение чернил
источник
12

05AB1E, 45 байт

Lvð¹y-©>ׄ__y×UXJ,„/,X¨¨„,\J'o®ÉiìëJ}ð®®É-×ì,

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

Emigna
источник
3
Получает мой голос за то, что так коротка.
Jseals
Не уверен, что G-loop уже был в версии августа 2016 года, но если это так, то Lvможет быть, Gи оба yмогут иметь значение N-1 байт.
Кевин Круйссен,
12

V , 57, 53 49 байтов

i ³_
/,_,\oÀñHyjí_/___
ëPhjI ñdjí___
òkk$x^PXkk

Поскольку это содержит непечатаемые символы, вот hexdump:

00000000: 6920 b35f 0a2f 2c5f 2c5c 6f1b c0f1 4879  i ._./,_,\o...Hy
00000010: 6aed 5f2f 5f5f 5f0a eb50 1668 6a49 20f1  j._/___..P.hjI .
00000020: 646a ed5f 5f5f 0af2 6b6b 2478 5e50 586b  dj.___..kk$x^PXk
00000030: 6b                                       k

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

Объяснение:

i ³_\n/,_,\o<esc>       "Insert the original turtle with one extra underscore

Àñ                      "Arg1 times:
  Hyj                   "  Go the the beginning of the file, and yank a turtle
     í_/___             "  Extend the lenght of every turtle by two
ëP                      "  Move to the beginning of the file again, and paste the turtle we yanked
  <C-v>hjI              "  Move this turtle one to the right
           ñ            "Stop looping.

dj                      "Delete a turtle (since we have one too many)
  í___                  "Make every turtle shorter (since they are all too long)

ò                       "Recursively:
 kk                     "  Move up two lines
   $x                   "  Delete the last character on this line (an 'o')
     ^P                 "  And paste this 'o' at the beginning of the line
       X                "  Remove one space
        kk              "  Move up two lines again
DJMcMayhem
источник
Интересные выводы для входов 0и ниже.
Р. Кап
Этот код также не работает для input > 10. На заметку, я случайно сломал его полностью с помощью ввода 0 41c14. Не уверен, что я нарушил код или бегуна.
Брэндон Анзальди
1
@ R.Kap Да, думаю, я знаю, почему это так. V едва способен понимать целые числа, поэтому он просто видит -1строку, которую он не может представить как число. К счастью, я не должен справляться с этим.
DJMcMayhem
1
@BrandonAnzaldi Ах, я понимаю, почему это не работает. Я исправлю это через минуту. Кроме того, выполнение чего-либо кроме десятичного числа обязательно вызовет некоторые странные проблемы.
DJMcMayhem
1
Ага! Классное решение. Я подумал, что это, вероятно, будет несколько просто исправить. Я был просто очень, очень очарован выходом вышеупомянутой случайной клавиатуры. Лидирующие пробелы также дают интересный результат. Похоже, вы очень хорошо спорили с V!
Брэндон Анзальди
11

Perl, 92 байта

91 байт код +1 для -n.

Требуется -Eбез каких-либо дополнительных затрат.

for$i(1..$_){say$"x$_._,$v=_ x(--$i*2),_.$/.$"x(--$_-1),$_%2?o:$"x!!$_,"/,$v,\\",$_%2?"":o}

использование

perl -nE 'for$i(1..$_){say$"x$_._,$v=_ x(--$i*2),_.$/.$"x(--$_-1),$_%2?o:$"x!!$_,"/,$v,\\",$_%2?"":o}' <<< 3
   __
  /,,\o
  ____
o/,__,\
 ______
/,____,\o

Спасибо @Dada за -9 байт с его переделкой!

Дом Гастингс
источник
1
Хороший. Другая версия, та же bytecount perl -nE 'for$i(1..$_){say$"x$_._.($v=_ x(($i-1)*2))._.$/.$"x(--$_-1).($_%2?o:$_?$":"")."/,$v,\\".($_%2?"":o)}'. Я тоже пытался попасть под 100, но не смог ...
Дада
@ Дада Спасибо! Обновлено, высоко ценится!
Дом Гастингс
10

Чеддер , 105 байт

n->(|>n).map(i->(1-i%2)*"o"+"\\,"+(n-i-1)*"__"+",/"+i%2*"o"+i/2*"  "+"\n"+(n-i)*"__"+(i+1)*" ").vfuse.rev
Дрянная Монахиня
источник
2
+1 за использование сыра. Вы можете использовать буквальный
перевод
6

Python 2, 116 байт

m=input()
for i in range(m):r=m-i;b=r%2;h='o';a='__';u=i*a;s=' '*r;print s+u+a+'\n'+s[:b-2]+h*-~-b+"/,"+u+",\\"+b*h
Навин Арун
источник
Я получил ваш счет в 115 байтов, и вы можете сохранить один байт, используя lambda m:for i in r...вместоinput()
wnnmaw
6

R 150 байт

a=function(x,y=1){d=x-y;t=d%%2;cat(rep(" ",d+1),rep("_",2*y),"\n",rep(" ",d-t),"o"[t],"/,",rep("_",2*y-2),",\\","o"[!t],"\n",sep="");if(y<x)a(x,y+1)}

более чисто (добавляет байт)

a=function(x,y=1){
     d=x-y
     t=d%%2
     cat(rep(" ",d+1),rep("_",2*y),"\n",rep(" ",d-t),"o"[t],"/,",rep("_",2*y-2),",\\","o"[!t],"\n",sep="")
     if(y<x)a(x,y+1)
}

Базовая структура рекурсивно вызывает себя - сообщая себе и последний номер, который нужно вызвать, и текущий уровень. Начинается со значения по умолчанию для y = 1, поэтому для первоначального вызова требуется только одна переменная. Быстро определяет два значения, которые часто используются. Затем он просто повторяет все необходимое количество раз.

"o"[t],"o"[!t]

Каждый из них неявно проверяет, добавлять ли голову вправо или влево и размещать ее соответствующим образом.

user5957401
источник
Используйте #перед заголовком в редакторе уценки, чтобы отформатировать его, как и другие ответы.
TheBikingViking
извинения - отредактировано
user5957401
6

TSQL, 189 байт

Теперь с принятием ввода - благодаря @PatrickRoberts

DECLARE @i INT=##i##,@ INT=0a:PRINT SPACE(@i-@)+REPLICATE('__',@+1)+'
'+SPACE((@i-@-1)/2*2)+IIF((@i-@-1)%2=1,'o/,','/,')+REPLICATE('__',@)+IIF((@i-@-1)%2=0,',\o',',\')SET
@+=1IF @i>@ GOTO a

скрипка

t-clausen.dk
источник
@PatrickRoberts спасибо, не знал, что это SQL Server 2016?
t-clausen.dk
@ t-clausen.dk Этот механизм ввода специфичен для сайта data.SE, он не является стандартной функцией любой версии SQL.
BradC
@BradC вы абсолютно правы, это какой-то язык программирования, и очень приятно наконец-то добавить возможность ввода параметров. Я забыл все об этом, и я буду использовать его в будущем, оплачивая дополнительные байты
t-clausen.dk
6

C, 328 238 234 215 байт:

B;M(w,j,R){j=w;if(j<=B){char b[j*2-1],k[j*2+1];b[j*2-2]=k[j*2]=0;memset(b,95,j*2-2);memset(k,95,j*2);R=(B+1-j)%2;printf("%*s\n%*s/,%s,\\%s\n",j*2+B+1-j,k,B-j,R?"":"o",b,R?"o":"");j++;M(j);}}main(){scanf("%d",&B);M(1);}

Рекурсивная реализация, использующая большое количество форматирования строк и встроенную memsetфункцию. Постараюсь играть в гольф со временем как можно больше.

С онлайн! (Ideone)

Р. Кап
источник
Как ни странно, третьи и четвертые черепахи кажутся сломанными на Идеоне ...
Квентин
@Quentin На самом деле это не Ideone. Это вина моей программы. По какой-то причине минутный ввод приближается 17и дальше, логика ломается по какой-то причине, и поэтому, как и черепахи. Я сейчас пытаюсь выяснить, что не так.
Р. Кап
Приятно ! Обратите внимание, что вы можете заменить большинство символьных литералов ( 'c') их ASCII-кодом, чтобы сэкономить по одному символу каждый :)
Квентин,
@Quentin Хорошо? ... Это не очень хорошо работает. Как это мило?
Р. Кап
Ой! Я проверил на Ideone, и это выглядело исправленным, но это потому, что черепах меньше, конечно ... Дымное утро.
Квентин
4

Java 1,7, 238 байт

Набор из двух функций: первая выполняет итерацию по вводу (количество черепах), вторая облегчает рекурсивное построение последовательности повторяющихся символов (т. Е. Ведущие пробелы, спина и живот черепах).

String f(int n){String s="";for(int i=-1,x=-2;++i<n;){int m=(i+n)%2;s+=r(' ',n-i)+r('_',i*2+2)+"\n"+r(' ',n-i-(m==1?1:2))+(m==0?"o":"")+"/,"+r('_',x+=2)+",\\"+(m==1?"o":"")+"\n";}return s;}String r(char c,int n){return n>0?c+r(c,--n):"";}

Ungolfed:

class C {
    public static void main(String[] a) {
        System.out.println(new T().f(1));
        System.out.println(new T().f(2));
        System.out.println(new T().f(3));
        System.out.println(new T().f(4));
        System.out.println(new T().f(5));
    }

    static class T {

        String f(int n) {
            String s = "";
            for (int i = -1, x = 0; ++i < n; x+=2) {
                int m = (i + n) % 2;
                s += r(' ', n - i) + r('_', i * 2 + 2) + "\n" + r(' ', n - i - (m == 1 ? 1 : 2)) + (m == 0 ? "o" : "") + "/," + r('_', x) + ",\\" + (m == 1 ? "o" : "") + "\n";
            }
            return s;
        }

        String r(char c, int n) {
            return n > 0 ? c + r(c, --n) : "";
        }

    }

}

Запустить его!(Ideone)

Я предположил, что можно исключить определение класса из числа байтов.

Возможно, я смогу продвинуть это немного дальше, изменив порядок итераций цикла (построение снизу вверх) и / или сделав полностью рекурсивным, как некоторые другие ответы.

Примечание для себя: в Java действительно отсутствует встроенная стенография для повторения n символов ...

Миллигенри
источник
4

Python, 137 120 113 110 байт

m=input()
for i in range(m):p=m-i;b=p%2;print' '*p+'__'*-~i+'\n'+' '*(p-2+b)+'o'*-~-b+'/,'+'__'*i+',\\'+'o'*b

Ungolfed:

m=input()
for i in range(m):
  p=m-i                              // Abstract m-i for a few bytes
  b=p%2                              // Determines every other turtle from bottom

  print' '*p + '__'*-~i + '\n' +    // The top of the turtle
       ' '*(p-2+b) +                // Leading spaces (-1 for every other turtle)
       '0'*-~-b +                   // Add a leading head to every other turtle
       '/,'+'__'*i +                // Body of the turtle
       ',\\'+'0'*b                  // Add a trailing head to every other turtle

Головы были жесткими.

greyShift
источник
Вместо ('o','')[b], вы можете сделать 'o'*(1-b)'o'*bдля ('o','')[1-b]).
Mego
@ mego, хорошо, я изменил это на пустой символ, который работает. Спасибо!
greyShift
'0'*-~-1Короче'0'*(1-b)
Разрушаемый Лимон
и - ~ я короче (i + 1)
разрушаемый лимон
3

F #, 218 207 202 196 187 байт.

Побрили большинство этих байтов, добавив переменные

let R=String.replicate
let t n=let rec L i r k=if i<n then L(i+1)(R(k+i%2+1)" "+R((n-i)*2)"_"+"\n"+R k" "+R(i%2)"o"+"/,"+R(n*2-i*2-2)"_"+",\\"+R(1-i%2)"o"+"\n"+r)(k+i%2*2)else r in L 0""0

Логика бесстыдно украдена из этого ответа Python

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

asibahi
источник
3

CJam , 88 байт

ri_[S\_'_*_+N+\O\"/,"\('_*_++','\+'o]\({_[(S+\(2>\(S\+)'O^c+\(-2<\(\('o\{;O}&\;]}*]-1%N*

Сначала делает самую большую черепаху (потому что иначе на чем будет стоять любая другая черепаха?), Затем постепенно уменьшает размер, пока не будет изготовлена ​​самая маленькая. Работает на любое целое число больше 0.

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

CJ Деннис
источник
2

Python 2,7, 255 238 236 байт

Несмотря на то, что это проигрывает обоим другим решениям Python 2, мне понравился мой рекурсивный подход:

def r(s,p):
 for(a,b)in p:s=a.join(s.split(b))
 return s
def t(w):
 i='_'*2*w;s='\n __%s\n/,%s,\o'%(i,i)
 if w:s=r(t(w-1),[('\n ','\n'),('Z/',' /'),('\\Z\n','\\\n'),(' /','o/'),('\\','\\o'),('o','Z')])+s
 return s
print t(input()-1)[1:]

edit1: отбросил несколько байтов, исключив некоторые замены

edit2: побрил 2 байта, сохранив подчеркивание как переменную

Iguanodon
источник
1

Python 2,7, 139 114 113 130 байт

Мне также понравился рекурсивный подход Игуанодона, так что вот немного более короткая попытка.

def t(n):
 if n>1:t(n-1)
 a=i-n;b=(a+1)%2;print' '*(a+1)+'__'*n+'\n'+' '*(a-1+b)+'o'*(not b)+'/,'+'__'*(n-1)+',\\'+'o'*b
i=input()
t(i)

РЕДАКТИРОВАТЬ

Могучий 25 26 9 байтов в гольф благодаря фантастическим советам от Destructible Watermelon. Большое спасибо! Думаю, это может быть самый короткий ответ Python сейчас :-)

def t(n):
 if n>1:t(n-1)
 a=i-n;b=-~a%2;print' '*-~a+'__'*n+'\n'+' '*(a-1+b)+'o'*-~-b+'/,'+'__'*~-n+',\\'+'o'*b
i=input()
t(i)
ElPedro
источник
(a + 1) может быть сокращено до - ~ a, а n-1 может быть сокращено до ~ -n, а b всегда равно 0 или 1, поэтому не b можно сократить до - ~ -b, и вы можете исключить i=input();t(i)часть, потому что вам разрешено просто иметь функцию.
Разрушаемый Лимон
Человек, спасибо за отличные советы @Destructible. Также замечено, что поскольку b всегда равно 1 или 0, то 1-b работает и теряет еще 1 байт.
ElPedro
за исключением того, что для этого потребуются парены, потому что * имеет более высокий приоритет, чем двоичный - но унарный - и ~ имеет более высокий приоритет, чем *
Разрушаемый Лимон
Теперь, когда я думаю об этом, если n всегда> 0, то, если n> 1, можно сократить до ~ -n (n-1), что отрезает начальное пространство. Кроме того, опять же, (1-b) можно сократить до - ~ -b без паренов
Разрушаемый Лимон
Это становится все лучше и лучше! Я довольно новичок в этом и более привык писать читаемый код, так что ваши советы очень ценятся :)
ElPedro
1

PowerShell , 105 100 97 87 85 84 байта

-21 байт благодаря Маззи, сумасшедшему

"$args"..1|%{' '*$_--+($m='__'*$i++)+'__'
' '*($_-$_%2)+("/,$m,\o","o/,$m,\")[$_%2]}

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

Умно сдвигает переменные, используя, $_--чтобы избежать использования повторяющихся ($_+1)блоков для сохранения нескольких байтов. Он также преобразует один аргумент в строку, которая затем преобразуется в int, когда используется в диапазоне для перебора количества черепах. Самый большой трюк теперь имеет 2-й уровень шага черепахи, увеличивая только каждый второй ряд, вычитая $_%2(т.е. 0, если четный, 1, если нечетный) из текущего row_count.

В противном случае, требуется много математических индексов, чтобы получить правильные значения _и счетчики, включая счетчик лагов в форме $i++, и теперь только один индекс списка, чтобы поставить голову на правильную сторону.

Veskah
источник
@mazzy Не может быть конечных пробелов, но я изменил его на 5 байтов, спасибо
Веска
1
Извините :) 85 байтов
mazzy
@mazzy Двойной черт, вкладывая еще больше работы. Хорошие вещи
Веска
1
Это все :) 84 байта
mazzy
0

ES6 (JavaScript), 140 байт

Код

T=(i,h=0,p=1,R="repeat")=>(i>1?T(i-1,~h,p+1)+"\n":"")+" "[R](p)+'--'[R](i)+"\n"+" "[R](p-1+h)+(h?"o":"")+"/,"+'__'[R](i-1)+",\\"+(!h?"o":"")

Контрольная работа

console.log(T(5));

     --
    /,,\o
    ----
  o/,__,\
   ------
  /,____,\o
  --------
o/,______,\
 ----------
/,________,\o
дирижабль
источник