Genişletilmiş Doğruluk Makinesi


17

Birçok insan programlamada bir gerçek makinenin ne olduğunu bilir . Ama işleri bir çentik haline getirmenin zamanı geldi. Tanıtımı, genişletilmiş gerçek makine! Genişletilmiş doğruluk makinesi girdi olarak iki şeyi alır, bir tamsayı nve bir boş olmayan dize s. s nOpsiyonel sondaki boşluk ile zaman üretir . Ancak, neşit ise 0, sprogram manuel olarak durdurulana kadar çıktı almalısınız , yani hiçbir zaman sonlandırılmamalıdır.

Ayrıca, nnegatif bir sayıysa dizenin ters çevrilmesi gerekir. Örneğin s=hellove n=-1ile çıktı alınacaktır olleh.

Standart giriş yöntemleri, sonsuz işleyebildiği sürece her türlü çıktı. Sonsuz işlemeyen bir cevabınız varsa, ilginçse veya sonsuz çıktıyı işleyemeyen bir dilde yayınlamaktan çekinmeyin.

Test Durumları

n, s, output

5, "hello world", "hello worldhello worldhello worldhello worldhello world"
0, "PPCG", "PPCGPPCGPPCGPPCG..."
-2, "truThY", "YhTurtYhTurt"
2000, "o", "oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo"

Bu , bu yüzden en kısa kod kazanır!

İşte orijinal Sandbox yayını. Düzenlemeler yapıldı. Bu meydan okuma fikrini oluşturduğunuz için @ComradeSparklePony adresine teşekkürler

Yanıtlar:


3

Haskell, 57 54 bayt

f 0=cycle
f n|n<0=f(-n).reverse|n>0=concat.replicate n

Açıklama:

f 0           -- If n=0 ..
 =cycle       -- infinitely repeat the input
f n|n<0       -- Otherwise, if n<0 ..
 =f(-n)       -- call f with the negative of n ..
 .reverse     -- and the reverse of the input
 |n>0         -- Finally, if n>0 ..
 concat       -- concatenate the result of ..
 .replicate n -- repeating the input n times

@Nimi sayesinde -3 bayt


Bunun -nyerine kullanabilirsiniz abs n.
nimi


2

MATL , 37 bayt

jXJiXI0=?`1wtwDw]}I0>?I:"t]x}PI|:"t]x

Çevrimiçi deneyin!

Açıklama:

j            % input string
XJ           % copy to clipboard J
i            % input
XI           % copy to clipboard I
0            % number literal
=            % is equal? (element-wise, singleton expansion)
?            % if
  `          % do...while
    1        % number literal
    w        % swap elements in stack
    t        % duplicate elements
    w        % swap elements in stack
    D        % convert to string and display / string representation
    w        % swap elements in stack
  ]          % end
}            % else
  I          % paste from clipboard I
  0          % number literal
  >          % is greater than? (element-wise, singleton expansion)
  ?          % if
    I        % paste from clipboard I
    :        % range; vector of equally spaced values
    "        % for
      t      % duplicate elements
    ]        % end
    x        % delete
  }          % else
    P        % flip the order of elements
    I        % paste from clipboard I
    |        % absolute value / norm / determinant
    :        % range; vector of equally spaced values
    "        % for
      t      % duplicate elements
    ]        % end
    x        % delete
             % (implicit) end
             % (implicit) end
             % (implicit) convert to string and display

1

Python 3, 71 bayt

def f(n,s,k=1):
 if n<0:s=s[::-1];n=-n
 while n|k:print(end=s);n-=1;k=0

Çevrimiçi deneyin!

Değişken k, döngünün daima en az bir kez çalıştırılmasını garanti eder. Bu, eğer döngünün bir sonraki yinelemesinde negatif olursa n=0, ndöngü sonsuza kadar çalışmaya devam edeceği anlamına gelir.


1

Matlab, 87 bayt

n=input('')
s=input('','s')
a=repmat(s,1,abs(n))
while~n s=[s s]
end
if n<0,flip(a)
end

Code-golf'de ilk denemem! Golf için herhangi bir öneri bekliyoruz.


Siteye Hoşgeldiniz! :)
DJMcMayhem

1

05AB1E , 17 16 14 bayt

