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


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 байт. Не гольфуйте його, якщо ви не можете точно наполовину його довжини!
Rohan Jhunjhunwala

Спочатку я пропустив замітку про пробіли, більшість моїх редакторів налаштовані на те, щоб відрізати їх, і я не міг зрозуміти, чому це не працює! Завжди раді бачити 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;
}}

Блін, я збирався додати C ++ один

4
+1 за наявність ,_,у коді.
Р. Кап


12

05AB1E, 45 байт

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

Спробуйте в Інтернеті


3
Отримує свій голос за те, що я такий короткий.
jseals

Не впевнений, чи вже G-loop був у версії серпня 2016 року, але якщо він був, то Lvможе бути Gі те, і інше yможе бути Nдля -1 байта.
Кевін Кройсейсен

12

V , 57, 53 49 байт

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

Оскільки це містить недруковані символи, ось шістнадцятковий набір:

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

Цікаві виходи для входів 0та нижче.
Р. Кап

Цей код також не працює input > 10. На стороні записки, я випадково зламав його повністю з введенням 0 41c14. Не впевнений, чи зламав я код, чи бігун.
Брендон Анзалді

1
@ R.Kap Так, я думаю, я знаю, чому це робиться. V ледве може зрозуміти цілі числа, тому він просто бачить -1рядок, на який він не може зробити вигляд, що це число. На щастя, мені з цим не вдається.
DJMcMayhem

1
@BrandonAnzaldi О, я розумію, чому це не працює. Я це виправлю за хвилину. Крім того, будь-що, крім десяткового числа, може спричинити деякі дивні проблеми.
DJMcMayhem

1
Так! Прохолодний розчин. Зрозуміло, що це, ймовірно, буде дещо просто виправити. Я був просто дуже-дуже зачарований результатом вищезгаданого випадкового розмивання клавіатури. Провідні простори також дають забавний вихід. Здається, ти дуже непогано вийшов!
Брендон Анзалді

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, але не можу ...
Дада,

@Dada Дякую! Оновлено, високо оцінено!
Дом Гастінгс

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 за використання сиру. Ви можете використовувати буквальний новий рядок для збереження байтів
Downgoat


6

Пітон 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]

Кожен із них неявно перевіряє, чи слід додати голову вправо чи вліво і розмістити її належним чином.


Використовуйте #перед заголовком у редакторі розмітки, щоб відформатувати його, як і інші відповіді.
TheBikingViking

вибачення - так відредаговано
користувач5957401

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

Скрипка



@PatrickRoberts дякую, не знав, що це, це сервер sql 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функцію. Спробую і пограти в цей гольф більше, наскільки я можу.

C It Online! (Ідеон)


Як не дивно, третя і четверта черепахи здаються зламаними на Ideone ...
Квентін

@Quentin Власне, це не Ideone. У цьому моя вина. Чомусь хвилинний вхід наближається 17і далі, логіка чомусь порушується, а отже, так роблять і черепахи. Зараз я намагаюся з’ясувати, що не так.
Р. Кап

Приємно! Зауважте, що ви можете замінити більшість символьних літералів ( 'c') їх кодом ASCII, щоб пощадити по одному символу кожен :)
Квентін

@Quentin Nice? ... Це працює не дуже добре. Як це приємно?
Р. Кап

Ой! Я знову перевірив 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):"";}

Безголівки:

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) : "";
        }

    }

}

Запусти! (Ідеон)

Я припускав, що добре виключити визначення класу з підрахунку байтів.

Мені, можливо, вдасться трохи побільшити це, змінивши порядок ітерації петлі (побудова від нижньої черепашки вгору) та / або перейшовши повністю рекурсивно, як деякі інші відповіді.

Зауважте, що для себе: Java дійсно не вистачає вбудованої стенограми для повторення n символів ...



4

Пітон, 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

Безголівки:

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

Голови були важкі.


Замість цього ('o','')[b]можна зробити 'o'*(1-b)'o'*bдля ('o','')[1-b]).
Mego

@mego о так, я змінив це на порожнє, що працює. Дякую!
greyShift

'0'*-~-1коротше'0'*(1-b)
Зруйнований лимон

і - ~ i коротше, ніж (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

Спробуйте в Інтернеті.


3

CJam , 88 байт

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

Створює найбільшу черепаху спочатку (бо інакше на чому б стояла кожна інша черепаха?), А потім поступово зменшує розмір, поки не зробиться найменша. Працює для будь-якого цілого числа, що перевищує 0.

Спробуйте в Інтернеті!


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 байти, зберігаючи підкреслення як змінну



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)

EDIT

Потужний 25 26 9 байт гольфу завдяки фантастичним порадам від руйнівного кавуна. Дуже дякую! Подумайте, що це може бути найкоротша відповідь 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)

(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, якщо непарне) з поточного числа рядків.

Інакше математика індексу є достатньою для отримання правильних _і підрахунків, включаючи лічильник відставання у формі $i++, а тепер лише єдиний список індексу, щоб поставити голову на правильну сторону.


@mazzy Не може бути пробілів, але я змінив його на 5 байт, дякую
Veskah

1
Вибачте :) 85 байт
маззи

@mazzy Подвійний баг, вкладаючи ще більше роботи. Гарні речі
Веска

1
Це все :) 84 байти
маззи

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.