Hiperprogramlama: N + N, N × N, N ^ N hepsi bir arada


151

1'den 9'a kadar N sayısı olan bir program yazın. Onun yerli şunu yapmalıdır çıkış N + neg çıktı programınızı oluşturabilir 2N ise 1, 4N ise 2, 6N ise 3, vb.

Programda her karakter yerinde çoğaltılır zaman, o zaman bir (1'den 9'a kadar hala) N alır programı ve çıkışlar N × neg çıktı olmalıdır 1N ise 1, 4N ise 2, 9N ise 3, vb.

Programda her karakter yerinde üçlenebilir edildiğinde, o zaman (1'den 9'a kadar hala) N alır ve N ^ neg çıktı çıktılar bir program olmalıdır 1N ise 1, 4N ise 2, 27N ise 3, 387420489N ise 9, vb.

9'un üzerindeki sayılar gerekli değildir, çünkü 10 ^ 10, birçok dilin normal tamsayı aralığının dışındadır.

Örnek

İlk programınız

My_Program!
Exit();

O zaman N alabilmeli ve N + N çıkabilmelidir.

Ek olarak, program

MMyy__PPrrooggrraamm!!

EExxiitt(());;

N girmeli ve N × N çıkmalıdır.

Sonunda, program

MMMyyy___PPPrrrooogggrrraaammm!!!


EEExxxiiittt((()));;;

N almalı ve N ^ N çıktısını almalıdır.

Dört karakterli programlar ve daha fazlası gerekli değildir.

kurallar

  • Giriş ve çıkış normal, biçimlendirilmiş ondalık sayılarla düz olmalıdır. Kodunuzu göstermek için farklı bir temel kullanarak cevap verebilirsiniz, ancak sonra cevabınız rekabetçi değildir.

  • Windows kullanıcıları \r\nbir karakter gibi davranabilir , çünkü gibi şeyler \r\r\n\nanlam ifade etmeyebilir hatta belki de işe yaramaz.

  • Bayt cinsinden en kısa yerel program (N + N one) kazanır.


11
mümkün mü
Sarge Borsch

77
Bu iş bitene kadar her zaman imkansız görünüyor - Nelson Mandela
Adnan

42
@SargeBorsch Evet.
Dennis,

8
Ne yazık ki, yalnızca sınırlı miktarda dilde mümkündür.
MatthewRock

2
@ R.Kap Hayır, çok kafa karıştırıcı görünüyor.
Calvin'in Hobileri

Yanıtlar:


203

Jöle , 12 bayt

N + K

“(ẹ+)‘FQṖṪỌv

Çevrimiçi deneyin!

NxN

““((ẹẹ++))‘‘FFQQṖṖṪṪỌỌvv

Çevrimiçi deneyin!

K ^ K

“““(((ẹẹẹ+++)))‘‘‘FFFQQQṖṖṖṪṪṪỌỌỌvvv

Çevrimiçi deneyin!

Nasıl çalışır

Jöle birkaç farklı dizi hazır bilgi içerir; hepsi bir ile başlar . Değişmez birden fazla içeriyorsa , bir dize dizisi döndürülür ve dizeleri birbirinden ayırır.

Örneğin, “abc“def”verim ['abc', 'def'].

(Herhangi bir edebi son karakteri bağlı ”«»‘’nerede, «şu anda uygulanmayan olan), bir değişmezleri farklı türleri arasında seçim yapabilirsiniz. Bunun için kod noktalarına karşılık gelen Unicode karakterleri yerine Jelly kod sayfasını alıyoruz .

Örneğin, “abc“def‘verim [[97, 98, 99], [100, 101, 102]].

Programlardaki üç hazır bilgi aşağıdaki kod noktası dizilerine karşılık gelir.

“(ẹ+)‘           -> [40, 214, 43, 41]
““((ẹẹ++))‘      -> [[], [40, 40, 214, 214, 43, 43, 41, 41]]
“““(((ẹẹẹ+++)))‘ -> [[], [], [40, 40, 40, 214, 214, 214, 43, 43, 43, 41, 41, 41]]