0‹iR}¹Ä×¹_i[²?

Çevrimiçi deneyin!

Açıklama:

0‹iR}¹Ä×¹_i[²?
0‹             Is the input negative?
  iR}          If so, reverse the second input.
     ¹Ä        Get the absolute value of the first input.
       ×       Repeat the string that many times.
        ¹_     Boolean NOT the first input. (Is the first input 0?)
          i    If so...
           [   Do forever...
            ²? Print the second input without a newline.

@EriktheOutgolfer sayesinde 2 bayt tasarruf edildi


Sen yerini alabilir '-åile 0‹ve 0Qile _.
Outgolfer Erik

@EriktheOutgolfer Teşekkürler, düzenlendi.
SparklePony Yoldaş

1

Cubix , 41 Kırk dört 45 bayt

Girdiyi şu şekilde alır <N> <String>

.uq.sB.p$IA;p?;ouu(..!q/o()uq?..@<w?q<<_)

Çevrimiçi deneyin!

Cubified:

      . u q
      . s B
      . p $
I A ; p ? ; o u u ( . .
! q / o ( ) u q ? . . @
< w ? q < < _ ) . . . .
      . . .
      . . .
      . . .

Koşarken izle

Hala birkaç bayt almak mümkün olabilir kodunda no-ops bir miktar var, ama ben kırmadan önce bu almak istedim.

Temel prosedür

  • I girişten sayaç al
  • A geri kalanı karakter olarak gir
  • ;p? alanı kaldırın, numarayı getirin ve test edin
    • psuqB$)sayaç negatifse, yığını ters çevirin. Bu, giriş numarası ve EOI işaretinin (-1) kullanılmasını içerir. Sayacı artırın.
    • ;p;ouqu sayaç sıfırsa, sayacı ve EOI işaretçisini çıkarın ve sürekli çıkış döngüsünü başlatın.
    • ( eğer pozitif düşüş sayacı
  • <<q?/o()uçıkış döngüsü. EOI işaretine (-1) ulaşılana kadar yığının her karakterini çıktılar.
  • ... _ ... ?wq! sonunda EOI işaretçisi, küp etrafında gidin ve geri yansıtmak ? şeridi değiştirin, EOI işaretleyicisini alta bırakın ve sayacı test edin.
  • @ sıfırsa dur
  • ?u( pozitif u dönüşü ve azalması durumunda, döngü döngünün başına vurur
  • ? ... <) negatifse, küpün etrafında diğer tarafa gidin, bir artıştan geçerken döngünün başına yönlendirin.
  • /)< negatif artış varsa ve çıkış döngüsüne devam ederse

dize bir sayı ile başlıyorsa bu çalışmaz mı?
Yıkılabilir Limon

@DestructibleLemon sabit
MickyT

0

JavaScript (ES6), 79 bayt

 f=(n,s)=>n<0?f(-n,[...s].reverse().join``):(alert(!n?s:s.repeat(n)),!n&&f(n,s))

Pasaj:

f=(n,s)=>n<0?f(-n,[...s].reverse().join``):(alert(!n?s:s.repeat(n)),!n&&f(n,s))

f(5, "hello world")
//f(0, "PPCG")  //uncomment this at your peril!!!
f(-2, "truThY")
f(2000, "o")


Böyle bir özyinelemeli bir şey yapmaya çalışıyordum, ama !n&&sonsuz döngü için düşünmedim . Ancak, bu sonunda bir StackOverflow vurur? it should never terminate.
Stephen

PPCG dizesini tekrar tekrar uyaracaktır. Chrome'da (en azından) tarayıcıyı durdurmak için öldürmem gerekiyor.
Rick Hitchcock

Ne demek istediğini anlıyorum. Kodumu destekleyen tarayıcılarda kuyruk çağrı özyineleme optimizasyon yararlanacağını düşünüyorum.
Rick Hitchcock

Console.log ile test edin. Bir hata alıyorum.
Stephen

Hmm, kesinlikle haklısın: (
Rick Hitchcock

0

JavaScript (ES6), 98 94 91 83 bayt

n=>s=>{s=n<0?[...s].reverse().join``:s;while(!n)l(s);l(s.repeat(n<0?-n:n))}

Arjun sayesinde -4, -5 bayt

Rick Hitchcock sayesinde -3 bayt

Java cevabından farklı başladı , ancak golf oynadıktan sonra çok benzer hale geldi. Uyarı sonsuzdur, ancak güzel görünmesini istiyorsanız, geçiş yapın console.log. l=alert;ve yazma alertaynı uzunluktadır, ancak geçiş yaparsanız console.logyeniden tanımlamak daha kısa olur.


1
while(!n)l(s)yerine if(!n)for(;;)l(s).
Arjun

2
[...s].reverse()yerines.split''.reverse()
Rick Hitchcock

@RickHitchcock Bunu daima unuturum :(
Stephen

l(s.repeat(Math.abs(n)))sonunda fordöngü yerine .
Arjun

0

QBIC , 36 bayt

Burada çok şey var ve QBIC / QBasic bu koşullarla zarif bir şekilde başa çıkmak için sözdizimine sahip değil.

~:<0|;=_fA}[abs(a)|Z=Z+A]~a|_X}{?A';

Açıklama:

~:<0|       IF cmd line arg 'a' is negative
  ;=_fA         Make cmd line arg A$ into its reverse
}           Close the IF (this eliminates the need for a | fuction terminator on _f)
[abs(a)|    FOR b = 1 to (abs(a) (hammering out negatives)
  Z=Z+A         Add A$ to Z$ (on exit, Z$ is printed explicitly)
]           NEXT
~a|_X       IF a is non-zero, terminate the program
}           END IF
{?A';       If we're here, just start a DO-loop and keep on printing the input.

0

Java (OpenJDK 8) , 137 bayt

void f(String[] a){for(long n=Long.valueOf(a[0]),i=0;n==0|i++<Math.abs(n);)System.out.print(n<0?new StringBuilder(a[1]).reverse():a[1]);}

Çevrimiçi deneyin!


Bu, topluluk mutabakatı tarafından izin verilmeyen tam bir program yerine bir pasaja benziyor .
Esolanging Fruit

Bağladığınız gönderiye göre, "Varsayılan" programlar veya işlevler "olmalıdır" . Bu nedenle, OP tam bir program istediklerini açıkça belirtmediği için cevabımı güncelledim. Şimdi bir yöntemden oluşuyor .
Bashful Beluga

0

str , 30 bayt

I#Lbd0<[_u_][d0='e'u#?]#?xo;db

Çevrimiçi deneyin!

açıklama

I#Lbd0<[_u_][d0='e'u#?]#?xo;db
...........................;      preamble
I                                 read number
 #L                               read rest of STDIN
   b                              buffer the STDIN
    d                             duplicate number
     0<[   ]           #?         if the number is less than zero
        _                         negate that number
         u_                       and reverse STDIN from buffer
            [         ]           otherwise
             d0='e  #?            if its 0, push the empty string
                  'u              otherwise, push the unbuffered STDIN untouched
                         x        repeat STDIN by the TOS
                          o       and output
                           ;..    main program (only activates when input = 0)
                            d     duplicate the implicitly unbuffered STDIN
                             b    and rebuffer it
                                  implicitly displayed

0

C (GCC) , 115 112 109 107 104 bayt

f(n,s,l,p,d)char*s;{d=n<0?-1:1;do for(l=1,p=0;p>=0;p+=l)s[p]?d==l&&putchar(s[p]):l--;while(!n||(n-=d));}

Çevrimiçi deneyin!

Kim dedi, ihtiyacımız var strlen?

C (gcc) , 115 bayt ( #include<string.h>önde 134 )

#include<string.h>
f(n,s)char*s;{int l=strlen(s),d=n<0?0:2,m=d--,p;do for(p=m?0:l-1;p!=(m?l:-1);p+=d)putchar(s[p]);while(!n||(n-=d));}

Çevrimiçi deneyin!

#include<string.h>Örtük bir prototip elde etmedenstrlen o iadeler int, ama strlenolduğu size_t(en azından günümüzde değil, mükemmel emin k & r ya C89 hakkında, ama ben inanıyorum, iade inteski günlerde).

Eksik #include <stdio.h>olan bir sorun değil, çünkü tamsayı tanıtımı nedeniyle, varsayılan prototip int putchar(int)tam olarak istediğimiz şey olacak.


0

Retina , 49 bayt

/¶-/&V`^.+
/¶0/&//+>G0`
~`(.+)¶-*(\d+)
.-$2+>K`$1

Giriş biçimi: dizeyi alır, ardından bir satırsonu gelir ve ardından sayı gelir.

Çevrimiçi deneyin!

Açıklama:

/¶-/&V`^.+

/¶-/&Sayı negatifse, yalnızca bu satırı çalışır. Vters aşamadır ve ^.+dize (. eşleşen yeni satırların dışındaki her karakterle .

/¶0/&//+>G0`

/¶0/&Sayı 0. yalnızca bu satırı çalışan //+>her yineleme sonra çalışmaya dize yazdırır sonsuz döngü başlar.G0dizeyi alır ve numarayı atar; bunu sonsuza dek yapar, her seferinde yazdırır.

~`...

Bu bir dize üretecek kodu işaretler; program dizeyi sonra Retina kodu olarak değerlendirir.

(.+)¶-*(\d+)
.-$2+>K`$1

(.+)¶-*(\d+)Bütün dizesini ve koyar grubu 1 yakalama dize ve grup 2 yakalama sayısını eşleşen .-$2+>K' $1çalıştırmak üzere retina kodu üretir: . (aksi dize basılacaktır n + 1 kez) kapalı örtülü çıkışını açar, -$2+tekrar döngü ayarlar {yakalama grubu 2} kez tekrarlanır. Başlangıçtaki eksi sayıyı negatif bir sayıya dönüştürür, çünkü bu döngüdeki yakınsama işlevini devre dışı bırakır, bu da 1. yinelemeden sonra durur. >bu döngüyü her yinelemeden sonra yazdırılacak şekilde ayarlar. Kodun geri kalanı sadece dizeyi yazdırmak içindir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.