N + K

“(ẹ+)‘FQṖṪỌv                          Main link. Argument: n

“(ẹ+)‘                                As before.
      F                               Flatten the array. Yields an integer array.
       Q                              Unique; deduplicate the integers.
                                      This yields [40, 214, 43, 41].
        Ṗ                             Pop; remove the last element.
         Ṫ                            Tail; extract the last element. 
                                      This yields 43, the Unicode code point of +.
          Ọ                           Unordinal; cast to character.
           v                          Eval; execute the character as a Jelly
                                      program with argument n.

NxN

““((ẹẹ++))‘‘FFQQṖṖṪṪỌỌvv              Main link. Argument: n

““((ẹẹ++))‘                           As before.
           ‘                          Increment all integers.
            FF                        Flatten the array. Yields an integer array.
              QQ                      Unique; deduplicate the integers.
                                      This yields [41, 215, 44, 42].
                ṖṖ                    Pop twice; remove the last two elements.
                  ṪṪ                  Tail; extract the last element.
                                      This yields 215, the Unicode code point of ×.
                    ỌỌ                Unordinal; cast to character.
                      v               Eval; execute the character as a Jelly
                                      program with argument n.
                       v              Eval; convert the return value (n×n) to a
                                      string and execute that string as a Jelly
                                      program with argument n. Since the string
                                      consists of a single integer literal, that
                                      integer is returned, ignoring the argument.

Not F, Q, , ve çiftleri, tamsayılar ve karakterler (sırasıyla) olmadan 1D diziler, diziler değiştirmez.

K ^ K

“““(((ẹẹẹ+++)))‘‘‘FFFQQQṖṖṖṪṪṪỌỌỌvvv  Main link. Argument: n

“““(((ẹẹẹ+++)))‘                      As before.
                ‘‘                    Increment all integers twice.
                  FFF                 Flatten the array. Yields an integer array.
                     QQQ              Unique; deduplicate the integers.
                                      This yields [42, 216, 45, 43].
                        ṖṖṖ           Pop thrice; remove the last three elements.
                           ṪṪṪ        Tail; extract the last element.
                                      This yields 42, the Unicode code point of *.
                              ỌỌỌ     Unordinal; cast to character.
                                 v    Eval; execute the character as a Jelly
                                      program with argument n.
                                  vv  Eval twice. See N×N.

73
Cevap bekledim, çünkü sizler burada her şeyi çözebilirsiniz, ama bu sadece gerçekten çılgınca bir şey. Sen bir ustasın ve senin görkeminden dolayı hayranım.
Nova

19
Daha önce Dennis'den bir cevap gördüğümü sanmıyorum, "hiçbir şekilde" düşünmeye başlamamla sonuçlanmıyor, daha sonra açıklamayı okuyarak yavaş yavaş bir tür tanrı olduğuna ikna olmama neden olmadı.
Magic Octopus Urn

14
Oy vermek için katıldı. Vay.
Daniel R,

4
Mümkün değil… Golf oynamak için günde kaç saat harcıyorsunuz?
tfrascaroli 13:16

16
@Falco Dennis'in gönderildiği sırada uyuyakaldığından eminim. ;)
Martin Ender

87

> <> , 41 bayt

\<
1:: :
&&* +
i*n n
c&
%:
4l
0(
.i
n}
&?

Online Deneyin: N + N , N * N , N ^ N . STDIN girişinin tam olarak bir karakter olduğunu varsayar.

> <> 2B bir dildir, bu nedenle aşağı doğru talimatlar uygularsak, kod anlambiliminin çoğunlukla değişmemesi gerçeğinden faydalanabiliriz - ortaya çıkan fazladan boş satırlar sadece işlem dışıdır. Bunun istisnası ?, değeri sıfır olan ve bir sonraki komutu atlayan koşullu trambolindir - eğer değer sıfır değilse, ekstra yeni satırlar ?eklenen no-op'lardan dolayı karışıklığa neden olur, ancak bunun ?sonuna koyabiliriz . Bir sütun ve sarma avantajı.

Hangi işlemin gerçekleştirileceğine karar vermek için, anahtar 40.IP'yi konumlandıracak olandır (4, 0). Kodun genişlemesi nedeniyle, x = 4sütun +, temel program, *iki kat program ve ^üç kat program için karşılık gelir. Ne yazık ki> <>, programın büyük kısmını yapan yerleşik bir üsteleme sahip değil.

[Setup]
\         Mirror: reflect IP direction to downwards
1&        Put 1 into the register
ic%       Push a code point of input, then take it mod 12. This maps the char '1' to the
          number 1, and so forth for '2' to '9'.
40.       Jump to (4, 0), still heading downwards

[N+N version]
:+        Duplicate then add
n         Output as number
          (Stack is now empty, so the program errors out trying to do the above again)

[N*N version]
:*        Duplicate then multiply
n         Output as number
          (Stack is now empty, so the program errors out trying to do the above again)

[N^N version]
:&*&      Multiply register by N
:l(       Push (N < length of stack + 1)
i         Push input, but since we're now at EOF this pushes -1 (stack length += 1)
}         Move -1 to the back
?<        If (N < length + 1) was 1, execute the < to move leftward. Otherwise, skip it.
          (Continue loop)

\         Mirror: reflect IP direction upwards
&n        Output register
.         Jump to (-1, N), which is invalid so the program errors out

21

TovTovTov ( Tavuk mutasyonu): 810147050 bayt

Aşağıda önerilen iki çözüm vardır: Çok sayıda bayt gerektiren soruya bir tam çözüm ve ikinci bir kısmi çözüm ( her biri farklı bir yaklaşım izleyen , yalnızca 484 bayt gerektiren yalnızca N + N ve N * N parçalarını çözme ) serin hileler kümesi! :)

1. Tam çözüm (810147050 bayt)

Kullanıldığında TovTovTov(TOV='hi',SEP=','), TOVelemanlar yerdeki karakterleri kopyalamaya karşı bağışıklık kazanır (her ikisinde "hihihi"ve "hhiihhiihhii"içinde üç "hi"s vardır ve bunların tümü, s arasında TovTovTovkaç tane TOVgöründüğü ile ilgilidir SEP).

Kullanırsak SEP=', ', tüm program karakter çoğaltmasına karşı bağışıklık kazanır (ki bu iyidir, ancak soruyu çözmez). Yani kullanıyoruz SEP=','.

Yani programı "hihihi,hi", örneğin, int diziye derler [3,1]iken,"hhiihhiihhii,,hhii" derlerken için [3,0,1]ve "hhiihhiihhii,,hhii"için [3,0,0,1]. Bu, komutların kendilerinin çoğaltma sonrası anlamlarını değiştirmeyeceği, ancak toplam uzunluk karakter çoğaltma ile değiştiği anlamına gelir. Solüsyon aşağıdaki programın uzunluğunu sorgular ve yazdırmaya karar vermek bu kullanır N+N, N*Nya da N^N.

İnts dizisi olarak önerilen tam çözüm: [6, 12, 9, 18, 9, 142, 11, 38, 8, 9, 260, 11, 73, 8, 22, 75, 7, 10, 14, 3, 1, 22, 24, 18, 15, 8, 10, 16, 3, 1, 22, 24, 18, 15, 8, 10, 45, 16, 7, 22, 3, 1, 22, 24, 18, 15, 8, 22, 3, 1, 22, 24, 18, 15, 8, 25, 3, 1, 22, 24, 18, 15, 8, 48, 3, 1, 22, 24, 18, 15, 8, 277, 3, 1, 22, 24, 18, 15, 8, 3146, 3, 1, 22, 24, 18, 15, 8, 46677, 3, 1, 22, 24, 18, 15, 8, 823564, 3, 1, 22, 24, 18, 15, 8, 16777237, 3, 1, 22, 24, 18, 15, 8, 387420510, 3, 1, 22, 24, 18, 15, 8]

Bir dizge olarak, 810147050 karakterden oluşan oldukça uzun bir program: hihihihihihi,hihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihih...

2. Sorunun yalnızca N + N ve N * N kısımlarını çözme (484 bayt)

Kullanarak TovTovTov(TOV='1',SEP=', '), bu kez SEPs kopyalamaya bağışık değil ( ",, "hala sadece bir tane var", " vardır), bu nedenle aşağıdaki önerilen çözüm, karakter çoğaltmasından sonra bile, her zaman 33 komut içerecektir:

1111, 111111111111111111111111111111111111111111111111, 1111111111, 1111111111, 1111111111, 111111, 111111111111, 111111111, 11111111111111, 111, 1, 1111111111111111111111, 111111111111111111111111, 111111111111111111, 111111111111111, 11111111, 111111111111, 1111111111111111, 111111111111111, 1111111111111111111111, 111111111111111111111111111111111111, 11, 1111111111111111111111111111, 111111, 111, 111111, 11111111111, 111111111111111111111111111, 1111, 1, 11111111, 1, 11111111

Karşılık gelen ints dizisi (sayısı TOV s ( 1aşağıdaki gibi yukarıdaki 33 komutların her biri s)) aşağıdaki gibidir:[4,48,10,10,10,6,12,9,14,3,1,22,24,18,15,8,12,16,15,22,36,2,28,6,3,6,11,27,4,1,8,1,8]

Yerinde karakterleri çoğaltma 33 listesiyle sonuçlanır tamamen farklı komutların : [8,96,20,20,20,12,24,18,28,6,2,44,48,36,30,16,24,32,30,44,72,4,56,12,6,12,22,54,8,2,16,2,16]

Orijinal ints dizisi ( N + N'yi hesaplar ) komutlar anlamlarını değiştirdikten sonra program hala mantıklı geliyor, fakat N * N'yi hesaplayacak şekilde dikkatlice tasarlandı . Örneğin, ilk ( karaktere dönüştürmek için bir sonraki kodu bir karaktere dönüştürmek için bir ascii kodu olarak kabul et) olarak anlar) karakter yinelemesinden sonra değişir , ki bu tamamen farklı bir komuttur ("Program Sayacını ilk açılan değere değiştirir) İstenilen değer hemen sonra doğru ise, ").4TovTovTov8


9

Befunge-98 , 38 bayt

vx:k:2-k*.@
20@
j3.
>^*
>:^
>:+.@

Çevrimiçi deneyin: N + N , N * N , N ^ N

Bu program kullanıma hazır değildir, çünkü yürütmenin başlangıcında yığında girdi olmasını gerektirir. İlk satırı aşağıdaki kodla değiştirerek (üç bayt ekleyerek) stdin'den girdi alacaktır (bu ne yazık ki tryitonline.net üzerinde çalışmasa da):

v
&x:k:2-

açıklama

Kurmak

v       Redirect motion downward
02j     Jump over two instructions/spaces, executing the third
        If N=1, it will skip to the 6th line
        If N=2, it will skip to the 5th line
        If N=3, it will skip to the 4th line

N = 1

>       Move right
:+.@    Duplicate, add, print and exit

N = 2

>>::^^  Move right, duplicate twice, move up
*.@     Multiply, print and exit

N = 3

>>>^^^  Redirect motion
30x     Set instruction pointer delta to (3, 0), causing it to
        move right, executing every third instruction
:k:     Duplicate the number (we'll call it M) M+1 times
        The stack is now [M]*(M+2)
2-k*    Multiply things M-1 times (`k' is a quirky instruction)
.@      Print and exit
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.